微信小程序 实现模板消息群发、发送给指定用户

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了微信小程序 实现模板消息群发、发送给指定用户相关的知识,希望对你有一定的参考价值。

参考技术A 最近在做一款拼课类小程序,大概需求就是分享课程页面给好友,好友参与达到一定数量后则拼课成功。

按理说很平常的需求,微信公众号里边应该很容易实现,但是想在小程序里边实现这么个功能却有点蛋疼了。

为什么小程序实现起来比较费劲呢,那就要说下小程序发送模板消息的机制了,先看文档怎么说:

划重点, 本人 、 交互 ,也就是说这个模板消息,必须由用户手动来触发,你想后台定时给用户推个消息,洗洗睡吧你。
再来看下面:

这个重点你们自己划吧,发模板消息必须满足这两种情况中的一种,支付就不说了,用户付款后可以推送几条消息,重点是这个 表单提交 。
意思就是我想给用户发个模板消息,第一要搞个表单,第二要让用户来提交这个表单(获取formId),而且这个模板消息还只能发给提交表单的用户本人,你想发给别的用户,呵呵。

好了,说多了都是气,既然这样设计,也是有一定道理,但是道理都是讲给守规矩的人听的,至于不守规矩的,喂!说的就是你。
通过上面的分析我们知道,想发送一个基本的模板消息需要以下步骤:

模板消息接口 POST https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=ACCESS_TOKEN 有这么几个参数 :

前面扯了一堆概念,下面我们来把这个功能具体的实现一遍吧,我这里后台用的是php laravel,原理都一样。

我这只写一个例子,一看就明白

有些时候用户操作频繁,可能会导致服务器收到大量请求,所以可以优化下,把formId先存到一个全局变量里边(数组),当达到一定数量后统一发给后台来保存。这块可以灵活运用。

服务端的实现也就两个功能, 收集 和 发送 。
假设我们现在有这么一个类FormIdCollection,可以收集(save)和获取(get)某个openid的formId,那我们给前台暴露的api只需要简单的调用下就可以了,至于发消息,也只需要get一个formId,即可。

下面是FormIdCollection类的一个具体实现,基于laravel(说实话,挺好用的),另外引入了一个微信开发包 overtrue/wechat (这里主要是用来发模板消息、有点大材小用了), https://www.easywechat.com/

我已经封装了一个laravel扩展包,感兴趣的朋友可以上github上看下 https://github.com/laravuel/laravel-wfc 。
至于非框架的php实现,小伙伴可以帮忙弄下。

微信小程序模板消息群发解决思路

基于微信的通知渠道,微信为开发者提供了可以高效触达用户的模板消息能力,以便实现服务的闭环并提供更佳的体验。(微信6.5.2及以上版本支持模板功能。低于该版本将无法收到模板消息。)

模板推送位置:服务通知(点击查看详情还能跳转到下发消息的小程序的指定页面)

 

模板下发条件:用户本人在微信体系内与页面有交互行为后触发

微信小程序模板消息使用说明(官方文档):https://mp.weixin.qq.com/debug/wxadoc/dev/api/notice.html

为了防止对模板消息的滥用,带来不好的用户体验,小程序对模板消息推送做了相应的限制。

下发条件说明(触发模板消息下发的两个场景):

  1. 支付

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

  2. 提交表单

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

  也就是说,用户提交一次表单,会提供给开发者一次推送权限,多次提交的情况下下发条数独立。所以如果开发者想要哎7天内无限制的为用户推送消息,需要做的就是-->从用户那里获取足够多的推送权限(推送权限就是form表单的formid)。

  所以,我们可以在前端页面来收集用户的formid,然后保存在服务器上。根据小程序的文档说明:用户在小程序内发生过提交表单行为且该表单声明为要发模板消息的,只能在用户发生提交行为的时候收集formid,所以,我们可以把页面上用户可点击的按钮或其他元素用表单组件中的button按钮组件来代替,把用户的交互点击的bindtap事件通过表单的bindsubmit来代替 ,从而捕获用户的点击事件来产生更多的formId。等到真正需要网络请求的时候将收集到的formid发送至服务器保存。发送成功以后清空formid,以便再次收集新的formid。

  后端在发送模板消息的时候先从保存的formid中挑出未过期的一条formid,删除已过期的不可用的fromid以及当前将要用的formid。

  注:这只是一个解决思路,请务必在严格遵守小程序运营规范的前提下把本思路作为一个参考。 

  未解决问题:如果用户在一周内没有访问或点击过小程序中的任何组件,那我们就收集不到有效的fromid,也就意味着我们失去了给用户发送模板消息的权限,这种情况下该怎么办?

以上是关于微信小程序 实现模板消息群发、发送给指定用户的主要内容,如果未能解决你的问题,请参考以下文章

微信推送信息功能

如何在微信小程序中设置http请求

微信小程序发送通知给他人

微信小程序之再说“一次性订阅消息”

微信小程序如何转发给微信好友和微信群

微信小程序订阅消息-写于2020.7.26