微信小程序模板消息已于2024年10月15日全面下线,PHP后端须改用订阅消息:前端需调用wx.requestSubscribeMessage获取授权,后端调用/cgibin/message/subscribe/send接口发送,且template_id、scene、access_token均需匹配订阅消息规范。

微信小程序模板消息在 2024 年底已全面下线,PHP 后端无法再调用 /cgi-bin/message/wxopen/template/send 接口发送——这不是你的代码问题,是微信官方策略变更。
为什么现在发不出模板消息?
微信于 2024 年 10 月 15 日起正式停止小程序「模板消息」能力,所有历史模板 ID 失效,接口返回 {"errcode":43102,"errmsg":"template not exist"} 或直接 404。官方文档已移除相关章节,仅保留「订阅消息」作为唯一合法替代方案。
- 你看到的旧教程、示例代码、甚至本地调试成功的现象,大概率发生在 2024 年 10 月前,或误用了公众号模板消息接口(
/cgi-bin/message/template/send) - 小程序后台「模板库」入口已隐藏,提交新模板会被提示「该功能已下线」
-
form_id仍可获取,但已无任何接口接收它——不是参数错,是收件箱没了
PHP 必须改用「订阅消息」:三步不可跳过
订阅消息需用户主动授权,且每次推送必须对应一次有效订阅关系。PHP 后端不能“自动发”,只能“按约发”。
-
前端必须先触发
wx.requestSubscribeMessage,传入你将要用的template_id(从「订阅消息」模板库申请,非原模板库) - 用户点击「允许」后,小程序会收到
res.errMsg === "requestSubscribeMessage:ok",此时才可安全调用 PHP 接口 - PHP 调用的是新接口:
https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=ACCESS_TOKEN,注意路径含subscribe,不是template - 请求体中不再需要
form_id,但必须带scene(由前端传入,用于标识订阅场景,如"order_success")
PHP 发送订阅消息的关键代码片段
以下为最小可用逻辑,省略 access_token 缓存和错误重试(这些仍是必须项):
立即学习“PHP免费学习笔记(深入)”;
启科网络商城系统由启科网络技术开发团队完全自主开发,使用国内最流行高效的PHP程序语言,并用小巧的MySql作为数据库服务器,并且使用Smarty引擎来分离网站程序与前端设计代码,让建立的网站可以自由制作个性化的页面。 系统使用标签作为数据调用格式,网站前台开发人员只要简单学习系统标签功能和使用方法,将标签设置在制作的HTML模板中进行对网站数据、内容、信息等的调用,即可建设出美观、个性的网站。
$data = [
'touser' => $openid,
'template_id' => 'xxx-xxx-xxx', // 订阅消息模板ID,非原模板ID
'page' => 'pages/order/detail',
'data' => [
'thing1' => ['value' => '订单已支付'],
'amount2' => ['value' => '¥29.90'],
'time3' => ['value' => date('Y-m-d H:i')]
],
'miniprogram_state' => 'trial' // 可选:'developer', 'trial', 'formal'
];
$json = json_encode($data, JSON_UNESCAPED_UNICODE);
$url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" . $access_token;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $json);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
$result = curl_exec($ch);
curl_close($ch);
若返回 errcode: 0,说明送达;若返回 43104(invalid subscribe template id),说明模板 ID 未在「订阅消息」中启用,或未通过类目审核。
最容易被忽略的兼容性坑
很多团队卡在「用户点了允许,后端还是发失败」,核心原因有三个:
- 混淆了「订阅模板」和「服务通知模板」:后者需单独申请「服务类目」并过审,不能复用普通订阅模板 ID
- 未检查
scene值是否与前端订阅时一致——PHP 接口不校验它,但微信后台会静默丢弃不匹配的推送 - access_token 误用公众号的:小程序订阅消息必须用小程序的
appid和secret获取,且 token 权限域不同
真机测试前务必确认:小程序管理后台 → 开发管理 → 订阅消息 → 模板列表里状态是「已启用」,且类目匹配业务场景。线上环境没这一步,100% 失败。










