背景描述
小程序答题签到功能,为了促进日活,需要每天定时向当日未签到的用户推送消息提醒签到。
读本篇之前最好已经了解微信关于发送模板消息的相关文档:
- 模板消息指南
- 模板消息服务接口
说明:?作者也是第一次写小程序的定时模板消息功能,作为一个纯种前端攻城狮,可能在建表操作数据库等后端代码上有不严谨或不合理的地方,欢迎大佬们拍砖指正(轻拍)。本文以提供解决思路为主,仅供学习交流,如有不合理的地方还请留言哦。?
实现思路
官方限制
微信小程序推送模板消息下发条件:
- 支付 当用户在小程序内完成过支付行为,可允许开发者向用户在?7天?内推送有限条数的模板消息?(1次支付可下发3条,多次支付下发条数独立,互相不影响)
- 提交表单 当用户在小程序内发生过提交表单行为且该表单声明为要发模板消息的,开发者需要向用户提供服务时,可允许开发者向用户在?7天?内推送有限条数的模板消息?(1次提交表单可下发1条,多次提交下发条数独立,相互不影响)
根据官方的规则,显然用户1次触发7天内推送1条通知是明显不够用的,比如签到功能,只有用户在前一天签到情况下才能获取一次推送消息的机会,然后用于第二天向该用户发送签到提醒。倘若用户忘记了签到,系统便失去了提醒用户的权限,导致和用户断开了联系。
如何突破限制?
既然用户1次提及表单可以下发1条消息通知,且多次提交下发条数独立且互不影响。 那我们可以合理利用规则,将页面绑定点击事件的按钮都用form 表单?report-submit=true ?包裹?button form-type=submit ?伪装起来,收集formId ,将formId 存入数据库中,然后通过定时任务再去向用户发送模板消息。
开发步骤
后台配置消息模板
微信公众平台->功能->模板消息->我的模板中添加模板消息,如下:
其中模板ID和关键词需要在发送模板消息的时候用到。
数据库设计
建表之前,思考一下都需要存哪些数据?
根据微信的发送消息接口templateMessage.send 可知,要给用户发送一条消息需要将touser (即用户的openid ),form_id 需要存入数据库。 另外获取用户form_id 时的expire (过期时间)也需要存下来,另外还需要知道form_id 是否使用以及过期的状态需要存一下。
于是表的结构为:
表: wx_save_form_id
sql
CREATE TABLE `wx_save_form_id` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`open_id` char(100) NOT NULL DEFAULT '',`user_id` int(11) NOT NULL,`form_id` char(100) NOT NULL DEFAULT '',`expire` bigint(20) NOT NULL COMMENT 'form_id过期时间(时间戳)',`status` int(1) DEFAULT '0' COMMENT '0 未推送 1已推送 2 过期',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=114 DEFAULT CHARSET=utf8;
表建好了,来捋一捋逻辑:
- 用户提交表单,将
open_id ,246);'>user_id(根据自身需求存此字段),246);'>form_id,expire ?以及status=0 插入到wx_save_form_id 表中
- 开启定时任务(比如每天10:00执行),到固定时间查询表
wx_save_form_id ,拿到status=0 的数据,然后再调微信的templateMessage.send 接口给对应的用户发送提示信息
- 发送完的用户将
status 字段更新为1 ,下次查询的时候讲筛选掉已发送的状态。
想想是不是漏掉点什么?
一条form_id 的过期时间是7天,那如果过期了怎么去将状态改完已过期呢?
一个解决办法是,再开一个定时任务(比如20min执行一次),去查询哪条form_id 已经过期,然后再更改状态。如果数据只存在wx_save_form_id 一张表中感觉效率会很低,不方便,也不合理。于是想到再去建立一张表:
表: wx_message_push_status
参考文献
突破微信小程序模板消息限制,实现无限制主动推送
人人贷大前端技术博客中心
最后广而告之。 欢迎访问人人贷大前端技术博客中心
里面有关nodejs ?react ?reactNative ?小程序 前端工程化等相关的技术文章陆续更新中,欢迎访问和吐槽~
上一篇:?小程序打怪之在线客服自动回复功能(node版)
上上一篇:?微信小程序踩坑指南 (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|