关于小程序:小程序~订阅消息

40次阅读

共计 2403 个字符,预计需要花费 7 分钟才能阅读完成。

介绍:

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

步骤:

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: 受权信息
            <button open-type="getUserInfo"/> 等进行触发
        2.1.2: 间接调起客户端小程序设置界面
            wx.openSetting 
            点击事件触发
3: 调用接口下发订阅音讯
    服务端音讯发送接口 subscribeMessage.send

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:

<van-button @click="subscribe()" size="small" class="sub"> 订阅 </van-button>
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')
        }
    }
})


正文完
 0