一、方案思路
基于微信平台限制,需要用户主动单击授权之后才能获取下发消息权限,所以首先要让用户主动触发订阅,当用户在小程序内单击特定按钮后会弹出申请订阅弹窗,同意后小程序可在后续任意时间给该用户推送服务通知。
·发送订阅消息需要用户先进行授权。
·授权一次可发送一条服务通知,可以重复授权,每一次授权都会单独保存为一条记录。
·推送时间不受限制。
·用户自主选择接受,下发的权利掌握在用户手上。
·推送消息动作可以利用微搭平台已集成小程序 APIs,在控制台或者应用内可以新建 APIs(微搭 API 开放服务介绍),调用 APIs 发送订阅消息方法,即可以使用对应的小程序服务接口。
小程序 APIs 方法列表。
二、案例实践
1. 前往 微信公众平台 申请消息订阅模板,订阅消息分为一次性订阅和长期订阅,如果没有合适的模板,可以申请添加新模板,审核通过后可使用,模板添加成功后,获取模板 ID。
模板参数展示:
2. 编辑器场景搭建,在编辑器中新建组件和自定义变量、方法。
3. 自定义 JS 方法 sendMsgOuth() 获取订阅消息授权,调起订阅弹窗,涉及小程序 API wx.requestSubscribeMessage。
export default function ({ event, data }) { try { wx.requestSubscribeMessage({ tmplIds: ['6zwS1fsv19V7vqhbnq9EAVLFAs6ykWbCmzlW4HoJpC4'],//订阅消息模板ID success(res) { console.log(res) }, fail(res) { console.log(res) } }) }catch (e) { console.log(e) }}
订阅授权弹窗真机效果:
注意:说明:
注意:触发用户订阅,微信小程序提供的 API 是:wx.requestSubscribeMessage,触发条件必须是用户点击行为(bindtap 事件)或发起支付回调后才能调起订阅消息界面。当用户在小程序内点击特定按钮后会弹出申请订阅弹窗,同意后小程序可在后续任意时间给该用户推送服务通知。
4. 推送消息按钮组件绑定点用数据源方法事件。
·选择小程序开放能力 APIs 方法发送订阅消息。
·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自动触发" } }
注意:说明:
注意:data 数据内容可根据模板和实际场景进行相应调整,更多说明请参见 小程序|订阅消息。
注意:假设在应用中传递了消息内容相关变量 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 的时候,都会自动拒绝;如果选择“允许”,则每次都会自动允许授权。