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

选择消息模板

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

注意:如果没有想要的模板,去把小程序的服务类目多加几个

小程序申请授权

一次性订阅消息、长期订阅消息,接口

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了

改了之后:

微信成功收到消息

这是一个简单的记录,这样方便自己日后使用。也希望能对有此困扰的你提供帮助,感谢你的支持!

感谢右下角你的点赞、在看!

你可能想看:
« 上一篇
下一篇 »

相关推荐

php实时推送,php实地培训

2026年10月05日

48阅读

php乱码出现问号的原因,php乱码出现问号的原因有哪些

2026年10月05日

40阅读

php一句话木马,一句话木马ctf

2026年10月05日

43阅读

php获取数组长度,php中如何获取数组的长度

2026年10月05日

44阅读

php面试题库及答案,php程序员面试真题库

2026年10月05日

42阅读

phpcontent-type修改,php源码二次修改需要多少钱

2026年10月05日

38阅读