小程序消息模板选择与授权接口代码配置全攻略
选择消息模板

注意:如果没有想要的模板,去把小程序的服务类目多加几个
小程序申请授权
一次性订阅消息、长期订阅消息,接口
wx.requestSubscribeMessage
代码:
wx.requestSubscribeMessage({tmplIds: [],})
上面的 tmplIds 中所填写的内容即为申请到的模板 ID,例如我的。
6io5lFLo4OEdNjl2_F********RZEm6RMdHLQ
这里之前进行过测试,即多个模板 id 可一次性授权,但存在 bug,这种情况下只会选取第一个有效。意思就是像这样。
tmplIds: [‘1’,‘2’],这个大家自己去测试
我们新建wxml文件:
注释:1每个人能每天能分享一次,重复分享积分不算入2邀请新用户登录后加积分
新建js文件:
// pages/share/share.jsPage({/*** 页面的初始数据*/data: {},sign_up:function(){wx.requestSubscribeMessage({tmplIds 包含了 ['6io5lFLo4OEdNjl2_F********RZEm6RMdHLQ'] 。})},/*** 生命周期函数--监听页面加载*/onLoad(options) {},/*** 生命周期函数--监听页面初次渲染完成*/onReady() {},/*** 生命周期函数--监听页面显示*/onShow() {},/*** 生命周期函数--监听页面隐藏*/onHide() {},/*** 生命周期函数--监听页面卸载*/onUnload() {},/*** 页面相关事件处理函数--监听用户下拉动作*/onPullDownRefresh() {},/*** 页面上拉触底事件的处理函数*/onReachBottom() {},/*** 用户点击右上角分享*/onShareAppMessage() {}})
测试下可以正常授权
后端PHP封装、redis配置
在api目录下新建文件notify.php
// 微信小程序通知主要函数//http_request 通过 curl 来发起请求,此请求包含两个参数,一个是 url 连接地址,另一个是数据信息。定义一个函数 http_request,该函数接受两个参数,分别是 $url 和 $data。它用于发送 HTTP 请求并返回响应结果。$ch = curl_init();//初始化curl_setopt 函数将 $ch 作为参数,将 CURLOPT_URL 作为选项,将 $url 作为其对应的值进行设置。设置 curl 选项,将 $ch 的 CURLOPT_RETURNTRANSFER 选项设置为 1 。设置 curl 的选项,将 $ch 对应的选项 CURLOPT_SSL_VERIFYPEER 的值设置为 FALSE 。使用 curl_setopt 函数设置 $ch 的选项,将 CURLOPT_SSL_VERIFYHOST 选项的值设置为 FALSE 。设置 curl 的选项,将 $ch 对应的选项 CURLOPT_POST 的值设置为 1 。curl 对 $ch 进行设置选项操作,将 CURLOPT_POSTFIELDS 设置为 $data 。$output = curl_exec($ch);//执行curl_close($ch);//关闭return $output;//返回结果}//封装方法//签到通知此函数用于通知签到相关事宜。它需要传入用户标识 $touser、访问令牌 $ACCESS_TOKEN、订单编号 $order_num、店铺名称 $shop_name、用户姓名 $user_name9、联系电话 $phone 以及收货地址 $address 这些参数。{$template=array(接收方 openid 为 $touser模板的 id 为"8nHJ-TGMbPXBEROLpIEsba4ZMKt4lkJlJoEO5RcTYmk"点击小程序订阅消息后跳转的页为“pages/admin_order/admin_order”'data'=>array("character_string1" 的值为 "$out_trade_no",颜色为 "#00008B"。'character_string12'的 value 为 "$order_num",其 color 为 '#00008B'。数组 'amount4' 包含两个元素,其中 'value' 的值为 "15",'color' 的值为 '#00008B'。数组 'thing1' 中包含两个元素,一个是 'value' 对应的元素,其值为 "$shop_name",另一个是 'color' 对应的元素,其值为 '#00008B'数组"thing8"包含两个元素,其中"value"的值为"$user_name9","color"的值为"#00008B"。'phone_number9'这个数组,其'value'的值为"$phone",'color'的值为'#00008B'。'thing11'的 value 为 $address,其 color 为 #00008B)// 键为 'phrase1' 的数组,其值为对 $plan 进行 urlencode 编码后的结果,颜色为 '#00008B',这是关于时间的信息);将模板进行 JSON 编码,得到的结果为 $json_template 。$url 等于 "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?" 然后后面接着 "access_token=" 再加上 $ACCESS_TOKEN 。使用 $url 和 urldecode($json_template) 作为参数调用 http_request 函数,将返回的结果赋值给 $res 。print_r($res);}?>
下载redis服务,记得开放6379端口
新建access_token.php文件
定时任务用于存储 access_token,在其快过期时进行调用更新。人们会疑惑,既然一次调用就能刷新一次 access_token,为何要搞得如此麻烦呢?原因在于,当 access_token 刷新后,已经通知过的模板消息就会失效。关注微信公众号:“PHP 大神”,可让干货第一时间送达。为了避免之前发的模板消息失效,以最大程度降低其失效的可能性,通过使用定时器的方式来更新 access_token 就可以了。
再看下官方怎么说的:
access_token 的存储需预留至少 512 个字符的空间;其有效期目前为 2 个小时,要定时进行刷新,若重复获取就会使上次获取的 access_token 失效;建议开发者通过中控服务器来统一获取和刷新 access_token,其他业务逻辑服务器所使用的 access_token 都来源于该中控服务器,不应各自去刷新,不然容易引发冲突,致使 access_token 被覆盖从而影响业务。
//access_token$appid="wxe20298c8e087576e";//小程序id$secret="*****";//密钥$grant_type="client_credential";$access_token=curl_get(该链接为 "https://api.weixin.qq.com/cgi-bin/token",其中包含参数 "appid=$appid"、"secret=$secret" 以及 "grant_type=$grant_type"。);echo $access_token;function curl_get($url){$header = array('Accept: application/json',);$curl = curl_init();//设置抓取的urlcurl 对 $curl 进行设置选项操作,将 CURLOPT_URL 这个选项设置为 $url 。//设置头文件的信息作为数据流输出curl 对 $curl 进行设置选项操作,将 CURLOPT_HEADER 设置为0);// 超时设置,以秒为单位curl 对 $curl 进行设置,设置其 CURLOPT_TIMEOUT 选项,将其设置为某个值(具体值未给出)。1);// 超时设置,以毫秒为单位把 $curl 的 CURLOPT_TIMEOUT_MS 设定为 500 ;// 设置请求头设置 curl 的选项 CURLOPT_HTTPHEADER 为 $header ,其中的 curl 为指定的 curl 资源。//设置获取的信息以文件流的形式返回,而不是直接输出。curl 对 $curl 进行设置选项操作,将 CURLOPT_RETURNTRANSFER 设置为1);curl 设置选项 $curl 的 CURLOPT_SSL_VERIFYPEER 为 false,这样就可以忽略 SSL 证书验证,避免在使用 curl 进行网络请求时因证书问题而导致请求失败。同时,设置 CURLOPT_RETURNTRANSFER 为 true,以便将请求的结果以字符串形式返回,而不是直接输出到浏览器。这样可以方便地对请求的结果进行处理和分析。false);对于 $curl ,设置其 CURLOPT_SSL_VERIFYHOST 为 2 。false);//执行命令$data = curl_exec($curl);// 显示错误信息if (curl_error($curl)) {print "Error: " . curl_error($curl);} else {$result=json_decode($data,true);结果中的“access_token”被赋值给了$ACCESS_TOKEN 。curl_close($curl);//关闭连接获取结果中的 access_token 并返回。// //存入到redis// // 如果未修改php.ini下面两行注释去掉ini_set('session.save_handler', 'redis');ini_set('session.save_path', 'tcp://127.0.0.1:6379');$redis = new redis();$redis->connect('127.0.0.1', 6379);$redis->set('kuaiquyin_wx_token',$result['access_token']);echo $redis->get('kuaiquyin_wx_token');}}
我们访问测试下:
设计定时器触发更新access_token
修改notify.php文件
打开小程序模板的详情我们进行替换,例如我的:
那就需要把内容的数据替换
替换后notify.php文件如下:
// 微信小程序通知主要函数//http_request 利用curl请求 两个参数 url连接地址 数据信息function http_request($url,$data){$ch = curl_init();//初始化curl_setopt($ch, CURLOPT_URL, $url);//设置curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);curl_setopt($ch, CURLOPT_POST, 1);curl_setopt($ch, CURLOPT_POSTFIELDS, $data);$output = curl_exec($ch);//执行curl_close($ch);//关闭return $output;//返回结果}//封装方法//签到此函数用于通知签到相关事宜。它需要传入两个参数,一个是接收通知的用户($touser),另一个是访问令牌($ACCESS_TOKEN)。通过这两个参数,函数能够执行相应的通知操作。{$template=array('touser'=>"$touser",//接收方openid模板的 id 为“6io5lFL**********HLQ”点击小程序订阅消息会跳转的页是“pages/jifen/jifen”'data'=>array(// 'character_string1'=>array('value'=>"$out_trade_no",'color'=>"#00008B"),"积分签到提醒"在 'thing1' 中,其值为 "积分签到提醒",颜色为 '#00008B'。// 'amount4'=>array('value'=>"15",'color'=>'#00008B'),签到可以获得 10 积分,其对应的颜色为 #00008B"value 为点击立即签到,color 为#00008B 的 thing5"今天还处在未签到的状态。)// 'phrase1'=>array('value'=>urlencode($plan),'color'=>'#00008B'), //时间);$json_template=json_encode($template);$url="https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=".$ACCESS_TOKEN;$res=http_request($url,urldecode($json_template));print_r($res);}?>
测试
通过定时计划我们先触发一次access_token的获取
然后新建sign.php文件
写入代码
//签到通知设置字符编码为 utf-8 ,使用 header 函数,其参数为 "Content-type:text/html" ;//通知引用通知模板文件为 include 'notify.php';设置会话保存处理器为 redis,具体的设置操作是 ini_set 函数,将其参数设置为'session.save_handler' 并赋值为'redis'。设置会话保存路径为 tcp://127.0.0.1:6379 ,即通过 ini_set 函数将会话保存路径设定为 tcp://127.0.0.1:6379 。$redis = new redis();Redis 连接到了 '127.0.0.1' 这个地址,并且使用的端口是 6379 。$redis->get('kuaiquyin_wx_token');//获取鉴权所需的 token ,该 token 存储在名为 kuaiquyin_wx_token 的键中,通过 get 方法从 Redis 中获取到的结果赋值给 $redius_token使用 mb_substr 函数从字符串 $name 的开头截取 10 个字符,编码为 utf-8 。通知签名函数(你的 openid,$redius_token,$name);
小程序登陆后会给予 openid,关于 openid 的相关内容可参考其他文章,此处不做详细说明。
例如我的openid
写入后,去小程序点击签到授权
访问后报错:
我们看一下是啥错误
不好意思忘记改了,忘记改openid了
改了之后:
微信成功收到消息
这是一个简单的记录,这样方便自己日后使用。也希望能对有此困扰的你提供帮助,感谢你的支持!
感谢右下角你的点赞、在看!