本文目录导读:

在 PHP 项目中,“模板消息”和“推送”通常是针对微信公众号、小程序、企业微信等平台的功能,它们的核心逻辑是:将固定的消息结构与动态数据结合,并通过平台提供的 API 主动发送给用户。
下面我将从 概念区分、常见场景、PHP 实现思路、注意事项 四个维度为你详细拆解。
核心概念区分
| 概念 | 微信公众号模板消息 | 小程序订阅消息 | 企业微信应用消息 | 通用推送(如 WebSocket) |
|---|---|---|---|---|
| 触发方式 | 被动触发(用户点击、事件) | 用户主动订阅后触发 | 后台主动推送 | 后台主动推送 |
| 模板形式 | 固定格式(政府/生活服务类) | 需用户主动订阅(无限制) | 支持文本/卡片/图文 | 自定义 JSON 格式 |
| 有效期 | 无,即时发送 | 用户订阅后有次数限制 | 无限制 | 实时 |
| 适合场景 | 订单通知、审核结果 | 表单提交后结果通知 | 审批、打卡提醒 | 站内信、实时数据 |
典型实现场景
微信公众号模板消息(以订单通知为例)
- 目标:用户下单后,公众号向用户发送“订单支付成功”的消息。
- 流程:
- 用户生成订单 → 支付成功。
- 后端获取用户的
openid和订单信息。 - 调用微信接口
POST https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN - 传入模板 ID、参数(如商品名、金额、时间)。
小程序订阅消息
- 目标:用户预约后,发送“预约成功”通知。
- 流程:
- 用户在小程序内点击“允许订阅”(授权一次订阅消息)。
- 后端记录
openid和template_id。 - 小程序服务端调用
POST https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=ACCESS_TOKEN - 注意:每次发送需用户订阅才能发送(不能自动无限次发送)。
企业内部系统(企业微信)
- 目标:员工请假审批通过,推送结果。
- 流程:
- 审批后台调用企业微信 API
POST https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=ACCESS_TOKEN - 发送
textcard或markdown消息。 - 接收方为企业微信用户(通过
touser指定)。
- 审批后台调用企业微信 API
PHP 实现代码示例
1 核心依赖
- 使用
httpful或curl发送 HTTP 请求。 - 推荐使用
EasyWeChat(PHP 微信开发 SDK)简化开发。
2 纯 PHP 实现(发送微信公众号模板消息)
<?php
class WechatTemplate
{
private $appId = 'Your_AppId';
private $appSecret = 'Your_AppSecret';
public function sendTemplateMessage($openid, $templateId, $data, $url = '')
{
$accessToken = $this->getAccessToken();
if (!$accessToken) {
return false;
}
$postData = [
'touser' => $openid,
'template_id' => $templateId,
'url' => $url,
'data' => $data
];
$url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token={$accessToken}";
return $this->httpPost($url, json_encode($postData, JSON_UNESCAPED_UNICODE));
}
private function getAccessToken()
{
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$this->appId}&secret={$this->appSecret}";
$result = $this->httpGet($url);
$data = json_decode($result, true);
return $data['access_token'] ?? null;
}
private function httpGet($url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($ch);
curl_close($ch);
return $response;
}
private function httpPost($url, $data)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($ch);
curl_close($ch);
return json_decode($response, true);
}
}
// 使用示例
$wechat = new WechatTemplate();
$data = [
'first' => ['value' => '您已成功下单!', 'color' => '#173177'],
'keyword1' => ['value' => '订单号20240321001', 'color' => '#173177'],
'keyword2' => ['value' => '50.00元', 'color' => '#173177'],
'remark' => ['value' => '感谢您的购买', 'color' => '#173177']
];
$result = $wechat->sendTemplateMessage('用户openid', '模板ID', $data, 'https://example.com/order/123');
3 使用 EasyWeChat SDK(推荐)
use EasyWeChat\Factory;
$config = [
'app_id' => 'xxx',
'secret' => 'xxx',
'token' => 'xxx',
'aes_key' => 'xxx',
];
$app = Factory::officialAccount($config);
$app->template_message->send([
'touser' => '用户openid',
'template_id' => '模板ID',
'url' => 'https://example.com',
'data' => [
'first' => '您好,您的订单已支付成功!',
'keyword1' => '商品A',
'keyword2' => '50.00元',
'remark' => '祝您生活愉快!',
],
]);
常见问题与注意事项
| 问题 | 原因 | 解决方案 |
|---|---|---|
| ERRCODE: 40001 | access_token 无效 | 重新获取 access_token(建议缓存 7200 秒) |
| ERRCODE: 40037 | 模板 ID 不正确 | 在微信公众平台后台确认模板 ID |
| ERRCODE: 41028 | 用户未关注公众号 | 无法给未关注用户发送模板消息 |
| ERRCODE: 43101 | 用户拒绝接收模板消息 | 引导用户重新关注或自行开启 |
| 最大发送量 | 微信对模板消息有频率限制(如每用户每天可接收上限) | 合理规划发送策略,避免骚扰 |
| 小程序订阅消息次数 | 每次订阅仅可使用 1 次 | 引导用户多次订阅(但需注意用户体验) |
技术扩展:单向推送 vs 实时推送
除了第三方平台的消息推送,PHP 项目中还可能用到自建推送服务:
- WebSocket + PHP:使用
Swoole或Ratchet实现长连接实时推送(适合聊天、股票行情)。 - Server-Sent Events (SSE):简单的单向实时推送(适合告警通知、状态更新)。
- 第三方推送:
- 移动端:集成个推、极光、小米、华为推送。
- Web 端:通过 WebSocket / Service Worker 实现。
总结建议
- 小型项目:直接使用 curl 或 EasyWeChat SDK 调用微信 API。
- 大型项目:
- 使用消息队列(如 RabbitMQ、Redis)异步处理发送任务。
- 设计模板消息发送日志表(记录
openid、template_id、状态、错误码)。
- 特别注意:微信模板消息政策调整频繁(如 2020 年公众号模板消息改为一次性订阅消息),请务必阅读最新 微信官方文档。
- 替代方案:如果你的场景不再适合模板消息,可考虑使用服务号菜单下发的客服消息或二维码订阅消息。
如果你需要针对特定平台(如微信公众号 vs 小程序 vs 企业微信)的详细代码示例,可以告诉我,我可以提供更具体的代码和配置说明。