使用场景
订阅消息是为了召回用户以及推送消息提醒,例如外卖小程序的订单派送消息、电商小程序的支付提醒、物流消息、媒体类小程序的实时热点、话题推送等场景,在日常生活中订阅率都是比较高的。
方案思路
基于微信平台限制,需要用户主动单击授权之后才能获取下发消息权限,所以首先要让用户主动触发订阅,当用户在小程序内单击特定按钮后会弹出申请订阅弹窗,同意后小程序可在后续任意时间给该用户推送服务通知。
发送订阅消息需要用户先进行授权。
授权一次可发送一条服务通知,可以重复授权,每一次授权都会单独保存为一条记录。
推送时间不受限制。
用户自主选择接受,下发的权利掌握在用户手上。
推送消息动作可以利用微搭平台已集成小程序 APIs,在控制台或者应用内可以新建 APIs(微搭 API 开放服务介绍),调用 APIs 发送订阅消息方法,即可以使用对应的小程序服务接口。


小程序 APIs 方法列表。


案例实践
1. 前往 微信公众平台 申请消息订阅模板,订阅消息分为一次性订阅和长期订阅,如果没有合适的模板,可以申请添加新模板,审核通过后可使用,模板添加成功后,获取模板 ID。


模板参数展示:


2. 编辑器场景搭建,在编辑器中新建组件和自定义变量、方法。


3. 自定义 Js 方法
sendMsgOuth()
获取订阅消息授权,调起订阅弹窗,涉及小程序 API wx.requestSubscribeMessage。export default function ({ event, data }) {try {wx.requestSubscribeMessage({tmplIds: ['6zwS1fsv19V7vqhbnq9EAVLFAs6ykWbCmzlW4HoJpC4'],//订阅消息模板IDsuccess(res) {console.log(res)},fail(res) {console.log(res)}})}catch (e) {console.log(e)}}
订阅授权弹窗真机效果:


说明:
触发用户订阅,微信小程序提供的 API 是:wx.requestSubscribeMessage,触发条件必须是用户点击行为(bindtap 事件)或发起支付回调后才能调起订阅消息界面。当用户在小程序内点击特定按钮后会弹出申请订阅弹窗,同意后小程序可在后续任意时间给该用户推送服务通知。
发送订阅消息需要用户先进行授权。
授权一次可发送一条服务通知,可以重复授权,每一次授权都会单独保存为一条记录。
推送时间不受限制。
用户自主选择接受,下发的权利掌握在用户手上。
4. 推送消息按钮组件绑定点用数据源方法事件。
选择小程序开放能力 APIs 方法发送订阅消息。


APIs 方法发送订阅消息相关展示。


根据此次实践消息模板 ID,参数模板内容
data
数据格式如下:{"date1": {"value": $w.DateText($w.Now(), 'YYYY-MM-DD HH:mm')},"character_string3": {"value": "192.168.x.x"},"thing4": {"value": "文档更新"} ,"thing7": {"value": "新增文档3篇"},"thing6": {"value": "weda自动触发"}}
说明:
假设在应用中传递了消息内容相关变量
var1 , var2 , var3 , var4 , var5
,则 data 数据格式如下:{"date1": {"value": var1},"character_string3": {"value": var2},"thing4": {"value": var3} ,"thing7": {"value": var4},"thing6": {"value": var5}}
当前用户
openid
可以通过微搭内置方法 $w.auth.currentUser.openId
进行获取,订阅消息返回结果赋值自定义变量 sendMsgResult
,在组件上进行展示。

真机效果
绑定小程序,发布当前应用。


效果预览:
获取用户订阅消息授权,推送消息。


订阅消息服务通知。


注意事项
调起客户端小程序订阅消息界面
wx.requestSubscribeMessage
一次调用最多可订阅 3 条消息,即 tmplIds 最多为 3 个(iOS 客户端 7.0.6 版本、Android 客户端 7.0.7 之后版本支持)。一次性模板 ID 和永久模板 ID 不可同时使用。
一次授权调用里,每个 tmplId 对应的模板标题不能存在相同的,若出现相同的,只保留一个。
用户发生点击行为或者发起支付回调后,才可以调起订阅消息界面。
当用户勾选了“总是保持以上选择”时,那么将再也不会唤起这个弹窗。同时,如果选择“拒绝”,那么以后每次调用这个 API 的时候,都会自动拒绝;如果选择“允许”,则每次都会自动允许授权。

