企业微信机器人回调消息如何验证 X-Wework-Signature 签名

文章导读
验证企业微信机器人回调消息的 X-Wework-Signature 签名,需要使用 SHA256 算法计算 Token、时间戳、随机串和请求体的哈希值,并与请求头中的签名比对。适用场景为接收企业微信回调 POST 请求,风险边界在于 Token 泄露会导致签名伪造,必须确保 Token 仅服务端可见。
📋 目录
  1. 快速处理思路
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

验证企业微信机器人回调消息的 X-Wework-Signature 签名,需要使用 SHA256 算法计算 Token、时间戳、随机串和请求体的哈希值,并与请求头中的签名比对。适用场景为接收企业微信回调 POST 请求,风险边界在于 Token 泄露会导致签名伪造,必须确保 Token 仅服务端可见。

先说结论:企业微信回调签名验证依赖服务端配置的 Token 和请求头参数,计算结果一致才视为合法请求。

  • 适合:企业微信自建应用接收消息回调、变更回调等 POST 请求场景。
  • 先看:请求头中的 X-Wework-Signature、X-Wework-Timestamp、X-Wework-Nonce 是否完整。
  • 建议:验证通过后再接收业务逻辑,验证失败直接返回错误码避免处理非法数据。

快速处理思路

由于签名验证属于代码逻辑,不涉及命令行操作,建议按以下伪代码逻辑处理。获取请求头中的签名、时间戳、随机串,读取原始请求体,拼接 Token 后计算 SHA256 哈希,转为小写十六进制字符串进行比对。

为什么会这样

签名机制用于防止请求被篡改或伪造,确保消息确实来自企业微信服务器。企业微信使用 Token 作为共享密钥,结合动态时间戳和随机串生成签名,接收方通过相同算法复现签名即可确认身份。如果不验证签名,攻击者可能伪造回调接口请求,触发恶意业务逻辑。

分步处理

第一步,从 HTTP 请求头中提取 X-Wework-Signature、X-Wework-Timestamp 和 X-Wework-Nonce 字段,缺失任一字段均视为非法请求。第二步,读取 HTTP 请求的原始 Body 数据,注意不要进行 JSON 解析或修改,保持原始字节流。第三步,获取企业在后台配置的 Token 字符串,将 Token、Timestamp、Nonce、Body 按顺序拼接成一个字符串。第四步,使用 SHA256 算法对拼接后的字符串进行哈希计算,结果转换为小写十六进制格式。第五步,将计算出的签名与请求头中的 X-Wework-Signature 进行字符串比对,完全一致则验证通过。

怎么验证是否生效

查看服务端日志,记录每次回调的签名比对结果,验证通过时记录成功,失败时记录差异。在企业微信后台修改回调 URL 配置后,发送测试消息,观察服务端是否收到请求且签名验证日志显示成功。若验证失败,检查 Token 是否与企业微信后台配置一致,确认请求体读取未发生编码转换或截断。

企业微信机器人回调消息如何验证 X-Wework-Signature 签名

常见坑

Token 不一致是最高频错误,确保代码中配置的 Token 与企业微信应用管理后台完全相同,注意前后空格。请求体读取多次会导致数据丢失,部分 Web 框架读取 Body 后流会关闭,需缓存 Body 内容用于签名计算。编码格式必须为 UTF-8,拼接字符串时若包含非 ASCII 字符,编码不一致会导致哈希结果不同。时间戳重放攻击风险,建议检查 X-Wework-Timestamp 与当前服务器时间差,超过 5 分钟的请求可拒绝。

常见问题

签名验证失败怎么办

首先检查 Token 配置是否一致,其次确认请求体是否被框架自动解析修改,最后核对 SHA256 计算逻辑是否包含所有参数。

加密模式下签名如何计算

加密模式下 Body 为加密后的密文字符串,签名计算仍使用原始 Body 内容,即密文本身,不需要先解密再计算。

时间戳是否有有效期

公开资料中没有看到可靠的企业微信官方强制有效期数据,但建议服务端自行设置时间差阈值防止重放攻击。

参考来源

企业微信开发者文档 - 接收消息签名验证,URL:https://developer.work.weixin.qq.com/document/path/91234