本文目录导读:

在 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 企业微信)的详细代码示例,可以告诉我,我可以提供更具体的代码和配置说明。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播