注意事项
- 一次性模板 id 和永久模板 id 不可同时使用。
- 低版本基础库2.4.4~2.8.3 已支持订阅消息接口调用,仅支持传入一个一次性 tmplId / 永久 tmplId。
- 2.8.2 版本开始,用户发生点击行为或者发起支付回调后,才可以调起订阅消息界面。
- 2.10.0 版本开始,开发版和体验版小游戏将禁止使用模板消息 fomrId。
- 使用前建议阅读 小游戏订阅消息使用指引。
- 一次授权调用里,每个tmplId对应的模板标题不能存在相同的,若出现相同的,只保留一个。
使用方法
wx.requestSubscribeMessage({
tmplIds: ['模板id'],
success (res) {
console.log(res)
res === {
errMsg: "requestSubscribeMessage:ok",
"zun-LzcQyW-edafCVvzPkK4de2Rllr1fFpw2A_x0oXE": "accept"
}
}
})
requestSubscribeMessage:fail can only be invoked by user TAP gesture.
如何造成这个问题的原因:
setTimeout(() => {
wx.requestSubscribeMessage({
tmplIds: ['模板id'],
success (res) {
console.log(res)
res === {
errMsg: "requestSubscribeMessage:ok",
"zun-LzcQyW-edafCVvzPkK4de2Rllr1fFpw2A_x0oXE": "accept"
}
}
})
}, 1000);
这个代码看似没有问题,但是事实上requestSubscribeMessage
这个API是不支持异步操作的,官方文档也没有虽然官网文档没有说明,但调用wx.requestSubscribeMessage
授权之前是不能有异步操作的,否则会报错,提示你授权不是通过bindtap
事件触发的
如何解决这个问题?
只能通过使用 Promise
将其他异步任务转换为同步任务,否则你的订阅消息界面是不会出现,甚至也会报错
这里是我封装的服务通知,尽量都使用Promise
,这样会规避很多的大坑~~
// 小程序服务通知
static weappInform=(tmplIds)=>{
return new Promise((resolve, reject)=>{
wx.requestSubscribeMessage({
tmplIds,
success: res => {
resolve(res)
},fail:(res)=>{
reject(res)
}
})})
}