最近Sham才知道小程序将停止使用模板消息,改为更人性化的订阅消息,虽然后知后觉,但是还不晚,于是马上查文档,试代码。
其实老实说,官方的文档我是看的一知半解,好在前面有用过模板消息,看了官方说明之后,发现其实和模板消息差不多,于是赶紧着手实验,最后成功了,特此记录。
首先是小程序端,授权需要通过 bindtap 事件才可以
<!--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后端的
<?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个人感觉不错。
在订阅消息-公共模板库 里面一堆的模板,请问 行政服务小程序里面你选用的是哪些模板呢?
这个根据你自己需求来吧,我用的“反馈回复通知”,“新工单提醒”,”公司公告通知”,“食堂菜单更新通知”,还有一些,只要小程序端和后端对应上就行了