小程序如何使用订阅消息(PHP代码+小程序js代码)


orchid
电梯物联网专家 2024-01-23 10:19:32 63017 赞同 0 反对 0
分类: 资源 标签: 后端
小程序如何使用订阅消息(PHP代码+小程序js代码)

1、什么是小程序订阅消息?

 

可以实现给授权了的用户进行消息推送,推送一些指定的消息,带动用户的点击,例如提醒用户签到,或者发送一些奖励到账等通知,目的就是一个,带动用户的点击,留住老用户。在这里我们需要通过,小程序的后台去开通订阅消息,订阅消息企业、个人都可以开通,机关部门可以申请长期订阅模板、而其他的就只能选择一次性模板。

 

消息类型

 

  • 一次性订阅消息

 

一次性订阅消息用于解决用户使用小程序后,后续服务环节的通知问题。用户自主订阅后,开发者可不限时间地下发一条对应的服务消息;每条消息可单独订阅或退订。

 

  • 长期订阅消息

 

一次性订阅消息可满足小程序的大部分服务场景需求,但线下公共服务领域存在一次性订阅无法满足的场景,如航班延误,需根据航班实时动态来多次发送消息提醒。为便于服务,我们提供了长期性订阅消息,用户订阅一次后,开发者可长期下发多条消息。

目前长期性订阅消息仅向政务民生、医疗、交通、金融、教育等线下公共服务开放,后期将逐步支持到其他线下公共服务业务。

 

  • 设备订阅消息

 

设备订阅消息是一种特殊类型的订阅消息,它属于长期订阅消息类型,且需要完成「设备接入」才能使用。

设备订阅消息用于在设备触发某些需要人工介入的事件时(例如设备发生故障、设备耗材不足等),向用户发送消息通知。详见设备订阅消息文档

 

  • 何为一次性模板?

 

简明扼要来说,就是用户授权一次可以获取一次消息,开发者不可以一直推送消息打扰用户

 

  • 订阅消息的格式

 

订阅消息是不可以随便发送的,需要对应到格式,包括字数长度等等,可以看这个,这是一个签到模板。

 

图片

 

看下他的详情

 

图片

图片

这里的thing1、thing5都由字数的规范,防止推送垃圾消息,引流之类的

 

2、运行基本流程

前端通过组件接口用户进行授权,后端通过定时触发,将模板消息触发。可以通过宝塔的定时计划来进行触发,用到的各种鉴权,我们通过redis来存储

3、开发步骤

 

第一步开通订阅消息

图片

选择消息模板

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

图片

小程序申请授权

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

代码:

wx.requestSubscribeMessage({      tmplIds: [],    })

 

上面的tmplIds里面填写的就是申请到的模板ID,例如我的

6io5lFLo4OEdNjl2_F********RZEm6RMdHLQ

 

这里之前做过测试多个模板id一次性授权,存在bug,只会取第一个有效,啥意思呢?就是像这样

tmplIds: [‘1’,‘2’],
这个大家自己去测试

 

我们新建wxml文件:
<view style="height: 100rpx;"></view><button>抽奖</button><view style="height: 100rpx;"></view><button type="primary" bindtap="sign_up">签到</button><view style="height: 100rpx;"></view><button>购买</button><view style="height: 100rpx;"></view><button>分享</button>注释: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
<?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;//返回结果}
//封装方法
//签到通知 function notify_sign($touser,$ACCESS_TOKEN,$order_num,$shop_name,$user_name9,$phone,$address){ $template=array( 'touser'=>"$touser",//接收方openid 'template_id'=>"8nHJ-TGMbPXBEROLpIEsba4ZMKt4lkJlJoEO5RcTYmk", //模板的id 'page'=>"pages/admin_order/admin_order",//点击小程序订阅消息跳转的页 'data'=>array( // 'character_string1'=>array('value'=>"$out_trade_no",'color'=>"#00008B"), 'character_string12'=>array('value'=>"$order_num",'color'=>'#00008B'), // 'amount4'=>array('value'=>"15",'color'=>'#00008B'), 'thing1'=>array('value'=>"$shop_name",'color'=>'#00008B'), 'thing8'=>array('value'=>"$user_name9",'color'=>'#00008B'), 'phone_number9'=>array('value'=>"$phone",'color'=>'#00008B'), 'thing11'=>array('value'=>"$address",'color'=>'#00008B') ) // '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);}

?>

 

下载redis服务,记得开放6379端口

 

图片

新建access_token.php文件
通过定时任务对access_token的存储,在快过期时调用更新,这里说一次为啥不调用一次刷新一次access_token就好了,弄这么麻烦?因为当access_token刷新后已经通知过的模板消息就会失效,为了防止以前发的模板消息失效,能最大程度降低失效,可以用定时器的方法更新access_token即可
再看下官方怎么说的:

