企微机器人接收回调消息签名验证失败 error code 400 怎么解决

文章导读
企微机器人回调签名验证失败返回 400,通常是因为服务器校验逻辑错误或未正确解密 echostr。最推荐的处理方向是核对 Token 与 EncodingAESKey 配置,并严格按照官方算法计算签名,确保验证通过时返回 HTTP 200 及解密后的 echostr。
📋 目录
  1. 快速处理思路
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

企微机器人回调签名验证失败返回 400,通常是因为服务器校验逻辑错误或未正确解密 echostr。最推荐的处理方向是核对 Token 与 EncodingAESKey 配置,并严格按照官方算法计算签名,确保验证通过时返回 HTTP 200 及解密后的 echostr。

先说结论:签名验证失败的核心原因是本地计算的签名与企业微信发送的 msg_signature 不一致,或验证成功后未正确返回 echostr。

  • 先确认:企业微信后台配置的 URL、Token、EncodingAESKey 与代码中完全一致,注意大小写和空格。
  • 先处理:按照字典序排序参数,拼接 Token 后进行 SHA1 加密,验证通过后必须解密 echostr 并原样返回。
  • 再验证:在企业微信后台点击“验证”按钮,观察是否提示成功且服务器日志无 400 报错。

快速处理思路

不需要复杂命令,重点检查代码逻辑和配置一致性。首先对比企业微信应用管理后台的回调配置与代码常量,确保 Token 和 AES Key 无复制错误。其次检查签名生成函数,确保参数排序和拼接顺序符合官方规范。最后确认 HTTP 响应状态码,验证通过时必须返回 200 且 Body 为解密后的 echostr,不能返回 JSON 或 400 状态码。

为什么会这样

签名验证失败是因为请求参数被篡改或计算方式不匹配。企业微信发送回调请求时,会使用 Token、timestamp、nonce 和加密后的消息内容生成签名。服务器需用相同算法计算签名并比对,不一致则拒绝请求。此外,初次验证时企业微信会发送 echostr,服务器必须解密后返回明文,否则视为验证失败,部分框架默认捕获异常后返回 400 状态码。

分步处理

第一步检查后台配置。登录企业微信管理后台,进入应用管理页面,查看回调 URL 配置。记录 Token 和 EncodingAESKey,与代码配置文件逐项比对,注意隐藏字符和末尾空格。

第二步修正签名算法。获取请求参数 msg_signature、timestamp、nonce、echostr。将 Token、timestamp、nonce 三个字符串按字典序排序后拼接成一个字符串。对拼接后的字符串进行 SHA1 哈希计算,结果与 msg_signature 比对。

第三步调整响应内容。验证签名通过后,使用 EncodingAESKey 对 echostr 进行 AES 解密。将解密后的明文字符串作为 HTTP 响应 Body 返回,状态码设置为 200。确保不添加额外换行符或 JSON 包裹。

企微机器人接收回调消息签名验证失败 error code 400 怎么解决

怎么验证是否生效

在企业微信管理后台回调配置页面,点击“验证”按钮。若页面提示“验证成功”,且服务器访问日志中该请求状态码为 200,则修复生效。同时检查服务器应用日志,确认不再有签名比对失败的报错记录。

常见坑

URL 参数未解码可能导致签名计算错误,部分语言框架会自动解码,部分需要手动处理。返回数据包含多余空格或换行符会导致验证失败,需确保响应体纯净。AES 解密时使用错误的填充模式,官方要求 PKCS7Padding,使用 NoPadding 会解密失败。

常见问题

回调请求是 GET 还是 POST?

初次验证配置时是 GET 请求,接收正常消息推送时是 POST 请求。验证阶段必须处理 GET 请求中的 echostr,消息推送阶段处理 POST 请求中的加密消息体。

签名验证超时怎么办?

企业微信等待响应超时时间为 5 秒。服务器必须在 5 秒内完成签名校验、解密和响应返回,否则企业微信会判定为失败并重试或报错。

EncodingAESKey 有什么用?

EncodingAESKey 用于消息体的加密和解密。签名验证阶段用于解密 echostr,消息接收阶段用于解密用户发送的具体内容,配置错误会导致无法读取消息。

参考来源

企业微信开发者文档 - 回调模式 https://developer.work.weixin.qq.com/document/path/90930