微信小程序消息推送
注意:请务必在严格遵守小程序运营规范的前提下使用本方案。
模板消息是什么? 所谓『模板消息』,就如上面的通知卡片,首先通知卡片形式样子是固定的,其实卡片中的通知内容部分,可以看到每天通知的内容都具备日程描述、日程主题、日程时间等要素,通知之间不同的地方在于这些要素后面的文案,将这些通知要素制作成模板,每次针对不同的通知内容 只需要填充每条要素对应的具体的文本 即可推送给用户。上面图中两条模板消息的日程主题和时间不一样,其他的信息要素保持一致,这就是模板消息。
一.前端页面如何尽可能多地收集推送码? 每次表单提交可以触发一次下发模版消息的机会,表单组件 如下: Page({ formSubmit: function(e) { let formId = event.detail.formId; console.log(‘form发生了submit事件,推送码为:’, formId) } })
组件中属性report-submit为true时,代表需要请求发模板消息的推送码,此时点击按钮提交表单可以获取formId,用于发送模板消息。接下来只需要对原来的页面进行改造,将用户原来绑定了点击事件的界面用表单组件中的button按钮组件来代替,也就是 把用户的交互点击的bindtap事件通过表单bindsubmit来取代 ,从而捕获用户的点击事件来产生更多的推送码formId,这里还需要对按钮组件的样式进行稍微的修改,以便更好地包裹原来界面的代码。 /wxss//修改按钮样式,使其能够包裹其他组件/.btn { border:none; text-align:left; padding:0; margin:0; line-height:1.5; }
二.小程序逻辑层如何传递推送码给服务器?
Page({ onLoad:function(){ this. saveFormIds(); }, saveFormIds: function(){ var formIds = app.globalData.gloabalFomIds; // 获取gloabalFomIds if (formIds.length) {//gloabalFomIds存在的情况下 将数组转换为JSON字符串 formIds = JSON.stringify(formIds); app.globalData.gloabalFomIds = ”; } wx.request({//通过网络请求发送openId和formIds到服务器 url: ‘‘, method: ‘GET’, data: { openId: ‘openId’, formIds: formIds }, success: function(res) { } }); }, }) 在小程序的逻辑层中,通过全局变量gloabalFomIds收集到多个formId后,可以在新页面载入时,在onLoad生命周期函数中发送网络请求获取数据, gloabalFomIds不为空时,把gloabalFomIds数组格式化为字符串发送到服务器,并清空当前的gloabalFomIds ,以便继续获取新的formId。
三.后端程序如何保存推送码formId? 因为这个保存是一个高频IO的操作,我们 后端以PHP结合高性能的key-value数据库Redis来实现推送码的存储 。相关关键代码如下,简单表达了思路,针对不同的后端环境和开发语言,你可能需要做相应的调整。
//关键代码 public function saveFormIds(){ openId= o p e n I d = _GET[‘openId’]; formIds= f o r m I d s = _GET[‘formIds’];;//获取formIds数组 if(formIds){ $formIds = json_decode($formIds,TRUE);//JSON解码为数组 $this -> _saveFormIdsArray($openId,$formIds);//保存 } }private function _get( formIds){ $formIds = json_decode($formIds,TRUE);//JSON解码为数组 $this -> _saveFormIdsArray($openId,$formIds);//保存 } }private function _get( openId){ cacheKey=md5(′userformId′. c a c h e K e y = m d 5 ( ′ u s e r f o r m I d ′ . openId); data= d a t a = this->cache->redis->get( cacheKey);//修改为你自己的Redis调用方式if( c a c h e K e y ) ; / / 修 改 为 你 自 己 的 R e d i s 调 用 方 式 i f ( data)return json_decode(data,TRUE); else return FALSE; }private function _save( data,TRUE); else return FALSE; }private function _save( openId, data)$cacheKey=md5(′userformId′.$openId);return$this−>cache−>redis−>save($cacheKey,jsonencode($data),60∗60∗24∗7);//修改为你自己的Redis调用方式privatefunctionsaveFormIdsArray( d a t a ) $ c a c h e K e y = m d 5 ( ′ u s e r f o r m I d ′ . $ o p e n I d ) ; r e t u r n $ t h i s − > c a c h e − > r e d i s − > s a v e ( $ c a c h e K e y , j s o n e n c o d e ( $ d a t a ) , 60 ∗ 60 ∗ 24 ∗ 7 ) ; / / 修 改 为 你 自 己 的 R e d i s 调 用 方 式 p r i v a t e f u n c t i o n s a v e F o r m I d s A r r a y ( openId,arr){ arr){ res = this−>get( t h i s − > g e t ( openId); if(res){ res){ new = array_merge( res, r e s , arr);//合并数组 return this−>save( t h i s − > s a v e ( openId,new); }else{ new); }else{ result = arr;return a r r ; r e t u r n this->_save( openId, o p e n I d , result); } } 这一步主要是构建服务器程序高效存储用户的推送码formId,这下推送机会有了,接下来我们考虑如何利用后端程序来想特定用户发送模板消息,考虑怎样去合理运用推送机会。
普通的模板消息的发送就不赘述了,可参考官方文档中的模板消息功能 一步步进行操作,我们重点来看高性能异步任务推送的实现方法。涉及到的关键代码如下:
Beanstalkd是一个 高性能、轻量级的分布式内存队列系统 ,我们通过Beanstalkd将模板消息推送任务的创建以及任务的执行分开进行。
getFormId函数主要实现每次取出一个未过期可用的推送码formId,并且删除不可用的邀请码和当前已选中的邀请码,以保证一定数额的推送码formId在未来一周内可用。
关于Beanstalkd的使用介绍,可用参考一下文章,深入研究。 高性能分布式内存队列系统beanstalkd(转) beanstalkd消息队列使用