发布日期:
2020-12-29
更新日期:
2021-10-04
文章字数:
1.4k
阅读时长:
4 分
阅读次数:
小程序推送通知方式(订阅消息&消息模板)
小程序发送小程序的订阅消息(推送到服务通知)
- 准备1:登录小程序-功能-订阅消息(未开通的,需要先开通)-从模板库中添加消息模板并获得模板ID(也可以申请消息模板)
- 步骤:
- 获取下发权限 (用户发生点击行为或者发起支付回调后)— 调用接口下发订阅消息
- 获取js_code
- 根据js_code获取OpenId和UnionID
- 获取小程序access_token
- 根据access_token调用接口下发订阅消息
- 参考的开发文档
-获取下发权限
-调用接口下发订阅消息小程序调用公众号的消息模板(推送到微信公众号)
- 准备1:注册微信开放平台,将微信公众号和小程序绑定到微信开放平台(目的:获取UnionID)
- 准备2:微信公众号添加消息模板功能,从模板库中添加消息模板并获得模板ID,也可以申请模板
- 步骤:(根据用户唯一的UnionID去寻找用户在公众号的OpenId,再根据微信公众号的OpenId发送通知到相应的用户)
- 批量获取微信公众号关注的用户Openid
- 根据用户Openid获取微信公众号关注的用户UnionID
- 将微信公众号关注的用户Openid、UnionID保存到数据库
- 两种方式获取小程序用户UnionID
- 根据js_code获取小程序的OpenId和UnionID
- 根据小程序的OpenId、access_token获取用户信息UserInfo,根据UserInfo的encryptedData字段解密出小程序的UnionID(不推荐)
- 根据小程序appid、secret获取小程序access_token
- 根据小程序的UnionID去数据库匹配用户在公众号的OpenId
- 根据用户在公众号的OpenId、access_token发送消息模板到对应用户
- 参考的开发文档
下发统一服务消息(官方不支持了)
- 下发小程序和公众号统一的服务消息(需要填小程序模板id和公众号模板id)
小程序消息模板(已废弃)
预备知识:
- 小程序openid:小程序用户的唯一id
- 公众号openid:公众号用户的唯一id
- unionid:同一用户,对同一个微信开放平台下的不同应用,unionid是相同的
- 准备:
- 将小程序与公众号绑定(绑定后才可获取unionid),官方文档:小程序与公众号绑定获取unionid
- 接入微信公众平台开发,也就是给服务号配置一下开发者服务器。当有用户关注/取消服务号时,微信服务器会推送关注/取消的事件给我们的服务器。官方文档:接入微信公众平台开发
- 获取公众号用户列表,即所有用户的公众号openid。官方文档:获取公众号用户列表
- 通过公众号openid获取用户的unionid。官方文档:通过公众号openid获取unionid
- 推送服务号消息。官方文档:公众号发送模版消息
- 在上述的一些接口中,需要获取access_token。小程序和公众号的access_token是不同的,需要用各自的appid和secret去获取。
- 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,导致无法关联)
- 解决方案:
- 新建一张表,把这个公众号用户先记录下来。当小程序用户登录时,先检查一遍这张表尝试关联。