uniapp小程序订阅消息推送+Thinkphp5后端代码教程示例

记录一下通过uniapp开发小程序消息推送的实例,配合后端tp推送,之前写的项目是微信小程序而且后端是原生php,这次通过项目记录一下

在这里插入图片描述

目录

  • 回顾
    • access_token获取规则以及思路
  • 第一步:设计前端触发订阅事件
  • 第二步:设计将token存入redis并到期触发
  • 第三步:编写订阅消息推送代码

回顾

首先我们通过原生php代码回顾一下,不考虑模板参数的话,主要就是“touser”和“ACCESS_TOKEN

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'=>"6io5lFLo4OEdNjl2_FKxHErBqXv3EF1QRZEm6RMdHLQ",    //模板的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);
}?>
push.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('wx_token');//鉴权// $name=mb_substr($name,0,10,'utf-8');
// notify_sign("o8oTs5AwK3Roma4mwtj6oNE7BIbk",$redius_token,$name);
//通知签到
include '../../conn.php';
$sql="SELECT openid FROM `user`";
$res=$conn->query($sql);
while($rowss=$res->fetch_assoc()){$openid=$rowss['openid'];notify_sign("$openid",$redius_token);
}

上述代码大概就是基本流程,我们再看一下,官方的参数字段
在这里插入图片描述

access_token获取规则以及思路

在这里插入图片描述

在这里插入图片描述

微信希望我们存在自己的服务器里面,过期就换,不提倡每次都刷新使用新的,否则可能会覆盖之前业务或导致失效,ok思路基本清楚了,开始干活了。

第一步:设计前端触发订阅事件

进入到小程序后台找到自己创建的订阅消息模板,复制订阅模板id

在这里插入图片描述

在合适的地方放入事件即可

