> 技术文档 > 小程序订阅消息(用户通过弹窗订阅)服务号消息通知/消息推送

小程序订阅消息(用户通过弹窗订阅)服务号消息通知/消息推送

微信服务号消息推送,前端开发部分教学,代码在最后

(一)获取/设置模板 ID

在微信公众平台手动配置获取模板 ID:

(二)获取下发权限

一次性订阅消息、长期订阅消息,详见接口 wx.requestSubscribeMessage

注意:

  • 一次性模板 id 和永久模板 id 不可同时使用。
  • 低版本基础库2.4.4~2.8.3 已支持订阅消息接口调用,仅支持传入一个一次性 tmplId / 永久 tmplId。
  • 2.8.2 版本开始,用户发生点击行为或者发起支付回调后,才可以调起订阅消息界面。
  • 2.10.0 版本开始,开发版和体验版小程序将禁止使用模板消息 formId。
  • 一次授权调用里,每个tmplId对应的模板标题不能存在相同的,若出现相同的,只保留一个。
  • 2.10.0 版本开始,支持订阅语音消息提醒,详情

设备订阅消息,详见接口 wx.requestSubscribeDeviceMessage

(三)调用接口下发订阅消息

一次性订阅消息、长期订阅消息,详见服务端接口 subscribeMessage.send,次数限制:开通支付能力的小程序下发上限是3kw/日,没开通的是1kw/日。

设备订阅消息,详见服务端接口 hardwareDevice.send

消息订阅功能实现

在实现消息订阅功能之前,我们需要了解一些关键步骤:

请求用户订阅:首先需要向用户发起订阅请求。

处理订阅状态:根据用户的选择,处理订阅状态的变化。

发送模板消息:当订阅成功后,根据需要发送相应的模板消息。

注意事项

  • 用户勾选 “总是保持以上选择,不再询问” 之后,下次订阅调用 wx.requestSubscribeMessage 不会弹窗,保持之前的选择,修改选择需要打开小程序设置进行修改。
  • 真机和微信开发工具有差异

  • tmplIds接收的集合,一次性订阅和长期订阅两个类型的不能同时触发

  • 一定需要由用户触发,也就是一定要有按钮操作触发,不能直接调用

  • 注意前后端环境要一致(容易被忽略)

  • 查看你的手机的设置—通知,是否允许你的应用接收推送

  • 一次性订阅消息类型的时效是7天

  • 每次弹框, 只能配置最多 3 个订阅消息

  • 开发环境在模拟器上可以手动清除授权,但是部署到体验版和正式版是无法手动清除授权的

  • 小程序右上角三个点--设置--订阅消息 可以修改是都接收订阅消息,也可以查询到哪些允许和拒绝

原生开发代码:

 getAuth() { return new Promise((resolve, reject) => { const tmplId = \"写自己的模板id\"; wx.getSetting({ // 获取用户的当前设置。返回值中只会出现小程序已经向用户请求过的权限 withSubscriptions: true, success: (res) => { if (res.subscriptionsSetting.mainSwitch) { if (res.subscriptionsSetting.itemSettings != null) {  const moIdState1 = res.subscriptionsSetting.itemSettings[tmplId];  if (!moIdState1 || moIdState1 !== \"accept\") { this._subscribeMessage(tmplId, resolve, reject);  } else { // 已订阅 resolve({ status: \"already_subscribed\" });  } } else {  this._subscribeMessage(tmplId, resolve, reject); } } else { // 引导用户去设置里面开启订阅功能 wx.showModal({  title: \"提示\",  content: \"请先去小程序设置里面打开订阅通知!\",  showCancel: false,  complete: () => { reject(new Error(\"mainSwitch is off\"));  }, }); } }, fail: (error) => { reject(error); }, }); }); }, _subscribeMessage(tmplId, resolve, reject) { wx.requestSubscribeMessage({ tmplIds: [tmplId], success(res) { // console.log(\"订阅消息 成功 \", res); resolve(res); }, fail(er) { // console.log(\"订阅消息 失败 \", er); reject(er); }, }); },

uniapp:

_subscribeMessage() {uni.requestSubscribeMessage({tmplIds: this.sendMsgId,success: (resMsg) => {console.log(\"提交订单消息推送\", resMsg)if (this.sendMsgId && this.sendMsgId.length) {this.sendMsgId.forEach((item, index) => {if (resMsg[item] === \'accept\') {// 用户同意订阅该模板console.log(\'提交订单用户同意订阅该模板\', item);}if (resMsg[item] === \'reject\') {// 用户拒绝订阅该模板console.log(\'提交订单用户拒绝订阅该模板\', item);}})}},fail: (err) => {console.error(\'订阅消息失败\', err);}});},