如何实现小程序的无限推送

文章有点标题党,单纯的从技术上来实现无限推送暂时是不可能的。

为什么不可能?

"推送" 在小程序官方的叫法是模板消息。先来看看官方对他的下发条件说明:

1. 支付

当用户在小程序内完成过支付行为,可允许开发者向用户在7天内推送有限条数的模板消息(1次支付可下发3条,多次支付下发条数独立,互相不影响)

2. 提交表单

当用户在小程序内发生过提交表单行为且该表单声明为要发模板消息的,开发者需要向用户提供服务时,可允许开发者向用户在7天内推送有限条数的模板消息(1次提交表单可下发1条,多次提交下发条数独立,相互不影响)

第一种“支付”的情况本人没试过,“提交表单”来实现模板消息的推送需要满足两个条件:

  1. 用户必须有表单提交行为,一次表单提交产生一次的推送机会。多用户之间相互独立。
  2. 推送机会的有效期有7天。超过则失效。

有这两个限制在就没办法通过技术手段来实现无限推送。我们只能通过其他非技术方案来实现。


先决条件

我们在项目中采用的方案是通过关联的公众号发送推送消息,如果用户没关注公众号,则通过短信的方式通知用户。因此这个方案需要一些先决条件:

  1. 需要微信开放平台、小程序、公众号3个账号,并将小程序和公众号关联到开放平台账号下。
  2. 在运营上和小程序上需要做些改变,要引导小程序用户关注公众号。
  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的。这样情况下,只能采用短信推送。可以直接第三方的服务,比如阿里云等,当然这会产生费用。

 

流程大致如此,表结构和代码如果有需要再做补充。该方案并不十分完美,会有一些先决条件,但还是希望能分享出来,供大家讨论。如果您有更好的方案,欢迎留言。

 

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Netty是一个基于Java的异步事件驱动的网络应用框架,而小程序消息推送是指将消息实时推送给用户的通知服务。Netty可以通过以下步骤实现小程序消息推送: 1. 小程序客户端向服务器发起连接请求:首先,小程序客户端需要与服务器建立连接,可以使用Netty的客户端模块来实现,在请求连接时可以携带所需的信息和权限认证。 2. 服务器端接收连接并处理:服务器端需要使用Netty的服务端模块来接收客户端的连接请求,并进行相应的处理。可以采用Netty的事件处理机制来监听连接事件,一旦有新的连接建立,就可以处理相关逻辑,如消息的推送和处理。 3. 消息推送:一旦建立了连接,服务器端就可以向客户端发送消息了。Netty的Channel模块提供了丰富的消息传输方式,可以通过ChannelHandler来定义消息的处理逻辑,然后将消息推送给客户端。可以根据业务需求选择合适的消息传输方式,比如WebSocket、TCP等。 4. 异常处理:在消息推送过程中可能会出现各种异常情况,比如网络波动、连接断开等,Netty提供了丰富的异步事件处理机制和异常处理逻辑,可以及时处理这些异常,保证消息推送的可靠性和稳定性。 总的来说,Netty提供了灵活且高效的网络通信能力,可以很好地支持小程序消息推送实现。通过合理的使用Netty的各种模块和功能,可以实现小程序消息推送的即时性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值