微信模板消息回调PHP怎么接收_处理模板消息发送结果教程【解答】
发布时间 - 2026-01-02 00:00:00 点击率:次微信模板消息无实时回调机制,需主动调用getTemplateMsgEvent接口轮询拉取发送结果;小程序适用,须用小程序access_token,返回含msgid、status等字段的JSON数组,需本地存储msgid关联状态并注意幂等处理。
微信模板消息发送后,不会主动回调你的服务器——这是最常被误解的一点。所谓“模板消息回调”,实际并不存在官方支持的实时回调机制;你看到的“发送结果通知”,其实是通过 get 接口(即「获取模板消息发送结果」)**主动轮询拉取**的,且仅限于开通了「消息推送」权限的小程序或部分认证服务号(公众号模板消息已停用)。PHP 侧要“接收处理”,核心是调用该接口 + 解析返回的 JSON 事件。
TemplateMsgEvent
为什么收不到自动回调?
微信模板消息(尤其是公众号)自 2025 年起已全面下线「发送成功/失败实时回调」能力。小程序虽保留 getTemplateMsgEvent,但它是 HTTP 拉取接口,不是服务端 POST 回调。如果你在文档里看到“回调 URL”配置项,那大概率混淆了「订阅消息」或「支付结果通知」等其他能力。
- 公众号模板消息:2025 年 10 月起正式下线,
send_template_message接口调用后只返回msgid,无后续事件推送 - 小程序模板消息(已升级为订阅消息):仍可通过
getTemplateMsgEvent拉取发送状态,但需满足:scope = subscribe_msg权限、调用频率 ≤ 2000 次/天、每次最多拉取 10 条 - 所谓“回调地址”在公众平台后台不可配,也无签名验证逻辑可对接
PHP 怎么拉取模板消息发送结果(小程序适用)
必须使用小程序 access_token 调用 https://api.weixin.qq.com/wxa/gettemplatetmsgevent?access_token=ACCESS_TOKEN,返回的是 JSON 数组,每条含 msgid、status(success / fail)、fail_reason(仅失败时有)等字段。
$access_token = 'your_access_token_here';
$url = "https://api.weixin.qq.com/wxa/gettemplatetmsgevent?access_token={$access_token}";
$response = file_get_contents($url);
$data = json_decode($response, true);
if (isset($data['errcode']) && $data['errcode'] !== 0) {
error_log('getTemplateMsgEvent failed: ' . $data['errmsg']);
} else {
foreach ($data['list'] as $event) {
if ($event['status'] === 'fail') {
error_log("Template send failed for msgid {$event['msgid']}: {$event['fail_reason']}");
}
}
}
- 注意:该接口返回的是「最近 7 天内」的发送事件,且每次调用后,已拉取的事件会从队列中移除(不可重复拉取)
-
access_token必须是小程序的,公众号的无效;且需提前在「小程序管理后台 → 接口权限」中开通获取模板消息发送结果 - 不要高频轮询(如每秒一次),建议按业务节奏每 5–30 分钟拉一次,避免触发频控(
errcode: 45009)
如何关联原始发送请求与拉取到的事件?
靠 msgid 字段双向绑定。调用 sendUniformMessage(小程序推荐)或旧版 sendTemplateMessage 时,响应体中的 msgid 是唯一数字 ID;拉取到的 getTemplateMsgEvent 返回数据里也有同名字段,二者严格一致。
- 务必在你自己的数据库中记录每次发送的
msgid+ 用户 openid + 模板ID + 发送时间 - 拉取事件后,用
msgid查询本地记录,更新状态字段(如status改为'sent'或'failed') - 失败原因如
"user reject"(用户拒收)、"invalid template_id"等,可用于运营分析或触发重发逻辑
真正容易被忽略的是:这个拉取机制没有事务保证,也没有幂等标识。如果 PHP 脚本拉取后崩溃,或网络超时未收到响应,那批事件就丢了——下次再拉会跳过它们。所以关键操作(如更新数据库状态)必须放在解析成功且确认写入后再执行,不能依赖“拉到了就认为处理完了”。
# php
# js
# json
# 微信
# access
# qq
# 小程序
# ai
# json数组
# 为什么
# 接口
# 事件
# 数据库
# http
# https
# 回调
# 的是
# 多拉
# 自己的
# 这是
# 也有
# 放在
# 尤其是
# 你在
# 它是
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信
如何利用DOS批处理实现定时关机操作详解
香港服务器建站指南:外贸独立站搭建与跨境电商配置流程
Laravel怎么判断请求类型_Laravel Request isMethod用法
MySQL查询结果复制到新表的方法(更新、插入)
HTML 中如何正确使用模板变量为元素的 name 属性赋值
如何自定义建站之星模板颜色并下载新样式?
浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】
标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南
Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解
魔方云NAT建站如何实现端口转发?
Java遍历集合的三种方式
香港服务器建站指南:免备案优势与SEO优化技巧全解析
Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复
Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】
网易LOFTER官网链接 老福特网页版登录地址
nodejs redis 发布订阅机制封装实现方法及实例代码
如何做网站制作流程,*游戏网站怎么搭建?
Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程
Laravel中间件如何使用_Laravel自定义中间件实现权限控制
如何注册花生壳免费域名并搭建个人网站?
Linux系统命令中screen命令详解
Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置
Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
如何在Windows环境下新建FTP站点并设置权限?
php静态变量怎么调试_php静态变量作用域调试技巧【解答】
个人摄影网站制作流程,摄影爱好者都去什么网站?
如何在阿里云完成域名注册与建站?
如何打造高效商业网站?建站目的决定转化率
香港网站服务器数量如何影响SEO优化效果?
如何在阿里云虚拟服务器快速搭建网站?
怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?
EditPlus中的正则表达式实战(5)
微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】
今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】
Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
如何在腾讯云服务器上快速搭建个人网站?
EditPlus 正则表达式 实战(3)
Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录
用yum安装MySQLdb模块的步骤方法
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
html文件怎么打开证书错误_https协议的html打开提示不安全【指南】
图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】
WEB开发之注册页面验证码倒计时代码的实现
Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程
如何用景安虚拟主机手机版绑定域名建站?

