小程序推送有两种方式:
第一种.小程序绑定公众号,用户关注公众号,公众号推送,公众号携带小程序链接,点击进入小程序
第二种.小程序订阅消息(服务通知推送)(往下拉)
第一种小程序绑定公众号:
(其实大部分都是后端,前端准备好点击消息需要跳转的url给到后端即可)
小程序openid:小程序用户的唯一id
公众号openid:公众号用户的唯一id
unionid:同一用户,对同一个微信开放平台下的不同应用,unionid是相同的
准备:
1.将小程序与公众号绑定(绑定后才可获取unionid) 官方文档:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/union-id.html
2.接入微信公众平台开发,也就是给服务号配置一下开发者服务器。当有用户关注/取消服务号时,微信服务器会推送关注/取消的事件给我们的服务器。
3.获取公众号用户列表,即所有用户的公众号openid。
4.通过公众号openid获取用户的unionid。
5.推送服务号消息。
官方文档:https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.html
注意:
1.在上述的一些接口中,需要获取access_token。小程序和公众号的access_token是不同的,需要用各自的appid和secret去获取。
2.access_token每天只能获取200次,有效期是7200秒。所以应该把它加入缓存,而不是每次都去获取新的access_token。
开始开发
将小程序用户与公众号用户关联:
小程序用户openid→unionid←公众号用户openid
要想将小程序与公众号用户关联,第一件事就是获取用户的unionid。
我们可以在两种情况下获取用户的unionid:
一、如果用户已经关注了公众号,那么在用户登录的时候,就可以获取到unionid
二、如果用户没有关注公众号,那么得让前端调用wx.getUserInfo,把加密数据给后端解密拿到unionid。
解密需要session_key,而session_key又有有效期,得注意它过期的情况。
当用户关注公众号时,微信会推送事件给我们(本文准备条件的第2条)。
通过关注事件,我们可以拿到用户的公众号openid,再获取unionid(本文准备条件的第4条)。拿到unionid后,去数据库查询这个unionid的用户,并把公众号openid保存。
但是,还有两个情况没有考虑到:
一、在我们开发之前,已经关注了公众号的用户没有去关联
解决方案:
获取微信公众号的用户列表,再依次获取用户unionid(本文准备条件的第3、4条)。注意,此操作非常耗时。
二、用户先关注了公众号,但是从来没用过小程序(数据库里没有unionid,导致无法关联)
解决方案:
新建一张表,把这个公众号用户先记录下来。当小程序用户登录时,先检查一遍这张表尝试关联。
至此,小程序用户与公众号用户就已经完成了关联。
第二种小程序订阅消息:
(目前还在调研阶段,后续联调持续更新)
前置准备:
-
appId小程序ID
-
secret小程序密钥
-
templateId模板id
-
openId 可通过服务端获取
前端:只需要调用uniapp官方的requestsubscribemessageApi, 并在成功的回调中调用服务端接口告诉服务端订阅成功即可。
-
通过uni.login 获取wxCode, 提供给服务端用作获取openId
-
获取到openId之后,调用uni.requestSubscribeMessage弹出订阅提示,并在回调中调用服务端接口。
消息分类
新版一次性订阅消息Beta
新版一次性订阅消息是一种无需用户在弹窗中主动订阅即可向用户下发消息的能力,用户的订阅方式为:
-
当用户在小程序中进行微信支付后,开发者可将微信支付订单号作为 code 向用户下发服务通知
-
开发者可在小程序中将触发服务的 button 组件的 open-type 的值设置为 liveActivity,当用户点击 button 后可获得 code ,后续可使用此 code 向用户下发服务通知
此下发方式由平台定义模版,开发者根据自身业务选择模版进行接入。
详见订阅消息接入 Beta开发指南文档。
一次性订阅消息(用户通过弹窗订阅)
一次性订阅消息用于解决用户使用小程序后,后续服务环节的通知问题。
开发者在小程序中调用 requestSubscribeMessage 接口后,将向用户展示弹窗,用户可打开自己想要接受的消息开关。用户订阅后,开发者可不限时间地下发一条对应的服务消息;每条消息可单独订阅或退订。
详见小程序订阅消息开发指南文档。
长期订阅消息(用户通过弹窗订阅)
一次性订阅消息可满足小程序的大部分服务场景需求,但线下公共服务领域存在一次性订阅无法满足的场景,如航班延误,需根据航班实时动态来多次发送消息提醒。为便于服务,我们提供了长期性订阅消息,用户订阅一次后,开发者可长期下发多条消息。
目前长期性订阅消息仅向政务民生、医疗、交通、金融、教育等线下公共服务开放,后期将逐步支持到其他线下公共服务业务。
详见小程序订阅消息开发指南文档。
1.获取模板 ID
在微信公众平台手动配置获取模板 ID: 登录 https://mp.weixin.qq.com 获取模板,如果没有合适的模板,可以申请添加新模板,审核通过后可使用。
2.获取下发权限
一次性订阅消息、长期订阅消息,详见接口 wx.requestSubscribeMessage
3.调用接口下发订阅消息
一次性订阅消息、长期订阅消息,详见服务端接口 subscribeMessage.send,次数限制:开通支付能力的小程序下发上限是3kw/日,没开通的是1kw/日
注意事项
用户勾选 “总是保持以上选择,不再询问” 之后,下次订阅调用 wx.requestSubscribeMessage 不会弹窗,保持之前的选择,修改选择需要打开小程序设置进行修改
消息订阅功能实现
在实现消息订阅功能之前,我们需要了解一些关键步骤:
请求用户订阅:首先需要向用户发起订阅请求。
处理订阅状态:根据用户的选择,处理订阅状态的变化。
发送模板消息:当订阅成功后,根据需要发送相应的模板消息。
注意事项(踩过的坑):
1.模拟器和真机的差异
1.在模拟器上面弹出来的弹窗是这个效果
在真机上面调试的效果:
一开始只看模拟器没有看真机一直找不到什么原因弹出来的弹窗和我想象的不一样,原来是真机 和模拟器有差异
2.tmplIds接收的集合,一次性订阅和长期订阅两个类型的不能同时触发
3.一定需要由用户触发,也就是一定要有按钮操作触发,不能直接调用
4.注意前后端环境要一致(容易被忽略)
5.查看你的手机的设置—通知,是否允许你的应用接收推送
6.一次性订阅消息类型的时效是7天
7.开发环境在模拟器上可以手动清除授权,但是部署到体验版和正式版是无法手动清除授权的
8.小程序右上角三个点--设置--订阅消息 可以修改是都接收订阅消息,也可以查询到哪些允许和拒绝
9.每次弹框, 只能配置最多 3 个订阅消息
10.设置里的订阅消息, 它此生的标签是 “总是保持以上选择, 不再询问”, 不管是你允许还是拒绝, 都不会在弹框里再看到
如果想要再次弹起,在第一次弹起的时候去掉勾选 “总是保持以上选择, 不再询问”
错误码:
长期订阅案例:
quickConsultation() {
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);
}
});
},
data中声明或者直接数组代替 sendMsgId
其实前端的操作很简单,就是调用这个方法,触发微信的方法,微信的方法触发你们后端的方法,后端做对应处理,难的是联调途中可能需要花费更多的时间去调整