access_token 的存储至少要保留 512 个字符空间;access_token 的有效期目前为 2 个小时,需定时刷新,重复获取将导致上次获取的 access_token 失效;建议开发者使用中控服务器统一获取和刷新 access_token,其他业务逻辑服务器所使用的 access_token 均来自于该中控服务器,不应该各自去刷新,否则容易造成冲突,导致 access_token 覆盖而影响业务;

<?php//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(); //设置抓取的url curl_setopt($curl, CURLOPT_URL, $url); //设置头文件的信息作为数据流输出 curl_setopt($curl, CURLOPT_HEADER, 0); // 超时设置,以秒为单位 curl_setopt($curl, CURLOPT_TIMEOUT, 1);
// 超时设置,以毫秒为单位 // curl_setopt($curl, CURLOPT_TIMEOUT_MS, 500);
// 设置请求头 curl_setopt($curl, CURLOPT_HTTPHEADER, $header); //设置获取的信息以文件流的形式返回,而不是直接输出。 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); //执行命令 $data = curl_exec($curl);
// 显示错误信息 if (curl_error($curl)) { print "Error: " . curl_error($curl); } else { $result=json_decode($data,true); // $ACCESS_TOKEN=$result['access_token']; curl_close($curl);//关闭连接 // return $result['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文件如下:
图片
<?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;//返回结果}
//封装方法
//签到 function notify_sign($touser,$ACCESS_TOKEN){ $template=array( 'touser'=>"$touser",//接收方openid 'template_id'=>"6io5lFL**********HLQ", //模板的id 'page'=>"pages/jifen/jifen",//点击小程序订阅消息跳转的页 'data'=>array( // 'character_string1'=>array('value'=>"$out_trade_no",'color'=>"#00008B"), 'thing1'=>array('value'=>"积分签到提醒",'color'=>'#00008B'), // 'amount4'=>array('value'=>"15",'color'=>'#00008B'), 'thing2'=>array('value'=>"签到获得10积分",'color'=>'#00008B'), 'thing5'=>array('value'=>"点击立即签到",'color'=>'#00008B'), 'phrase6'=>array('value'=>"今天还没签到哦",'color'=>'#00008B') ) // '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文件
写入代码
<?php//签到通知header("Content-type:text/html;charset=utf-8");//字符编码设置  
//通知 include 'notify.php';//引用通知模板文件 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); $redius_token=$redis->get('kuaiquyin_wx_token');//鉴权
// $name=mb_substr($name,0,10,'utf-8');notify_sign("你的openid",$redius_token,$name);
openid是小程序登陆后给的,可以去参考其他文章,这里不做说明
例如我的openid
图片
写入后,去小程序点击签到授权

图片

 

访问后报错:

图片

我们看一下是啥错误
图片
不好意思😄忘记改了,忘记改openid了

改了之后:

图片

微信成功收到消息

如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!

评价 0 条
电梯物联网专家L2
粉丝 1 资源 185 + 关注 私信
最近热门资源
分享如何统信UOS系统在屏蔽mysql显性的用户名称以及密码  616
分享免费开源高速下载器  577
分享如何在银河麒麟高级服务器操作系统V10SP3中需要启用内核审计功能。  572
通过shell脚本在统信UOS/麒麟系统中安装nginx  504
分享如何查看网卡中断的数量  423
分享查询网卡所在PCI插槽链路能力及当前链路状态  420
麒麟系统进行内存清理  414
麒麟系统资源下载合集(适配各类cpu)  413
统信UOS常见问题小总结  411
winrar绿色无广告版分享  394
最近下载排行榜
分享如何统信UOS系统在屏蔽mysql显性的用户名称以及密码 0
分享免费开源高速下载器 0
分享如何在银河麒麟高级服务器操作系统V10SP3中需要启用内核审计功能。 0
通过shell脚本在统信UOS/麒麟系统中安装nginx 0
分享如何查看网卡中断的数量 0
分享查询网卡所在PCI插槽链路能力及当前链路状态 0
麒麟系统进行内存清理 0
麒麟系统资源下载合集(适配各类cpu) 0
统信UOS常见问题小总结 0
winrar绿色无广告版分享 0
作者收入月榜
1

prtyaa 收益395.97元

2

zlj141319 收益228.92元

3

IT-feng 收益215.07元

4

1843880570 收益214.2元

5

风晓 收益208.24元

6

777 收益173.02元

7

哆啦漫漫喵 收益131.6元

8

Fhawking 收益106.6元

9

信创来了 收益105.97元

10

克里斯蒂亚诺诺 收益91.08元

请使用微信扫码

加入交流群

请使用微信扫一扫!