微信小程序结合后端php发送模版消息

前端:

<view class="container"><button bindtap="requestSubscribeMessage">订阅消息</button>
</view>
// index.js
Page({data: {tmplIds: ['UTgCUfsjHVESf5FjOzls0I9i_FVS1N620G2VQCg1LZ0'] // 使用你的模板ID},requestSubscribeMessage() {const tmplIds = this.data.tmplIds;if (wx.requestSubscribeMessage) {// 使用基础库 2.4.4 及以上版本wx.requestSubscribeMessage({tmplIds: tmplIds,success: (res) => {// 处理订阅消息成功的结果console.log('Subscribe message success:', res);// 遍历结果,检查用户是否同意订阅for (let tmplId of tmplIds) {if (res[tmplId] === 'accept') {console.log(`Template ID ${tmplId} subscription accepted.`);} else {console.log(`Template ID ${tmplId} subscription denied or filtered.`);}}},fail: (err) => {// 处理订阅消息失败的结果console.error('Subscribe message failed:', err);},complete: () => {// 接口调用结束console.log('RequestSubscribeMessage complete');}});} else {// 兼容低版本wx.showModal({title: '提示',content: '当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试。'});}},onLoad() {// 页面加载时的逻辑}
});

后端:php7.4

/*function getWeChatToken($appid, $secret) {$url = "https://api.weixin.qq.com/cgi-bin/token";$params = http_build_query(['grant_type' => 'client_credential','appid' => $appid,'secret' => $secret,]);$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url . '?' . $params);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); // 忽略 SSL 证书验证curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, true); // 忽略 SSL 证书验证$response = curl_exec($ch);if (curl_errno($ch)) {echo 'cURL Error: ' . curl_error($ch);return null;}curl_close($ch);return json_decode($response, true);
}// 替换为你的 AppID 和 AppSecret
$appid = '';
$secret = '';$tokenInfo = getWeChatToken($appid, $secret);if ($tokenInfo && isset($tokenInfo['access_token'])) {echo 'Access Token: ' . $tokenInfo['access_token'];$accessToken = $tokenInfo['access_token'];
} else {echo 'Failed to get access token. Response: ' . json_encode($tokenInfo);
}*/function sendSubscribeMessage($accessToken, $templateId, $touser, $data, $page = '', $miniprogramState = 'formal', $lang = 'zh_CN') {$url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=$accessToken";$postData = json_encode(['touser' => $touser,'template_id' => $templateId,'page' => $page,'data' => $data,'miniprogram_state' => $miniprogramState,'lang' => $lang,]);$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_POST, 1);curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 忽略 SSL 证书验证curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 忽略 SSL 证书验证$response = curl_exec($ch);if (curl_errno($ch)) {echo 'cURL Error: ' . curl_error($ch);return null;}curl_close($ch);return json_decode($response, true);
}// 替换为你的 AccessToken, TemplateID, Touser, 和 Data
$accessToken = 'your_access_token_here'; // 请替换为实际的 access token
$templateId = 'UTgCUfsjHVESf5FjOzls0I9i_FVS1N620G2VQCg1LZ0';
$touser = 'oCmkd7cO3vjwvHhLUtjDJwklvLOE';
$data = ['time1' => ['value' => '2024-7-25 12:23:25'],'amount2' => ['value' => '128'],'thing3' => ['value' => '黑金卡'],'thing4' => ['value' => '24小时内发货'],'character_string5' => ['value' => '202407251236962365']
];
$page = 'index?foo=bar'; // 可选
$miniprogramState = 'formal'; // 可选,默认 'formal'
$lang = 'zh_CN'; // 可选,默认 'zh_CN'$response = sendSubscribeMessage($accessToken, $templateId, $touser, $data, $page, $miniprogramState, $lang);if ($response && isset($response['errcode'])) {if ($response['errcode'] == 0) {echo 'Message sent successfully!';} else {echo 'Failed to send message. Error code: ' . $response['errcode'] . ', Error message: ' . $response['errmsg'];// 根据错误码提供解决方案switch ($response['errcode']) {case 40001:echo ' - 获取 access_token 时 AppSecret 错误,或者 access_token 无效。请开发者认真比对 AppSecret 的正确性,或查看是否正在为恰当的公众号调用接口。';break;case 40003:echo ' - 不合法的 OpenID ,请开发者确认 OpenID (该用户)是否已关注公众号,或是否是其他公众号的 OpenID。';break;case 40014:echo ' - 不合法的 access_token ,请开发者认真比对 access_token 的有效性(如是否过期),或查看是否正在为恰当的公众号调用接口。';break;case 40037:echo ' - 不合法的 template_id。';break;case 43101:echo ' - 用户未订阅消息。检查订阅弹窗回调结果或事件推送确认是否订阅成功,检查是否一次性订阅的次数之前已下发完。';break;case 43107:echo ' - 订阅消息能力封禁。检查账号是否被封禁订阅消息能力,检查模板id对应的模板是否被封禁。';break;case 43108:echo ' - 并发下发消息给同一个粉丝。检查是否有同时下发多个消息给同一粉丝的情况。';break;case 45168:echo ' - 命中敏感词。检查下发消息中是否带有敏感词。';break;case 47003:echo ' - 参数错误。根据wiki文档检查data结构格式是否正确,检查各个关键词是否满足对应规则。';break;default:echo ' - 未知错误,请参考微信公众平台文档。';break;}}
} else {echo 'Failed to send message. Invalid response.';
}

