PHP项目模板消息与推送

wen PHP项目 3

本文目录导读:

PHP项目模板消息与推送

  1. 核心概念区分
  2. 典型实现场景
  3. PHP 实现代码示例
  4. 常见问题与注意事项
  5. 技术扩展:单向推送 vs 实时推送
  6. 总结建议

在 PHP 项目中,“模板消息”和“推送”通常是针对微信公众号、小程序、企业微信等平台的功能,它们的核心逻辑是:将固定的消息结构与动态数据结合,并通过平台提供的 API 主动发送给用户。

下面我将从 概念区分常见场景PHP 实现思路注意事项 四个维度为你详细拆解。


核心概念区分

概念 微信公众号模板消息 小程序订阅消息 企业微信应用消息 通用推送(如 WebSocket)
触发方式 被动触发(用户点击、事件) 用户主动订阅后触发 后台主动推送 后台主动推送
模板形式 固定格式(政府/生活服务类) 需用户主动订阅(无限制) 支持文本/卡片/图文 自定义 JSON 格式
有效期 无,即时发送 用户订阅后有次数限制 无限制 实时
适合场景 订单通知、审核结果 表单提交后结果通知 审批、打卡提醒 站内信、实时数据

典型实现场景

微信公众号模板消息(以订单通知为例)

  • 目标:用户下单后,公众号向用户发送“订单支付成功”的消息。
  • 流程
    1. 用户生成订单 → 支付成功。
    2. 后端获取用户的 openid 和订单信息。
    3. 调用微信接口 POST https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN
    4. 传入模板 ID、参数(如商品名、金额、时间)。

小程序订阅消息

  • 目标:用户预约后,发送“预约成功”通知。
  • 流程
    1. 用户在小程序内点击“允许订阅”(授权一次订阅消息)。
    2. 后端记录 openidtemplate_id
    3. 小程序服务端调用 POST https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=ACCESS_TOKEN
    4. 注意:每次发送需用户订阅才能发送(不能自动无限次发送)。

企业内部系统(企业微信)

  • 目标:员工请假审批通过,推送结果。
  • 流程
    1. 审批后台调用企业微信 API POST https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=ACCESS_TOKEN
    2. 发送 textcardmarkdown 消息。
    3. 接收方为企业微信用户(通过 touser 指定)。

PHP 实现代码示例

1 核心依赖

  • 使用 httpfulcurl 发送 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:使用 SwooleRatchet 实现长连接实时推送(适合聊天、股票行情)。
  • Server-Sent Events (SSE):简单的单向实时推送(适合告警通知、状态更新)。
  • 第三方推送
    • 移动端:集成个推、极光、小米、华为推送。
    • Web 端:通过 WebSocket / Service Worker 实现。

总结建议

  1. 小型项目:直接使用 curl 或 EasyWeChat SDK 调用微信 API。
  2. 大型项目
    • 使用消息队列(如 RabbitMQ、Redis)异步处理发送任务。
    • 设计模板消息发送日志表(记录 openidtemplate_id状态错误码)。
  3. 特别注意:微信模板消息政策调整频繁(如 2020 年公众号模板消息改为一次性订阅消息),请务必阅读最新 微信官方文档
  4. 替代方案:如果你的场景不再适合模板消息,可考虑使用服务号菜单下发的客服消息二维码订阅消息

如果你需要针对特定平台(如微信公众号 vs 小程序 vs 企业微信)的详细代码示例,可以告诉我,我可以提供更具体的代码和配置说明。

抱歉,评论功能暂时关闭!