微信签名错误主因是排序类型错误、token不一致或输出干扰;php://input为空多因加解密未处理、waf拦截或php配置问题;安全模式需手动解密;返回xml格式必须严格符合微信规范。

微信服务器验证失败:checkSignature 为什么总返回“签名错误”
绝大多数人在配置初期卡在这一步,不是代码写错,而是细节被微信文档带偏了。微信 GET 请求传来的 signature 是对 [token, timestamp, nonce] 三者排序后 SHA1 得到的——但注意:必须是字符串字面量排序(SORT_STRING),用 sort($arr) 默认是数字排序,若 timestamp 被当成整数,排序结果就错了。
-
token必须和公众号后台填写的完全一致(大小写、空格、不可见字符都算) -
$_GET['timestamp']和$_GET['nonce']一定要用strval()或强制拼接成字符串再进数组,避免类型隐式转换 - 验证阶段不能有任何
echo、var_dump、BOM 头或空格输出,否则echo $_GET['echostr']前就已输出内容,微信收不到纯文本响应 - 如果用了 Nginx,确认没开启
fastcgi_buffering off类似配置导致响应截断
POST 请求拿不到 XML:php://input 为空的常见原因
微信发消息是标准 POST,Content-Type 为 text/xml,但 PHP 默认不解析这种类型——所以不能依赖 $_POST,必须用 file_get_contents('php://input')。但它为空,90% 是因为:
- 你开了「消息加解密」但没处理:后台选了「兼容模式」或「安全模式」,XML 就不是明文,而是 AES 加密后的 Base64 字符串,直接解析会失败
- Web 服务器(如 Apache)启用了
mod_security或 WAF 规则,把含<xml></xml>的请求给拦截/清洗了 - ThinkPHP 的中间件(比如 CORS、Token 验证)提前终止了请求,根本没走到控制器逻辑
- PHP 配置中
enable_post_data_reading = Off(极少见,但某些容器镜像会改)
快速验证:在控制器开头加 file_put_contents('/tmp/wx-raw.log', file_get_contents('php://input'), FILE_APPEND);,看日志有没有内容。
明文模式 vs 安全模式:解密逻辑必须手动补全
EasyWeChat 4.x 默认只支持明文模式;一旦你在公众号后台勾选「启用消息加密」,$app->server->serve() 就会直接报错或返回空响应——它不会自动读取 EncodingAESKey 和 msg_signature 并解密。
- 安全模式下,微信 POST 请求头带
X-WX-MSG-SIGNATURE,Body 是加密 XML,URL 参数含msg_signature、encrypt_type=aes、timestamp、nonce - 你得自己用
Prpcrypt类(微信官方 SDK 提供)解密,再把原始 XML 交给 EasyWeChat 解析——EasyWeChat 4.x 的ServerGuard不处理这个流程 - 别信网上抄来的“一行解密”,
Prpcrypt的构造参数顺序必须是[encodingAESKey, appid],错一个就解出乱码 - 解密失败时,微信会重试三次,但你的日志里只会看到一堆空请求,容易误判为网络问题
自动回复 XML 格式不对:微信收不到响应的硬性约束
微信对返回 XML 的格式极其敏感:标签大小写、CDATA 包裹、换行、时间戳精度,任何一项不符都会静默丢弃响应,用户看到的就是“对方未响应”。
-
<tousername></tousername>和<fromusername></fromusername>必须互换,且不能有空格或换行(trim()不够,要用str_replace(["\n","\r"," "], "", $str)) -
<createtime></createtime>必须是当前秒级时间戳(time()),不能是毫秒,不能是字符串数字 - 文本回复的
<content></content>内容必须用![CDATA[...]]包裹,哪怕里面只是纯英文 - 图文消息的
<articlecount></articlecount>必须是数字字符串(如"1"),不能是整型,否则微信解析失败
最稳妥的方式:先用 simplexml_load_string() 加载自己生成的 XML 字符串,能成功加载再返回;否则说明格式有硬伤。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











