PHP 实现微信小程序订阅消息推送:Access Token 自动获取与缓存刷新
小程序订阅消息是开发者与用户建立长期沟通的重要渠道,支持个性化内容推送且用户体验更佳。在通过 PHP 调用接口发送消息前,核心难点在于妥善管理接口所需的 access_token,确保其在有效期内并自动更新。
准备工作
在编写代码之前,需要准备好以下信息:
- 小程序 AppID 和 AppSecret:用于向微信服务器申请 access_token。
- 消息模板 ID:在微信公众平台后台配置好的订阅消息模板 ID。
- 接收用户的 OpenID:指定接收消息的小程序用户唯一标识。
- 服务器环境:需要支持 PHP cURL 扩展,且服务器能够访问外网 API。
核心实现逻辑
由于 access_token 的全局有效时长为 2 小时(7200 秒),直接每次请求都去拉取会触发频率限制。因此,最佳实践是将 token 保存到本地文件中,并在过期前自动重新获取。
第1步:构建封装类
将获取 Token、缓存管理及发送消息的逻辑封装为静态方法,便于在其他业务中调用。我们需要一个配置文件路径来存储 token 数据。
<?php
namespace MyWeChat;
class WeChatApi
{
// ... (此处省略私有工具方法的详细代码块以节省空间,见完整代码部分)
}
第2步:获取与刷新 Access Token
核心流程判断是否存在有效的缓存文件。若不存在或已过期,则发起新的 HTTP 请求。请注意,为了保证稳定性,我们通常会在有效期结束前 60 秒进行替换。

具体判断逻辑如下:
- 读取
access_token.php中的expires_at。 - 如果当前时间小于
expires_at,直接使用缓存的值。 - 否则,调用刷新接口:
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$appsecret。 - 将新拿到的
access_token和有效期写入本地文件。
第3步:组装并提交订阅消息请求
使用正确的 access_token,按照 JSON 格式组装消息体,并通过 cURL 的 POST 方式发送至微信接口。sendDyxx.php 中的配置与调用方式如下:
<?php
// 假设上述 WeChatApi 类已在该文件中定义...
$APPID = '你的AppID';
$APPSECRET = '你的AppSecret';
$template_id = '你的订阅消息模板ID';
$openid = 'o9usm0bhIkcbAyxM0RzDXi9tjHhM'; // 测试用 OpenID
$data_template = [
"character_string1" => ["value" => "2023-08-03"],
"thing4" => ["value" => "开发测试"]
];
// 执行静态方法
WeChatApi::sendMessageWithAccessToken($APPID, $APPSECRET, $template_id, $openid, $data_template);
?>常见问题排错
如果在测试过程中遇到发送失败的情况,请依次检查:
- Template ID 是否正确:确认使用了当前有效的模板 ID,且字段名(如
thing4)与模板后台设置完全一致。 - OpenID 来源:确保
touser对应的 OpenID 确实是授权登录过该小程序的用户。 - cURL 报错信息:打印
curl_error($ch)查看网络错误或 JSON 语法错误,确保json_encode转换无误。 - Token 权限:如果报
40001或40003,通常是 Token 失效或被覆盖,检查文件读写权限及并发情况。
技术拓展
对于日常业务,单个或少量推送可以直接如上操作。但如果拥有海量用户需要进行订阅消息群发,频繁的文件读写可能导致阻塞。此时建议引入 Redis 异步消息队列(如 Redis List 或 Topic),将任务下发给后台 Cron Job 或常驻进程进行处理,以实现高并发下的稳定推送。
总结
通过上述 PHP 类,我们实现了 access_token 的自动化生命周期管理,解决了手动刷新麻烦且易出错的痛点。这种模块化设计不仅保证了代码的可移植性,也为后续接入更多微信能力(如客服消息等)奠定了基础。
以上就是 PHP 实现微信小程序订阅消息推送及 Access Token 自动缓存刷新的详细内容。更多关于小程序开发与 PHP 实战的资料,请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