php8.0及以上版本

function sendSubscribeMessage(string $accessToken,string $templateId,string $touser,array $data,string $page = '',string $miniprogramState = 'formal',string $lang = 'zh_CN'
): ?array {$url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=$accessToken";$postData = json_encode(['touser' => $touser,'template_id' => $templateId,'page' => $page,'data' => $data,'miniprogram_state' => $miniprogramState,'lang' => $lang,]);$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);curl_setopt($ch, CURLOPT_POST, true);curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 忽略 SSL 证书验证curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 忽略 SSL 证书验证$response = curl_exec($ch);if (curl_errno($ch)) {echo 'cURL Error: ' . curl_error($ch);return null;}curl_close($ch);return json_decode($response, true);
}// 替换为你的 AccessToken, TemplateID, Touser, 和 Data
$accessToken = 'your_access_token_here'; // 请替换为实际的 access token
$templateId = 'UTgCUfsjHVESf5FjOzls0I9i_FVS1N620G2VQCg1LZ0';
$touser = 'oCmkd7cO3vjwvHhLUtjDJwklvLOE';
$data = ['time1' => ['value' => '2024-7-25 12:23:25'],'amount2' => ['value' => '128'],'thing3' => ['value' => '黑金卡'],'thing4' => ['value' => '24小时内发货'],'character_string5' => ['value' => '202407251236962365']
];
$page = 'index?foo=bar'; // 可选
$miniprogramState = 'formal'; // 可选,默认 'formal'
$lang = 'zh_CN'; // 可选,默认 'zh_CN'$response = sendSubscribeMessage($accessToken, $templateId, $touser, $data, $page, $miniprogramState, $lang);if ($response && isset($response['errcode'])) {if ($response['errcode'] === 0) {echo 'Message sent successfully!';} else {echo 'Failed to send message. Error code: ' . $response['errcode'] . ', Error message: ' . $response['errmsg'];// 根据错误码提供解决方案match ($response['errcode']) {40001 => print(' - 获取 access_token 时 AppSecret 错误,或者 access_token 无效。请开发者认真比对 AppSecret 的正确性,或查看是否正在为恰当的公众号调用接口。'),40003 => print(' - 不合法的 OpenID ,请开发者确认 OpenID (该用户)是否已关注公众号,或是否是其他公众号的 OpenID。'),40014 => print(' - 不合法的 access_token ,请开发者认真比对 access_token 的有效性(如是否过期),或查看是否正在为恰当的公众号调用接口。'),40037 => print(' - 不合法的 template_id。'),43101 => print(' - 用户未订阅消息。检查订阅弹窗回调结果或事件推送确认是否订阅成功,检查是否一次性订阅的次数之前已下发完。'),43107 => print(' - 订阅消息能力封禁。检查账号是否被封禁订阅消息能力,检查模板id对应的模板是否被封禁。'),43108 => print(' - 并发下发消息给同一个粉丝。检查是否有同时下发多个消息给同一粉丝的情况。'),45168 => print(' - 命中敏感词。检查下发消息中是否带有敏感词。'),47003 => print(' - 参数错误。根据wiki文档检查data结构格式是否正确,检查各个关键词是否满足对应规则。'),default => print(' - 未知错误,请参考微信公众平台文档。'),};}
} else {echo 'Failed to send message. Invalid response.';
}

thinkphp8+easywechat6.0 在php8.3下的测试,测试成功

