企业微信应用 Token 验证失败报 invalid signature 错误,通常是因为本地计算的签名与微信服务器传来的 msg_signature 不一致,最优先检查回调 URL 中配置的 Token 是否与代码完全一致且无多余空格。
先说结论:invalid signature 错误本质是签名算法执行结果不匹配,优先核对 Token 配置一致性,再排查参数字典序排序和字符编码问题。
- 先确认:企业微信后台配置的 Token 与代码中使用的 Token 字符串完全一致,区分大小写且无隐藏空格。
- 先处理:严格按照字典序排序 timestamp、nonce、token 三个参数,使用 SHA1 算法计算签名。
- 再验证:在代码日志中打印本地计算出的 signature 与请求参数中的 msg_signature 进行比对。
快速处理思路
此问题属于代码逻辑校验失败,不涉及系统命令,请按以下逻辑快速定位:
- 核对企业微信管理后台「应用管理」-「接收消息服务器配置」中的 Token 值。
- 检查代码中获取请求参数 timestamp、nonce、msg_signature 的方式是否正确。
- 确认签名计算流程为:将 token、timestamp、nonce 三个字符串字典序排序后拼接,再进行 SHA1 加密。
为什么会这样
invalid signature 错误表示服务器端计算的签名字符串与微信服务器发送的签名不匹配。
企业微信回调验证机制要求开发者服务器将接收到的 token、timestamp、nonce 三个参数按字典序排序,拼接成字符串后通过 SHA1 算法生成签名,并与请求参数中的 msg_signature 比对。任何环节的差异,包括字符大小写、空格、编码格式或排序顺序错误,都会导致哈希值完全不同。
分步处理
步骤 1:检查 Token 配置一致性
登录企业微信管理后台,进入应用详情页的「接收消息服务器配置」页面,复制 Token 值。
在代码配置文件中粘贴该值,确保没有多余的空格或换行符,注意区分大小写。
步骤 2:验证参数排序逻辑
检查代码中是否对 [token, timestamp, nonce] 进行了字典序排序。
错误示例:直接拼接而不排序。
正确逻辑:先将三个变量转为字符串,按 ASCII 码从小到大排序,再拼接。
步骤 3:确认字符编码
确保参与签名计算的字符串使用 UTF-8 编码进行哈希计算。
部分语言默认编码可能不同,需显式指定编码格式。
步骤 4:建议使用官方 SDK
如果自行实现算法困难,直接引用企业微信官方提供的 SDK 处理回调验证。
SDK 已封装好签名校验逻辑,可减少人为实现误差。
怎么验证是否生效
在代码签名计算逻辑后添加日志输出,分别打印本地计算出的 signature 和请求参数中的 msg_signature。
提交保存配置后,观察企业微信后台验证结果提示。
若日志中两个字符串完全一致且后台显示验证成功,则问题已解决。
常见坑
- URL 编码问题:部分框架会自动对请求参数进行 URL Decode,需确认获取到的参数是否为原始值。
- 隐藏字符:复制 Token 时容易带入不可见的空格或换行符,导致签名失败。
- 时间同步:虽然 timestamp 主要用于防重放,但服务器时间偏差过大可能影响部分校验逻辑。
- 大小写敏感:SHA1 生成的哈希值通常转为小写十六进制字符串,需确保比对时大小写一致。
常见问题
Token 和 EncodingKey 是同一个值吗?
不是,Token 用于验证请求来源,EncodingKey 用于消息体加解密,两者在企业微信后台分别配置。
验证回调必须用 GET 请求吗?
是的,首次验证配置有效性时企业微信发送的是 GET 请求,携带 echostr 参数。
可以直接关闭签名验证吗?
不建议,关闭签名验证会导致消息来源无法校验,存在安全风险,生产环境应保持开启。
参考来源
- 企业微信开发者文档,回调模式验证,https://work.weixin.qq.com/api/doc