最近Sham才知道小程序将停止使用模板消息,改为更人性化的订阅消息,虽然后知后觉,但是还不晚,于是马上查文档,试代码。
其实老实说,官方的文档我是看的一知半解,好在前面有用过模板消息,看了官方说明之后,发现其实和模板消息差不多,于是赶紧着手实验,最后成功了,特此记录。
首先是小程序端,授权需要通过 bindtap 事件才可以
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<!--wxml部分--> <button bindtap='allownotes'>获取订阅消息</button> //js部分 allownotes:function(e){ wx.requestSubscribeMessage({ tmplIds: ["订阅消息模板id"], //这里记得修改,还有下面的,多个id用,分隔 success: (res) => { if (res['订阅消息模板id同上'] === 'accept') { wx.showToast({ title: '订阅OK!', duration: 1000, success(data) { //成功 } }) } }, fail(err) { //失败 console.error(err); } }) }, |
用户点击button之后,就会弹出授权窗口,用户如果授权,就可以实时第二步了,这里放的是PHP后端的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
<?php function returnAsskey() { //需要修改小程序appid及secret $appid='你的appid'; $secret='你的secret'; $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$appid.'&secret='.$secret; $ass_key = curl_get($url); $a1 = $ass_key->access_token; return $a1; } temMsg(); function temMsg() { $page = '/pages/index/index'; $openid = $_GET['openid']; if(!$openid)die('failed!'); $temid = '你的订阅模板id'; //此处要修改 $key1 = '行政部'; //发送的消息内容,自己定义 $key2 = '2019年12月20日'; //发送的消息内容,自己定义 $key3 = '2020年新春晚会报名开始啦'; //发送的消息内容,自己定义 $key4 = '2019年12月30日'; //发送的消息内容,自己定义 $access_token = returnAssKey(); $url = 'https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token='.$access_token; $data = array( //这里一定要按照微信给的格式 "touser"=>$openid, "template_id"=>$temid, "page"=>$page, "data"=>array( "thing1"=>array( //这里的thing1和后面的data2等,都是对应订阅消息模板中,请自行修改 "value"=>$key1, "color"=>"#173177" ), "date2"=>array( "value"=>$key2, "color"=>"#173177" ), "thing6"=>array( "value"=>$key3, "color"=>"#173177" ), "date8"=>array( "value"=>$key4, "color"=>"#173177" ) ), //需要进行加大的消息 "emphasis_keyword"=>"keyword1.DATA", ); $res = postCurl($url,$data,'json');//将data数组转换为json数据 if($res){ echo json_encode(array('state'=>4,'msg'=>$res)); }else{ echo json_encode(array('state'=>5,'msg'=>$res)); } } function curl_get($url) { $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $data = curl_exec($curl); $err = curl_error($curl); curl_close($curl); return json_decode($data);//对数据进行json解码 } function postCurl($url,$data,$type) { if($type == 'json'){ $data = json_encode($data);//对数组进行json编码 $header= array("Content-type: application/json;charset=UTF-8","Accept: application/json","Cache-Control: no-cache", "Pragma: no-cache"); } $curl = curl_init(); curl_setopt($curl,CURLOPT_URL,$url); curl_setopt($curl,CURLOPT_POST,1); curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false); curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,false); if(!empty($data)){ curl_setopt($curl,CURLOPT_POSTFIELDS,$data); } curl_setopt($curl,CURLOPT_RETURNTRANSFER,1); curl_setopt($curl,CURLOPT_HTTPHEADER,$header); $res = curl_exec($curl); if(curl_errno($curl)){ echo 'Error+'.curl_error($curl); } curl_close($curl); return $res; } ?> |
上述的thing1等,可以在对应的模板详情中找到,如图
最后,就是在需要推送消息的时候,访问这个php代码文件即可,记得将openid传给后端,不然它也不知道该退给谁。
如果是要批量推送,应该只需要将openid合并成数组,然后循环执行就行了,sham还没有试,等后续正式使用的时候再实验吧。
总结下:订阅消息不管是对开发者还是用户都更灵活,开发者不用去考虑时效性和次数,用户也能自助选择是否接受,sham个人感觉不错。
在订阅消息-公共模板库 里面一堆的模板,请问 行政服务小程序里面你选用的是哪些模板呢?
@樱花雨 这个根据你自己需求来吧,我用的“反馈回复通知”,“新工单提醒”,”公司公告通知”,“食堂菜单更新通知”,还有一些,只要小程序端和后端对应上就行了