declare (strict_types = 1);namespace app\index\controller;use EasyWeChat\MiniApp\Application;class Msg
{public function index(){$config = ['app_id' => '', // 请填写小程序的appId'secret' => '', // 请填写小程序的appsecret'token' => 'easywechat','aes_key' => '','http' => ['throw'  => true, // 状态码非 200、300 时是否抛出异常,默认为开启'timeout' => 5.0,'retry' => true, // 使用默认重试配置],];$app = new Application($config);$accessToken = $app->getAccessToken();$access_token = $accessToken->getToken(); // string// return $access_token;$api = $app->getClient();$data = ['time1' => ['value' => '2024-7-25 12:23:25'],'amount2' => ['value' => '128'],'thing3' => ['value' => '黑金卡'],'thing4' => ['value' => '24小时内发货'],'character_string5' => ['value' => '202407251236962365']];$response = $api->postJson('/cgi-bin/message/subscribe/send?access_token='.$access_token, ['touser' => 'oCmkd7cO3vjwvHhLUtjDJwklvLOE','template_id' => 'UTgCUfsjHVESf5FjOzls0I9i_FVS1N620G2VQCg1LZ0','data' => $data]);return $response->getContent();}
}

返回的数据为json

{"errcode": 0,"errmsg": "ok","msgid": 3563045918154752007
}

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

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

相关文章

APT 安装软件详细教程

文章目录 APT 安装软件详细教程APT 概述APT 的基本命令APT 命令详解安装软件包更新和升级软件包删除软件包搜索和查找软件包管理软件包依赖清理软件包缓存APT 配置软件源配置自定义软件源常见问题及解决方案解决软件包依赖问题处理软件源错误其他常见问题使用 APT 的最佳实践总…

在Postman中引用JS库

前言 在做接口测试时&#xff0c;出于安全因素&#xff0c;请求参数需要做加密或者加上签名才能正常请求&#xff0c;例如&#xff1a;根据填写的请求参数进行hash计算进行签名。postman作为主流的接口调试工具也是支持请求预处理的&#xff0c;即在请求前使用JavaScript脚本对…

昇思MindSpore学习入门-自动混合精度

混合精度&#xff08;Mix Precision&#xff09;训练是指在训练时&#xff0c;对神经网络不同的运算采用不同的数值精度的运算策略。在神经网络运算中&#xff0c;部分运算对数值精度不敏感&#xff0c;此时使用较低精度可以达到明显的加速效果&#xff08;如conv、matmul等&am…

OSI七层模型详解

OSI七层模型 OSI&#xff08;Open System Interconnect&#xff09;&#xff0c;即开放式系统互连。 一般都叫OSI参考模型&#xff0c;是ISO组织在1985年研究的网络互连模型。该体系结构标准定义了网络互连的七层框架&#xff08;物理层、数据链路层、网络层、传输层、会话层、…

[玄机]流量特征分析-常见攻击事件 tomcat

[玄机]流量特征分析-常见攻击事件 tomcat 题目做法及思路解析&#xff08;个人分享&#xff09; Tomcat是一个开源的Java Servlet容器&#xff0c;它实现了Java Servlet和JavaServer Pages (JSP) 技术&#xff0c;提供了一个运行这些应用程序的Web服务器环境。Tomcat由A…

go程序在windows服务中优雅开启和关闭

本篇主要是讲述一个go程序&#xff0c;如何在windows服务中优雅开启和关闭&#xff0c;废话不多说&#xff0c;开搞&#xff01;&#xff01;&#xff01;   使用方式&#xff1a;go程序 net服务启动 Ⅰ 开篇不利 Windows go进程编译后&#xff0c;为一个.exe文件,直接执行即…

语言转文字

因为工作原因需要将语音转化为文字&#xff0c;经常搜索终于找到一个免费的好用工具&#xff0c;记录下使用方法 安装Whisper 搜索Colaboratory 右上方链接服务 执行 !pip install githttps://github.com/openai/whisper.git !sudo apt update && sudo apt install f…

NSSRound#4 Team

[NSSRound#4 SWPU]1zweb 考察&#xff1a;phar的反序列化 1.打开环境&#xff0c;审计代码 1.非预期解 直接用file伪协议读取flag,或直接读取flag file:///flag /flag 2.正常解法 用读取文件读取index.php,upload.php的源码 index.php: <?php class LoveNss{publi…

hadoop学习(一)

一.hadoop概述 1.1hadoop优势 1&#xff09;高可靠性&#xff1a;Hadoop底层维护多个数据副本&#xff0c;即使Hadoop某个计算元素或存储出现故障&#xff0c;也不会导致数据的丢失。 2&#xff09;高扩展性&#xff1a;在集群间分配任务数据&#xff0c;可方便扩展数以千计…

c++ 内存管理(newdeletedelete[])

因为在c里面新增了类&#xff0c;所以我们在有时候会用malloc来创建类&#xff0c;但是这种创建只是单纯的开辟空间&#xff0c;没有什么默认构造的。同时free也是free的表面&#xff0c;如果类里面带有指针指向堆区的成员变量就会free不干净。 所以我们c增加了new delete和de…

Python --Pandas库基础方法(2)

文章目录 Pandas 变量类型的转换查看各列数据类型改变数据类型 重置索引删除行索引和切片seriesDataFrame取列按行列索引选择loc与iloc获取 isin()选择query()的使用排序用索引排序使用变量值排序 修改替换变量值对应数值的替换 数据分组基于拆分进行筛选 分组汇总引用自定义函…

springcloud RocketMQ 客户端是怎么走到消费业务逻辑的 - debug step by step

springcloud RocketMQ &#xff0c;一个mq消息发送后&#xff0c;客户端是怎么一步步拿到消息去消费的&#xff1f;我们要从代码层面探究这个问题。 找的流程图&#xff0c;有待考究。 以下我们开始debug&#xff1a; 拉取数据的线程&#xff1a; PullMessageService.java 本…

126M全球手机基站SHP数据分享

数据是GIS的血液&#xff01; 我们在《2.8亿东亚五国建筑数据分享》一文中&#xff0c;为你分享过东亚五国建筑数据。 现在再为你分享全球手机基站SHP数据&#xff0c;你可以在文末查看该数据的领取方法。 全球手机基站SHP数据 全球手机基站数据是OpenCelliD团队创建由社区…

【Spring Cloud】Sleuth +Zinkin 实现链路追踪并持久化的解决方案

文章目录 前言链路追踪介绍Sleuth入门Sleuth介绍TraceSpanAnnotation Sleuth入门1、引入依赖2、修改配置文件3、网关路由配置4、演示 Zipkin的集成ZipKin介绍ZipKin服务端安装Zipkin客户端集成1、添加依赖2、添加配置3、访问微服务4、演示 Zipkin数据持久化使用mysql实现数据持…

现代Java开发:使用jjwt实现JWT认证

前言 jjwt 库 是一个流行的 Java 库&#xff0c;用于创建和解析 JWT。我在学习spring security 的过程中看到了很多关于jwt的教程&#xff0c;其中最流行的就是使用jjwt实现jwt认证&#xff0c;但是教程之中依然使用的旧版的jjwt库&#xff0c;许多的类与方法已经标记弃用或者…

多家隧道代理价格:阿布云、快代理、小象代理、熊猫代理和亿牛云……

随着奥运的热度攀升&#xff0c;各大品牌也在抓紧时机赶上这波奥运热潮&#xff0c;随之而来的大量数据信息收集和分析工作也接踵而至&#xff0c;在这一数据采集过程中&#xff0c;HTTP代理的质量和价格对企业的效率和成本调控重要性不言而喻。我们大部分人在日常购买产品的时…

Revit中如何添加剖面?快速实现剖面图的方法汇总

Revit中创建剖面以及剖面视图一般有两种方法&#xff0c;一是使用Revit原生的剖面功能&#xff0c;而是使用Revit插件BIM建模助手进行便捷的剖面操作以及剖面视图创建。 Revit原生的剖面功能&#xff0c;点击后可以自由拉伸剖面方向、范围&#xff0c;放置完剖面符号后&#xf…

【ROS 最简单教程 003/300】ROS 快速体验:Hello World

开始自己的第一次尝试叭 ~ Hello World 本篇是 C 版本&#xff0c;如需 python 版本 &#x1f449; python 版本指路 ROS 中程序的实现流程&#xff1a; 创建工作空间 ( &#x1f499; 如 tutu_ws) &#xff0c;进入并编译 mkdir -p tutu_ws/src cd tutu_ws catkin_make在 src …

【C语言】结构体详解 -《探索C语言的 “小宇宙” 》

目录 C语言结构体&#xff08;struct&#xff09;详解结构体概览表1. 结构体的基本概念1.1 结构体定义1.2 结构体变量声明 2. 结构体成员的访问2.1 使用点运算符&#xff08;.&#xff09;访问成员输出 2.2 使用箭头运算符&#xff08;->&#xff09;访问成员输出 3. 结构体…