小程序~订阅消息

介绍:

消息能力是小程序能力中的重要组成,我们为开发者提供了订阅消息能力,以便实现服务的闭环和更优的体验
* 订阅消息推送位置: 服务通知
* 消息订阅下发条件: 用户自主订阅
* 订阅消息卡片跳转能力: 点击查看详情页可跳转到小程序的页面

步骤:

1: 获取模版ID
    登录 [https://mp.weixin.qq.com](https://mp.weixin.qq.com/) 获取模板,如果没有合适的模板,可以申请添加新模板,审核通过后可使用。
    模版受限于小程序的类型的
2: 获取下发权限
    小程序端消息订阅接口 wx.requestSubscribeMessage
    * 一次性订阅&永久性订阅模版Id不能同时使用
    * 订阅列表接口中的tmplIds, 必须为用户未订阅的内容, 如果为数组则显示订阅列表
    * 如果用户的订阅总开关是关闭的,即mainSwitch为false
    2.1: 可获取用户对相关模板消息的订阅状态
        wx.getSetting
        * 获取用户已经订阅过消息
        * 获取服务端订阅消息的模版Id -> restful -> array
        * 对比服务器已有的消息模版 -> globalData
        * 用户未开启订阅消息 -> return
        * 用户开启订阅消息 -> 未设置任何订阅消息
        * 用户开启订阅消息 -> 已经有了部分设置 -> reject、accept
        2.1.1: 授权信息
            

web: 订阅状态?

import { getSubIds } from '/login/api'
async getSettings () {
    const result = await getSubIds()
    let arra = []
    if (result.code === 200) {
        arr = result.data
    }
    wx.getSetting({
        withSubscriptions: true,
        success: res => {
            const app = getApp()
            app.globalData.subscriptionsSetting = res.subscriptionsSetting
            const keys = res.subscriptionsSetting.itemSettings
            if (!res.subscriptionsSetting.mainSwitch) {
                return
            }
            if (!keys) {
                app.globalData.tmplIds = arr
            } else {
                const keysArr = Object.keys(arr)
                app.globalData.tmplIds = arr.filter(item => keysAr.indexOf(item) === -1)
            }
            等待用户的订阅 -> requestSubscribeMessage
        }
    })
}

test page subscription:

订阅
subscribe () {
    if (!this.isLogin) {
        return
    }
    const arr = [
        '3icSr0YIBLcMSYXchHBTWgCiAAom4lrkJqZAf2pVc',
        'xVA_zdzgM8zPtpDOO92rpK9kQumz4O84E7sTy9Ihfds',
        'sG80CJj2GvArifGRCWOJhumIyY5mQnM94RWGQkdctGc'
    ]
    const tmplIds = getApp().globalData.tmplIds.filter(item -> arr.indexOF(item) !== -1)
    wx.requestSubscribeMessage({
        tmplIds: tmplIds,
        success: res => {
            if (res) {
                // 过滤已经订阅过的id
                getApp().globalData.tmplIds = getApp().globalData.tmplIds
                    .filter(
                        (item) => {
                        // 过滤掉已经订阅了的ids,保留未订阅未设置的ID
                        return Object.keys(res).indexOf(item) === -1
                    }
                )
            }
        }
    })
}

服务端:

accessToken 定时更新机制
    import { CronJob } from 'cron'
    import { wxGetAccessToken } from './wxUtils'
    const job = new CronJon('* 55 */1 * * *', () => {
        // 1h 55 minutes
        wxGetAccessToken()
    })
    job.start()
消息推送
   export const wxSendMessage = async (options) => {
    const accessToken = await  wxGetAccessToken()
    try{
        const result = await axios.post(`https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=${accessToken}`, { ...options })
        return result
    } catch (error) {
        logger.error(`wxSendMessage Error: ${error.message}`)
    }
   }

test login message:

await wxSendMessage ({
    touser: openId,
    template_id: 'xxxxxxxxx', // 模版id
    data: {
        name1: {
            value: name // 用户名
        },
        date2: {
            value: moment().format('YYYY-MM-DD hh:mm:dd')
        }
    }
})


你可能感兴趣的:(小程序)