文章有点标题党,单纯的从技术上来实现无限推送暂时是不可能的。
为什么不可能?
“推送” 在小程序官方的叫法是模板消息。先来看看官方对他的下发条件说明:
1. 支付
当用户在小程序内完成过支付行为,可允许开发者向用户在7天内推送有限条数的模板消息(1次支付可下发3条,多次支付下发条数独立,互相不影响)
2. 提交表单
当用户在小程序内发生过提交表单行为且该表单声明为要发模板消息的,开发者需要向用户提供服务时,可允许开发者向用户在7天内推送有限条数的模板消息(1次提交表单可下发1条,多次提交下发条数独立,相互不影响)
第一种“支付”的情况本人没试过,“提交表单”来实现模板消息的推送需要满足两个条件:
- 用户必须有表单提交行为,一次表单提交产生一次的推送机会。多用户之间相互独立。
- 推送机会的有效期有7天。超过则失效。
有这两个限制在就没办法通过技术手段来实现无限推送。我们只能通过其他非技术方案来实现。
先决条件
我们在项目中采用的方案是
通过关联的公众号发送推送消息
,如果用户没关注公众号,则通过短信的方式通知用户。因此这个方案需要一些先决条件:
- 需要微信开放平台、小程序、公众号3个账号,并将小程序和公众号关联到开放平台账号下。
- 在运营上和小程序上需要做些改变,要引导小程序用户关注公众号。
- 用户注册后关联手机号。
如果实际情况与上述条件不符,那么该方案并不适合您,可以不用往下看了。下面是该方案的详细说明。
为什么要通过公众号来推送?
最重要的一点是公众号推送没有7日内活跃的限制
,即:用户超过7天内没登录也能推送。
其次在体验上,小程序跟公众号结合的比较紧密,用户点击公众号的推送内容可直接跳到小程序的指定页面。这点在官方的文档上我们也能找到依据:
红框里的appid指定跳到哪个小程序,pagepath则指定了展示的页面。接口具体地址:
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277
可能需要注意的是,所有的小程序推送都会显示在“服务通知”里面(如下图),而公众号推送会单独显示在公众号里面。在展现上会有些区别。
推送流程
首先需要做些基础性工作,包括:
- 首次使用小程序时需要获取用户基本信息,以及OpenID(这里的OpenID是指小程序里的,公众号里也有OpenID,两个值不一样)、UnionID。保存到后台的数据库中,为方便后续描述,暂且叫做“小程序用户表”。
UnionID和OpenID的关系,可以查看官方文档:
https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/union-id.html
,如果设置不正确UnionID会获取不到。简单来说,用户在小程序和公众号中都可以取到OpenID和UnionID,两者的OpenID不一致,但UnionID是一致的。
- 小程序里加入表单提交,在用户进行提交时会自动生成一个formID,提交后,后台除了业务逻辑外,还要将formID保存起来,以便后续推送使用。
详情请看:
https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/template-message.html
。要注意formID只对当前用户有效,且有有效期,所以还要保存formID的生成时间。
接下来就可以推送了。步骤如下:
1、后台需要推送给用户A,那么先查找用户A对应的未过期的formID,如果找到直接通过小程序推送;如果找不到,或formID已经过期,则继续后续步骤,通过公众号推送。
2、到“小程序用户表”里取得用户A的UnionID。
3、接下来便希望用UnionID取得用户A在公众号里的OpenID(注意,这里不是小程序的OpenID)。但很遗憾公众号并没有提供UnionID反查OpenID的接口。我们只能曲线救国。
4、先将公众号的用户同步到后台的“公众号用户表”。通过该表来实现UnionID反查OpenID。同步接口:
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140840
(注意这个接口是分页获取的)。如果“公众号用户表”里反查到了,就可以调用公众号的推送接口,详情:
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277
。如果查不到,则继续步骤5。
5、如果用户A还没关注公众号,那么在步骤4中是查不到用户A在公众号的OpenID的。这样情况下,只能采用短信推送。可以直接第三方的服务,比如阿里云等,当然这会产生费用。
流程大致如此,表结构和代码如果有需要再做补充。该方案并不十分完美,会有一些先决条件,但还是希望能分享出来,供大家讨论。如果您有更好的方案,欢迎留言。