小程序如何完成订阅
- 参考相关文档
- 实践
- 问题处理
- 授权弹窗不再触发
- 引导用户重新授权
参考相关文档
微信小程序实现订阅消息推送的实现步骤
发送订阅消息
小程序订阅消息(用户通过弹窗订阅)开发指南
实践
我们需要先选这一个模板,具体流程参考官方的操作。然后这个模板ID就是前后端所需要的重要数据啦。
我们在获取到模板id之后,现在需要弹出订阅弹窗让用户完成订阅,查看上面官方文档中可以知道,我们需要用户触发uni.requestSubscribeMessage这个方法。那我们可以是用弹窗,或者操作按钮来达到这个目的。我们这里是采用的进入页面之后就弹窗(各人按需调整)
subscribeMessage() {
let tmplId = 'XXXXXXXXXXXXX';
uni.showModal({
title: '提示',
content: '邀请您订阅消息',
editable: false,
confirmText: '同意',
cancelText: '拒绝',
placeholderText: '',
success: function (res) {
console.log('success', res);
if (res.confirm) {
//调用订阅
// 添加用户授权操作 uniapp封装了uni.requestSubscribeMessage接口
uni.requestSubscribeMessage({
tmplIds: [tmplId],
success(res) {
console.log('success', res);
}
});
} else if (res.cancel) {
console.log('用户点击取消');
}
}
});
},
我们这里使用的是弹窗点击同意之后我们去调用uni.requestSubscribeMessage这个方法,可以唤起授权弹窗。
我们点击允许之后就订阅成功了,然后后端同事通过获取到用户的openid,就可以给用户发送对应的模板消息了。
问题处理
授权弹窗不再触发
我们第一次进入小程序,点击同意之后进行授权弹窗唤起,我们选择允许或拒绝。重新刷新页面加载,这一次点击同意,并没有如愿的唤起订阅授权了。
这是怎么回事呢?
观察操作细节,如果我们没有勾选(总是保持以上选择),那么每一次重新进入小程序会正常升起订阅授权的弹窗,但是一旦我们勾选了就不会再升起订阅授权的弹窗。
经过查询文档我们发现,勾选了之后(总是保持以上选择)之后,订阅授权弹窗就不再唤起,如果我们还需要用户再次授权怎么办呢?
引导用户重新授权
那我们需要先使用uni.getSetting(方法查询一下用户的订阅状态,如果发现用户勾选了(总是保持以上选择),根据业务需求,我们可以重新指引用户打开授权,uni.openSetting(这个操作也需要用户点击之后才能触发)。用户可以在这里重新打开授权。
showMessage() {
let that = this;
let tmplId = 'XXXXXXXXXXXXXX';
uni.getSetting({
withSubscriptions: true,
success(res) {
console.log(res);
if (res.subscriptionsSetting.mainSwitch) {
// 用户打开了订阅消息总开关
if (res.subscriptionsSetting.itemSettings) {
// 用户同意总是保持是否推送消息的选择, 这里表示以后不会再拉起推送消息的授权
let moIdState = res.subscriptionsSetting.itemSettings[tmplId]; // 用户同意的消息模板id
if (moIdState === 'accept') {
// 同意了消息推送
} else if (moIdState === 'reject') {
console.log('拒绝了消息推送');
//引导用户重新打开授权
uni.showModal({
title: '提示',
content: '用户已关闭订阅授权,是否重新打开订阅授权',
editable: false,
confirmText: '同意',
cancelText: '拒绝',
placeholderText: '',
success: function (res) {
if (res.confirm) {
uni.openSetting({
withSubscriptions: true,
}
}
});
} else if (moIdState === 'ban') {
uni.showToast({
title: '已被后台封禁'
});
}
} else {
// 开始订阅
that.subscribeMessage();
}
} else {
// 总开关已关闭清空下,是否重新打开授权
uni.showModal({
title: '提示',
content: '用户已关闭订阅授权,是否重新打开订阅授权',
editable: false,
confirmText: '同意',
cancelText: '拒绝',
placeholderText: '',
success: function (res) {
if (res.confirm) {
uni.openSetting({
withSubscriptions: true,
});
}
}
});
}
}
});
},