ThinkPHP实现微信小程序订阅消息需两步:前端用户主动授权订阅+后端用有效模板ID向用户openid推送;模板ID须从微信公众平台模板库选用或审核通过,且推送前用户必须调用wx.requestSubscribeMessage授权,后端使用EasyWeChat调用subscribe_message->send发送。

ThinkPHP 实现微信小程序订阅消息,核心就两步:用户前端主动订阅 + 后端按模板 ID 推送。模板 ID 不是随便写的,必须来自微信官方模板库或审核通过的自定义模板,且每次推送都得带用户明确授权过的 ID。
模板 ID 怎么来?不能自己编
模板 ID 必须从微信公众平台(mp.weixin.qq.com)获取:
- 登录小程序后台 → 「功能」→「订阅消息」→ 进入模板库
- 搜索关键词(如“订单通知”“签到提醒”),选中合适模板后点击「选用」,系统自动生成唯一模板 ID
- 若没有匹配模板,可点击「申请添加新模板」,填写标题、内容、使用场景,提交后等微信审核(通常1–3个工作日)
- 选用/审核通过后,模板 ID 长这样:
6io5lFLo4OEdNjl2_FKxHErBqXv3EF1QRZEm6RMdHLQ,复制保存,后端代码里直接用
前端必须先让用户点“允许”,否则后端推不了
微信强制要求:用户未主动订阅前,后端调用接口必失败。小程序里需调用 wx.requestSubscribeMessage:
- 在页面 .js 中写(注意传入你拿到的真实模板 ID):
<!-- index.wxml -->
<button bindtap="handleSubscribe">开启通知</button>
立即学习“PHP免费学习笔记(深入)”;
// index.js
handleSubscribe() {
wx.requestSubscribeMessage({
tmplIds: ['6io5lFLo4OEdNjl2_FKxHErBqXv3EF1QRZEm6RMdHLQ'],
success: (res) => {
if (res['6io5lFLo4OEdNjl2_FKxHErBqXv3EF1QRZEm6RMdHLQ'] === 'accept') {
wx.showToast({ title: '已同意接收通知', icon: 'success' });
}
},
fail: () => {
wx.showToast({ title: '未授权,无法发送', icon: 'none' });
}
});
}
- 用户点击“允许”后,该模板 ID 才算被授权;后续后端可用它向这个用户的 openid 推送一次(单次授权仅限一次下发)
后端推送:ThinkPHP + 模板 ID + 用户 openid + access_token
推荐用 EasyWeChat 6.x(兼容 TP5/6/8),配置好小程序 app_id 和 secret 后即可发:
- 在
config/wechat.php中填入小程序凭证:
return [
'mini_program' => [
'app_id' => 'wxd1234567890abcde',
'secret' => 'your_miniapp_secret_here',
],
];
- 控制器中推送示例(TP8 写法):
use EasyWeChat\MiniApp\Application;
$app = new Application(config('wechat.mini_program'));
$data = [
'template_id' => '6io5lFLo4OEdNjl2_FKxHErBqXv3EF1QRZEm6RMdHLQ',
'touser' => 'o8oTs5AwK3Roma4mwtj6oNE7BIbk', // 用户真实 openid
'page' => 'pages/order/detail?id=123',
'data' => [
'thing1' => ['value' => '订单已支付'],
'date1' => ['value' => date('Y-m-d H:i')],
'number1' => ['value' => '¥299.00'],
],
];
$app->subscribe_message->send($data);
- 注意:
touser是用户在当前小程序的 openid,不是 unionid 或公众号 openid - 每个模板字段 key(如
thing1)必须与模板库里定义的 keyword 完全一致,大小写敏感
常见报错和避坑点
推送失败多数卡在这几个地方:
- “errcode: 43101”:用户没点允许,或点了“拒绝”,或授权的模板 ID 和推送时用的不一致
- “errcode: 40003”:touser 填错了,不是当前小程序的 openid(比如误用了公众号的)
- “errcode: 41028”:模板 ID 无效,可能已被删除、未审核通过,或不属于当前小程序主体
- access_token 过期(2小时):EasyWeChat 默认会自动刷新,但若手动拼 URL 调用 API,需确保 token 有效
- 模板字段 value 值为空字符串或 null:微信校验不通过,建议统一用
['value' => $val ?: '—']防空



















