最近一段时间刚好接触到微信小程序的订阅消息,摸索了好久终于搞清楚它到底是怎么样的一个机制了,特此发表本文以帮助大家去理解和集成小程序订阅消息
1、关于订阅消息的官方文档链接:https://developers.weixin.qq.com/miniprogram/dev/api/open-api/subscribe-message/wx.requestSubscribeMessage.html
2、当需要使用小程序的订阅消息的时候,需要先前往小程序管理后台去新增你的模板,所提供的公共模板是根据小程序在注册的时候所选的行业而来的,为满足用户自定义的需求,微信官方提供了“申请模板”的功能(在申请前最好先确认下公共模板库中是否已经有了对应的模板,如果存在的话,则无法审核通过),如下图所示
3、添加完成后,在我的模板可以看到各模板的id,这些id就是在用户订阅的时候需要作为参数传递进去的。具体如上图马赛克部分所示
4、当选择好对应的模板消息之后,可调用”wx.requestSubscribeMessage(Object object)”方法对需要对应的消息进行订阅操作,如下图所示可一次订阅多条消息,官方的限制是3条。为了解决这个限制,可以如下图将每一条区分开来,同时也让用户能够更清晰的了解自己到底要订阅什么消息
5、接下来对上图做一个说明: 订阅消息的意思:用户订阅了某条消息,服务器才可以针对这条消息进行推送。具体的订阅如下图所示
当用户点击某个订阅按钮,实际是调用”wx.requestSubscribeMessage(Object object)”方法,就会出现如上图所示弹窗。当用户勾选了“总是保持以上选择,不再询问”的时候或者在设置订阅消息的页面关闭了通知,则不会出现该弹窗,如下图未选中的状态所示:
6、此时问题就出现了,如下图瑞幸咖啡小程序所示:
其实当用户勾选了“总是保持以上选择,不再询问”并不是就可以一直通知用户了,而是不再弹窗罢了。
7、此时另外一个问题来了,在用户点击订阅按钮并同意之后,小程序并不会告诉你用户究竟订阅(点击)了多少次,需要这个次数得我们自己进行维护。
8、然后针对订阅消息,在顶部有一个总开关,可以控制全部订阅消息的通知与否。当用户关闭的时候就不会收到通知了。此处还有另外一个问题就是总开关在开启的情况下,用户是可以针对某一条订阅消息进行关闭的,如下图中未选中的“审核结果通知”所示,此时就算用户开启了总开关,但单条订阅消息未开启的情况下,针对该条订阅消息的通知也是没办法收到的。所以这个状态也是需要我们进行维护的。
9、此处还有一点比较坑,那就是用户针对某一条订阅消息开启了通知并且订阅(点击)了很多次,然后在设置页面将该条消息关闭了,然后再次重新开启的时候,之前订阅的次数将会变为0,也就是说用户之前辛苦订阅的次数将会消失,所以需要特别提醒用户。
10、然后针对每个小程序账号,可以发送订阅消息的次数是有限的,详情如下图所示:
所以说我们更应该自己来控制用户针对订阅消息的开关状态了,如果用户明明未开启通知,你还进行通知的话,小程序接口不仅会报错,还会浪费通知次数(此处待验证,因为给的额度实在有点高)
11、针对以上问题以及参考网友的文章https://developers.weixin.qq.com/community/develop/article/doc/0008802e8381e0eeabb92c9975b013 我做了如下的界面及提升
- 通过接口获取我在数据库配置的全部的订阅消息
- 针对每一条消息追加一个订阅+1的按钮,每当点击一次且用户同意的时候我将该条记录推送到服务器将用户的订阅次数+1
- 然后当用户进入到设置页面操作了总开关(开启或关闭)以及针对特定订阅消息进行了操作的时候(开启或关闭),都推送到服务器保存到数据库,然后在需要推送的时候查询下用户是否开启了总开关以及针对特定消息是否开启了开关(对应订阅此时是否为0),如果都开启了则在推送成功之后将对应的次数进行减1一操作
- 若用户针对特定订阅消息订阅了多次,然后关闭后再次开启订阅消息的时候,我会调用服务器将对应的订阅次数置为0,因为此时调用推送的话也是不会成功的
最终结论: 依据你的业务场景,如果你的某个订阅消息(如新订单)需要多次的进行推送,此时就需要用户进行多次的订阅,当订阅次数用完用户没有继续订阅的话,则新的订阅消息是会发送失败的(也就是在用户小程序端是没有任何通知的)。 若你的业务场景下某个订阅消息只需要推送一次,那么让用户点击一次就可以了。 如果用户开启了订阅消息的总开关,但是针对某条信息进行了关闭,此时该条消息也是收不到的 还有一种场景:用户针对A订阅消息订阅了10次,此时用户去到设置页面针对A订阅消息进行了关闭,然后再开启的情况下,用户之前的订阅(10次)将失效,也就是需要用户重新订阅
小程序前端页面代码已上传至码云,欢迎各位下载使用。(其中网络请求部分需要各位进行补充,含对应数据库文件):https://gitee.com/hppwz/wechat_program_subscription_message
B站教程: https://space.bilibili.com/317440371/channel/detail?cid=113755
注意:
- 其中的网络请求部分已被我删除,需自行编写对应的网络请求
- 为了保证效果,我的代码还是修改为了用户点击一次请求一次网络。否则,当用户长时间停留在订阅消息设置页面的时候,此处服务器端发送了很多的订阅消息给该用户,当该用户返回的时候直接将当前页面各个消息的订阅次数更新到了服务器,就会导致于实际不符。
- 在订阅消息总开关开启的情况下,用户也是可以针对某一条订阅信息进行关闭操作,所以需要将每一条订阅消息的开关状态上传到服务器