博主最近在开发小程序订阅消息,在此简单记录下遇到的问题。
1、订阅,我们调用wx.requestSubscribeMessage(Object object)的时机是用户点击或者支付回调中。在授权弹窗中,用户点击允许或者取消,在回调中我们可以拿到相应的结果:
const tmplId = '' // 模板消息ID
wx.requestSubscribeMessage({
tmplIds: [tmplId],
success (res) {
if (res[tmplId] === 'accept') {
// 用户点击【允许】
} else if (res[tmplId] === 'reject') {
// 用户点击【取消】
}
},
fail (err) {
console.log(err)
}
})
2、在授权弹窗中,最下方有一行小字【总是保持以上选择,不再提示】。如果勾选了这个,无论点击【允许】或者【取消】,订阅消息的设置都会记录在小程序的设置中。官方原话如下:
调起客户端小程序订阅消息界面,返回用户订阅消息的操作结果。当用户勾选了订阅面板中的“总是保持以上选择,不再询问”时,模板消息会被添加到用户的小程序设置页,通过 wx.getSetting 接口可获取用户对相关模板消息的订阅状态。
一旦某个订阅消息记录在小程序设置中,再去调用wx.requestSubscribeMessage(Object object)是不会出现授权弹窗的。如果我们需要知道当前订阅消息的设置做一些处理(比如隐藏订阅按钮),可以通过wx.getSetting来获取订阅状态。
wx.getSetting({
// 是否同时获取用户订阅消息的订阅状态,默认不获取。
// 注意:withSubscriptions 只返回用户勾选过订阅面板中的“总是保持以上选择,不再询问”的订阅消息。
withSubscriptions: true,
success (res) {
console.log(res.authSetting)
// res.authSetting = {
// "scope.userInfo": true,
// "scope.userLocation": true
// }
console.log(res.subscriptionsSetting)
// res.subscriptionsSetting = {
// mainSwitch: true, // 订阅消息总开关
// itemSettings: { // 每一项开关
// SYS_MSG_TYPE_INTERACTIVE: 'accept', // 小游戏系统订阅消息
// SYS_MSG_TYPE_RANK: 'accept'
// zun-LzcQyW-edafCVvzPkK4de2Rllr1fFpw2A_x0oXE: 'reject', // 普通一次性订阅消息
// ke_OZC_66gZxALLcsuI7ilCJSP2OJ2vWo2ooUPpkWrw: 'ban',
// }
// }
}
})
注意:只返回用户勾选过订阅面板中的“总是保持以上选择,不再询问”的订阅消息。所以我们只需要判断itemSettings是否有值,如果itemSettings有值的话,对应的模板消息是否有值就可以判断用户有无勾选【总是保持以上选择,不再询问】,从而决定显示或隐藏订阅按钮。
wx.getSetting({
withSubscriptions: true, // 是否同时获取用户订阅消息的订阅状态
success (res) {
const mainSwitch = res.subscriptionsSetting.mainSwitch // 订阅消息总开关
const itemSettings = res.subscriptionsSetting.itemSettings // 每一项开关(类型:对象)
// 总开关为开,且itemSettings为空或者对应模板id的值为空,则展示订阅消息引导卡片
if (mainSwitch && (!itemSettings || itemSettings && !itemSettings[tmplId])) {
// 显示或隐藏订阅按钮等逻辑操作
}
}
})
以上就是开发中遇到的问题,希望能帮到有同样问题的小伙伴~