uni.requestSubscribeMessage({
tmplIds: ['vrGIn55_mYjwQmTGqL27fyYZNNO7wGHdVv4QpA_K1t0'],
success (res) { //that.$token.toast('订阅成功!等待书审结果',1000)}})

通过真机活着体验版访问授权一次,请注意长期订阅消息和一次性订阅消息不一样,我们所使用的基本都是一次性,长期只能用于特殊单位使用,所以订阅一次就能收到一次,如果想让用户多次订阅建议放在几个用户必点区域

第二步:设计将token存入redis并到期触发

我个人不建议通过定时计划设置到期时间,不方便下次部署,我的建议是:
直接将代码存放到触发请求的目标位置,每次调用都会检查一下redis中是否存在access_token没有的话重新获取并存入,有的话用就可以

通过curl获取到用access_token,以下是获取到的格式,我们将7200作为实效时间存入
在这里插入图片描述

获取access_token(填入自己的appid和secret)

$url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=w******be&secret=6a*************6';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);$data = json_decode(trim($response),true);

redis设置
将返回值与过期时间存入redis中让他自动到期

 $Redis=new Redis();$Redis->set('uniapp_demo_access_token',$data['access_token'],$data['expires_in']);

代码写好了,测试一下

访问接口
在这里插入图片描述

查看redis记录值,包含到期时间和记录值

在这里插入图片描述

再次访问接口,由于记录值存在,并不会重新去获取access_token,而是用现在未到期的access_token
在这里插入图片描述

附上该部分完整代码
(使用时需要加上 use think\cache\driver\Redis;使用时替换 ******部分即可)

 //http://code.taila.club/index.php/index/api/send_notify// 测试订阅消息接口,后期移入admin控制器public function send_notify(){$token=input('token');$redis = new Redis();$result= $redis->get($token);if ($result){$re= $redis->get("uniapp_demo_access_token");if ($re) {// 存在记录echo($re);} else {$url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=w*************e&secret=6*********************6';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);$data = json_decode(trim($response),true);echo(json_encode(array('code' => 200,'data'=>$data,'msg' => 'token获取成功'),480)
);//access_token过期$Redis=new Redis();$Redis->set('uniapp_demo_access_token',$data['access_token'],$data['expires_in']);}}else{die("token过期");}}

第三步:编写订阅消息推送代码

  public function sendMessage(){$touser = 'o**********o';//用户openid$template_id = 'v*********0';//所需下发的订阅模板id$page = '/pages/index/index';//跳转页面不填则模板无跳转。$redis = new Redis();$re= $redis->get("uniapp_demo_access_token");$access_token = $re;//请求url$url = 'https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=' . $access_token;//发送内容$data = [];//接收者(用户)的 openid$data['touser'] = $touser;//所需下发的订阅模板id$data['template_id'] = $template_id;//点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转。$data['page'] = $page;//模板内容,格式形如 { "key1": { "value": any }, "key2": { "value": any } }$data['data'] = ["thing1" => ['value' => '测试'],"phrase3" => ['value' =>'大魔王'],];//跳转小程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版$data['miniprogram_state'] = 'developer' ;return self::curlPost($url,json_encode($data)) ;}//发送post请求static function curlPost($url,$data){$ch = curl_init();$params[CURLOPT_URL] = $url;    //请求url地址$params[CURLOPT_HEADER] = FALSE; //是否返回响应头信息$params[CURLOPT_SSL_VERIFYPEER] = false;$params[CURLOPT_SSL_VERIFYHOST] = false;$params[CURLOPT_RETURNTRANSFER] = true; //是否将结果返回$params[CURLOPT_POST] = true;$params[CURLOPT_POSTFIELDS] = $data;curl_setopt_array($ch, $params); //传入curl参数$content = curl_exec($ch); //执行curl_close($ch); //关闭连接return $content;}

上述代码中,已经去掉appid等参数,因为我们已经配置好了,已经将access_token记录到redis中去了,所以不再需要,只需要配置openid也就是touser还有对应的模板id,以及模板的参数即可,我们现在针对上述代码做一个解释

首先,将代码写入到控制器中,更改touser为自己的openid,方便自己做接收测试

  $touser = 'obwu*********0o';//用户openid

第二步,登录小程序后台找到自己设置的模板id

在这里插入图片描述

 $template_id = 'vr***********0';//所需下发的订阅模板id

第三步,选择点击跳转的页面

$page = '/pages/index/index';//跳转页面不填则模板无跳转。

第四步,接收redis中的access_token

 $redis = new Redis();$re= $redis->get("uniapp_demo_access_token");$access_token = $re;

第五步,配置模板内容
在这里插入图片描述

根据自己的内容设置对应的参数,注意参数有类型和长度要求,具体看这里
在这里插入图片描述

 //模板内容,格式形如 { "key1": { "value": any }, "key2": { "value": any } }$data['data'] = ["thing1" => ['value' => '测试'],"phrase3" => ['value' =>'大魔王'],];

第六步,访问测试

在这里插入图片描述

可以看到,消息已经推送过来了
在这里插入图片描述

这里我是新建了一个方法,因为只是测试使用,所以没将代码完整的封装然后调用,这样的话对于新手比较容易理解,也能自己修改成自己的业务逻辑,另外redis的记录名可以自己更改我这里为了演示随意起的

后端完整代码:


ApiController.php
<?phpnamespace app\index\controller;
use think\Controller;
use think\Db;
use think\cache\driver\Redis;
class ApiController extends Controller
{public function sendMessage(){$touser = 'o**********o';//用户openid$template_id = 'vr**********1t0';//所需下发的订阅模板id$page = '/pages/index/index';//跳转页面不填则模板无跳转。$redis = new Redis();$re= $redis->get("uniapp_demo_access_token");$access_token = $re;//请求url$url = 'https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=' . $access_token;//发送内容$data = [];//接收者(用户)的 openid$data['touser'] = $touser;//所需下发的订阅模板id$data['template_id'] = $template_id;//点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转。$data['page'] = $page;//模板内容,格式形如 { "key1": { "value": any }, "key2": { "value": any } }$data['data'] = ["thing1" => ['value' => '测试'],"phrase3" => ['value' =>'大魔王'],];//跳转小程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版$data['miniprogram_state'] = 'developer' ;return self::curlPost($url,json_encode($data)) ;}//发送post请求static function curlPost($url,$data){$ch = curl_init();$params[CURLOPT_URL] = $url;    //请求url地址$params[CURLOPT_HEADER] = FALSE; //是否返回响应头信息$params[CURLOPT_SSL_VERIFYPEER] = false;$params[CURLOPT_SSL_VERIFYHOST] = false;$params[CURLOPT_RETURNTRANSFER] = true; //是否将结果返回$params[CURLOPT_POST] = true;$params[CURLOPT_POSTFIELDS] = $data;curl_setopt_array($ch, $params); //传入curl参数$content = curl_exec($ch); //执行curl_close($ch); //关闭连接return $content;}//http://code.taila.club/index.php/index/api/send_notify// 测试订阅消息接口,后期移入admin控制器public function send_notify(){$token=input('token');$redis = new Redis();$result= $redis->get($token);if ($result){$re= $redis->get("uniapp_demo_access_token");if ($re) {// 存在记录echo($re);} else {$url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=w**********e&secret=6**********6';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);$data = json_decode(trim($response),true);echo(json_encode(array('code' => 200,'data'=>$data,'msg' => 'token获取成功'),480)
);//access_token过期$Redis=new Redis();$Redis->set('uniapp_demo_access_token',$data['access_token'],$data['expires_in']);}}else{die("token过期");}}}

本次教程到此结束,如果排版有问题,不易看懂,请私信或者评论区留言,希望文章对你有用!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/2381.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

bochs编译安装

编译命令 ./configure --prefix‘/usr/local/bochs2.7’ --enable-debugger --enable-disasm --enable-iodebug --enable-x86-debugger --with-x --with-x11 make sudo make install 配置文件 bochsrc # configuration file generated by Bochs plugin_ctrl: unmapped1, biosde…

设计消息模块的业务层Web层

目录 业务层 一、定义Message业务接口 二、定义Message业务实现类 Web层 一、获取分页消息列表 二、根据ID查询消息 三、把未读消息更新成已读消息 四、删除消息 业务层 一、定义Message业务接口 创建 MessageService.java 类 public interface MessageService {pub…

C++【位图/布隆过滤器—海量数据处理】

文章目录 一、位图&#xff08;1&#xff09;位图概念介绍&#xff08;2&#xff09;简单模拟实现&#xff08;3&#xff09;位图应用 二、布隆过滤器&#xff08;1&#xff09;关于布隆过滤器概念及介绍&#xff08;2&#xff09;布隆过滤器的使用场景&#xff08;3&#xff0…

性能测试的具体流程

文章目录 1. 确定性能测试目标及指标2. 设计测试场景3. 配置测试环境4. 编写测试脚本5. 进行性能测试6. 分析测试结果7. 提出优化建议8. 进行反复测试和调整 以下是一个基本的性能测试过程&#xff0c;旨在帮助了解性能测试的具体流程和步骤。 1. 确定性能测试目标及指标 首先…

多层感知机与深度学习算法概述

多层感知机与深度学习算法概述 读研之前那会儿我们曾纠结于机器学习、深度学习、神经网络这些概念的异同。现在看来深度学习这一算法竟然容易让人和他的爸爸机器学习搞混…可见深度学习技术的影响力之大。深度学习&#xff0c;作为机器学习家族中目前最有价值的一种算法&#…

JAVA开发(记一次504 gateway timeout错误排查过程)

一、问题与背景&#xff1a; 最近在发布一个web项目&#xff0c;在测试环境都是可以的&#xff0c;发布到生产环境通过IP访问也是可以的&#xff0c;但是通过域名访问就出现504 gateway timeout。通过postman去测试接口也是一样。ip和端口都可以通&#xff0c;域名却不行&…

MySql高级篇-006 MySQL架构篇-02MySQL的数据目录:数据库下的主要目录结构、文件系统如何存储数据

第02章_MySQL的数据目录 1.MySQL8的主要目录结构 # 查询名称叫做mysql的文件目录都有哪些[rootatguigu07 ~]# find / -name mysql安装好MySQL 8之后&#xff0c;我们查看如下的目录结构&#xff1a; 1.1 数据库文件的存放路径 MySQL数据库文件的存放路径&#xff1a;/var/…

商业综合体智能管理系统

自主研发的商业综合体智能管理系统和智能硬件&#xff0c;并针对行业不同需求&#xff0c;推出了不同行业的创新解決方案和服务。该系统能够提高商业综合体的管理效率和安全性&#xff0c;为商业综合体的经营和服务增加更多的价值。全自动智能完成无需人工干预&#xff0c;从而…

基于HTML5的手术室信息管理系统的设计与实现(源码+文档+数据库)

本文通过对现有手术室信息管理系统分析&#xff0c;设计了一套基于 HTML的手术室信息管理系统&#xff0c;实现了患者信息、手术记录及术后随访等功能&#xff0c;提高了手术室工作效率。 本系统实现了患者基本资料的录入及基本信息的查询&#xff0c;提供了术前准备情况及术中…

计算机网络—网络层

文章目录 网络层服务虚电路网络数据报网络 IPv4IP数据报IP数据报分片 IP编址&#xff08;IPv4&#xff09;有类IP地址IP子网划分子网掩码 无类IP地址&#xff08;CIDR&#xff09;DHCPNATICMP协议 路由算法链路状态路由算法距离向量路由算法不同子网之间的路由算法学习RIP协议O…

less和sass

less和sass 相比于css解决了什么问题&#xff1f; 答案&#xff1a;less和sass可以嵌套&#xff0c;可以使用变量&#xff1b;而css不可以 BEM/CSS modules/Atomic CSS/CSS in JS&#xff0c;这些方案应用于工程化中&#xff0c;解决了的问题是&#xff1a; 多人协同/大规模场…

机器人工程创新类课程补充说明-2023-2

仅供参考 之前一篇&#xff1a;机器人工程创新类课程补充说明-2023- 自主学习→自主研究→自主创新&#xff0c;这是一个循序渐进的过程&#xff0c;着急没用的&#xff0c;大部分学生&#xff0c;都卡在第一个阶段&#xff0c;自主学习的效率比较低&#xff0c;并且成果不突出…