微信公众号接口对接需通过https和签名验证,服务器须响应get验证请求并用file_get_contents读取post的xml消息,access_token须缓存且提前刷新,消息响应须5秒内完成。

微信公众号接口对接不是“填个URL就能跑”,第一次配置失败,八成卡在签名验证或 HTTPS 上。核心就两点:服务器必须响应微信的 GET 验证请求,且后续所有消息交互必须走 POST + XML。
为什么 signature 验证总失败?
这不是 PHP 写错了,而是微信和你对“排序”“拼接”“大小写”的理解不一致。
-
token必须和公众号后台填的一模一样,区分大小写,不能有多余空格 -
sort($tmpArr, SORT_STRING)必须显式指定SORT_STRING,否则数字字符串如"123"和"99"可能被当数值排错 - 参与 SHA1 的三参数是
$token、$timestamp、$nonce—— 不是$_GET['token'](微信根本没传这个) - 验证阶段只处理 GET 请求;一旦返回
$echostr,微信就认为你“活了”,之后所有用户消息都改用 POST 发 XML
如何正确接收并解析用户发来的消息?
别用 $_POST,微信 POST 的是原始 XML,不是表单数据。
- 必须用
file_get_contents('php://input')读取原始 body - 用
simplexml_load_string()解析,不是json_decode - 注意 PHP 默认会把 XML 标签转成对象属性,访问
$xml->MsgType前要先判空,否则报 Notice - 回复时必须输出标准 XML,且
Content-Type保持默认(不要设成text/xml),否则微信收不到
access_token 为什么不能每次 API 调用都重新获取?
它不是登录态 token,而是调用微信 API 的“门票”,2 小时过期,但每秒调用上限极低(2000 次/天),并发获取极易触发限流。
- 必须缓存到外部存储(如 Redis 或文件),不能存在内存或 session 里
- 缓存 key 建议用
access_token_{appid},避免多号混用 - 刷新逻辑要加锁(如 Redis SETNX),否则高并发下多个请求同时发现过期、同时去刷新,导致旧 token 被覆盖又失效
- EasyWeChat 等库已内置该逻辑,手动实现时容易漏掉“提前 5 分钟刷新”这个关键点
HTTPS 和域名备案为什么绕不开?
这不是开发技巧问题,是微信平台的硬性准入门槛,本地调试也得过这一关。
- 微信服务器只发起 HTTPS 请求,HTTP 协议直接拒绝连接,连 DNS 解析都不走
- 国内域名未备案,腾讯云、阿里云等厂商会主动拦截微信回调,返回 403 或超时,日志里看不到真实错误
- 开发阶段可用
ngrok或cpolar生成 HTTPS 隧道,但仅限测试;上线必须用真实备案域名 + 有效 SSL 证书(Let’s Encrypt 可用) - 证书不能是自签名,浏览器地址栏必须显示“?”且无警告,否则微信校验失败
最常被忽略的其实是消息响应的时效性:微信要求 5 秒内返回响应,超时即当作失败,重试发送。XML 构造、数据库查询、远程 API 调用这些耗时操作,务必异步化或精简路径,否则用户发一条消息,你收到三遍。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











