如何实现小程序发送服务通知?
小程序给用户发送消息需要比较多的验证,刚刚遇到这个需求可能会花较长时间研究测试,所以从基础整理了一整套发送消息的逻辑,为以后开发消息通知功能提供思路,减少学习时间
发送模板消息主要有以下几个部分
一、获取access_token二、建立消息模板三、获取form_id四、发送消息通知五、设定定时任务一、获取access_token向微信请求发送消息时,会需要到access_token,access_token相当于是小程序的身份证,虽然有appid和appsecret这2个证明,但是微信为了保证安全性,就用了access_token这个有时效的身份证明来验证,一条access_token只有2小时有效期,而且单个小程序1天只能请求1000次access_token,所以我们需要一套逻辑来保证access_token的可用性
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential appid=APPID secret=APPSECRET
只需要向上面这个地址请求就可以返回对应的access_token
根据这个接口,写如下方法
public function test(){ $appId = #39; #39;; $appSecret = #39; #39;; $token = file_get_contents( https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential appid= .$appId. secret= .$appSecret); $token = json_decode($token); $token = $token- access_token; db( #39;token #39;)- where( #39;id #39;,1)- update([ #39;access_token #39;= $token]);//覆盖上一条access_token }
再设置一个定时器每小时触发一次该接口,之后就可以随意取出肯定能用的token了
$token = db( #39;token #39;)- find(); $token = $token[ #39;access_token #39;];
二、建立消息模板
在小程序微信公众平台的左边栏有一个模板消息的选项卡,只需要按照文档添加一个模板消息,就可以得到对应的对应的模板ID,这一步基本都是网页自行操作,不作更多展示
三、获取form_id
微信为了防止小程序对用户进行过多消息通知,对消息通知进行了一个限制,每发送一条消息通知,就需要一条form_id或者prepay_id
prepay_id是用户在使用微信支付之后返回的Id,本文中不做详解
form_id是与button绑定的Id,每当用户点击绑定过的button就会返回一条form_id,一条form_id的有效期是7天,且每个用户的form_id只能对该用户使用,所以我们需要一个专门的逻辑来保存和使用form_id
①设计form_id表结构 form_id有2个条件,第一个是仅7天内有效,第二个是仅对创建form_id的用户有效,针对这2个要求建立如下表 创建时间用户id idcreateTimeopenIdform_id id作为主键自增不用解释 createTime作为找到过期form_id的标志,设置定时任务,删除过期form_id openId用来找到用户自己的form_id来使用 ②取到form_id !--pages/index/index.wxml-- form report-submit= #39;ture #39; bindsubmit= #39;form_id #39; button form-type= submit 确定 /button /form // pages/index/index.js form_id: function(e) { wx.request({ url: #39;test.com/index/index/form_id #39;,//自行替换接口 method: POST , data: { form_id: e.detail.formId, openId: openId//自行获取当前用户openId header: { #39;content-type #39;: #39;application/x-www-form-urlencoded #39; //test.com/index/index/form_id public function form_id(){ if (empty($_POST)) {die;} $form_id = $_POST[ #39;form_id #39;]; if ($form_id == #39;the formId is a mock one #39;){die;}//过滤开发工具生成的form_id $openId = $_POST[ #39;openId #39;]; if (!$openId) {die;} $data = compact( #39;form_id #39;, #39;openId #39;); db( #39;form_id #39;)- insert($data); ③使用form_id public function test(){ $openId = #39; #39;; $form_id = db( #39;form_id #39;)- where( #39;openId #39;,$openId)- order( #39;id #39;)- field( #39;form_id #39;)- find(); $form_id = $form_id[ #39;form_id #39;]; ④定时删除过期form_id public function test(){ $time = time()-518400;//保证form_id可用性删除6天前的form_id db( #39;form_id #39;)- where( #39;createTime #39;, #39; #39;,$time)- delete(); //将该方法每天执行一次 }
四、发送消息通知
当access_token和form_id都保证可用之后,就可以给用户发送消息通知了
public function message($data){ //获取form_id $form_id = db( #39;form_id #39;)- where( #39;openId #39;,$openId)- order( #39;id #39;)- find(); if (!$form_id) {die;} $form_id = $form_id[ #39;form_id #39;]; db( #39;form_id #39;)- where( #39;form_id #39;,$form_id)- delete(); //获取access_token $access_token = db( #39;token #39;)- where( #39;id #39;,1)- find(); $access_token = $access_token[ #39;access_token #39;]; //获取消息内容 $openId = $data[ #39;openId #39;]; $title = $data[ #39;title #39;]; $data1 = $data[ #39;data1 #39;]; $data2 = $data[ #39;data2 #39;]; $request_url= #39;https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token= #39;.$access_token; $request_data=[ #39;touser #39; = $openId, #39;template_id #39; = #39; #39;,//表id #39;page #39; = #39;pages/test/test?data1= #39;.$data1. #39; data2= #39;.$data2,//本消息点击后跳转到的页面 form_id = $form_id, #39;data #39; = [ #39;keyword1 #39; = [ #39;value #39; = $title #39;keyword2 #39; = [ #39;value #39; = $data1 #39;keyword3 #39; = [ #39;value #39; = $data2 #39;emphasis_keyword #39; = keyword1.DATA //消息中要放大的内容 $return=json_decode($this- request($request_url,$request_data),true);//发送消息,并读取返回值 return $return; //上面的$this- request方法 public function request($url, $data=null) $headers=array( #39;Content-type:application/json;charset=UTF-8 #39;, #39;Accept:application/json #39;, #39;Cache-Control:no-cache #39;, #39;Pragma:no-cache #39;); $curl=curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); if (!empty($data)) { $data=json_encode($data); curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, $data); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); $output=curl_exec($curl); curl_close($curl); return $output; }
五、设定定时任务
为了保证上述操作都能顺利进行,我们需要设定几个定时任务来帮助消息发送,先假设有几个方法
getToken //每小时更新一次token
delForm_id //每天删除一次6天前的form_id
message //每分钟执行一次发送消息
首先连接上服务器打开定时任务设置
crontab -e
设置中的每一行就是一个定时任务,分成3个部分
1.* * * * * 这5个参数分别表示定时任务的执行时间,每个参数与上个参数隔一个空格,分别为(分)(时)(天)(月)(星期),下面举例子 * * * * *//每分钟执行一次 0 * * * *//每小时的第0分钟执行一次 */5 * * * *//每5分钟执行一次 * 23 * * *//每天的23点执行一次 * * 1 * *//每月1号执行一次 * * * */2 *//每2个月执行一次 0 0 * * 6//每周6的0点0分执行一次
2./usr/bin/php
这是php执行文件的路径,如果cd到该路径,给出php执行文件路径就会执行php文件,可以用来测试php文件是否可以设置定时任务
注意,这个路径只是一个快捷方式,真正的php执行文件在/usr/local/php/bin/php或者/usr/local/php(版本号)/bin/php,如果在bin下没有创建快捷方式请自行创建
3./项目路径/执行文件
这是需要执行的php文件路径,如果写的是原生php,直接指到该文件即可,如果是用thinkphp框架写的,那需要指到根目录或者public目录下的index.php,后边跟上/模块/控制器/方法
知道这3点我们就可以写出上述3个定时任务
* */1 * * */usr/bin/php /项目路径/index.php /index/index/getToken * 4 * * */usr/bin/php /项目路径/index.php /index/index/delForm_id * * * * */usr/bin/php /项目路径/index.php /index/index/message
最后,重启一下定时任务
//CentOS5/CentOS6 /sbin/service crond restart //CentOS7 /bin/systemctl restart crond.service
相关推荐:小程序教程
以上就是如何实现小程序发送服务通知的详细内容,更多请关注php中文网其它相关文章!
最佳 Windows 性能的顶级免费优化软件
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。