小程序模板消息技术博客

一、何为模板消息

所谓模板消息,就是内容不能完全自定义,必须遵从一个固定模板的对点消息。模板消息的本质是受限制的推送消息,这种限制来源于两个方面:一是模板消息原则上是由用户触发的,在用户不作授权的情况下,小程序无法向用户随意主动推送消息;二是模板消息必需经由微信提供的官方API才能够发送,这个API限制了模板消息的内容。

二、模板消息的前端支持

为了能够对某一个特定用户发送模板消息,后端服务器必须拥有该用户生成的form_id才行。form_id是小程序前端生成的一串标识码,一个form_id可用于发送一条模板消息。我们的小程序的功能需求是在社团活动开始前一天可以发送一条模板消息提醒用户,因此我们将form_id的收集按键和活动的关注按钮做在了一起,用户每点击一次关注活动,小程序就可以收集到一条form_id,并调用后端提供的接口发送给后端。

三、模板消息的后端支持

1. form_id的存储

form_id相关操作是一个很高频的操作,而且form_id的有效期只有短短7天,不适合使用数据库存储。对于这样的高频I/O操作,我们选择了Redis保存和查询form_id。Redis是一个K-V数据库,对于form_id而言,由于一个form_id对应一个用户,我们使用user_id_form_ids_key作为Redis键值对的键,{form_id: form_id, expire_time: Time.now + 7.days}组成的数组作为值。每当有向用户发送模板消息的需求时,通过用户的key取出一个form_id,然后发送消息即可。

2. form_id的更新

小程序的限制注定了每个form_id只有7天的有效期。因此,为了避免使用一个过期的form_id,form_id要经常被更新才可以。我们把form_id存储在一个数组中,每次取form_id时,先过滤一遍这个数组,将过期的form_id全部删除,再取出最早的一个form_id发送给微信的API。

3. 定时检测模板消息发送时间

由于我们需要在用户关注的活动开始的前一天向用户推送一条模板消息,因此需要设置一个定时任务来每隔一段时间扫描一次数据库,判断是否有活动即将开始而还未通知用户。我们使用了Rails作为后端框架,选择了sidekiq-scheduler作为定时任务的驱动器,每十分钟扫描一次数据库,选取那些有人关注的活动,然后对每个关注了此活动而还未收到通知的用户发送一条模板消息。

 posted on 2019-06-17 21:39  BuaaRedSun  阅读(289)  评论(0编辑  收藏  举报