钉钉机器人发送消息提示 signature 校验失败原因是什么?

文章导读
签名校验失败通常是因为机器人安全设置与代码实现不一致,或者调用的服务不支持签名机制。
📋 目录
  1. 快速处理思路
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 参考来源
A A

签名校验失败通常是因为机器人安全设置与代码实现不一致,或者调用的服务不支持签名机制。

先说结论:大多数情况是机器人开启了“加签”但代码未正确实现签名算法,或云监控等特定服务不支持加签。

  • 先确认:检查钉钉机器人安全设置是否勾选了“加签”。
  • 先处理:代码中需根据 secret 和时间戳生成签名,并注意 URL 编码。
  • 再验证:发送测试消息,观察是否仍返回签名错误。

快速处理思路

如果遇到 signature 校验失败,不要盲目改代码,先按以下顺序排查:

  1. 登录钉钉机器人管理后台,查看安全设置是“关键字”还是“加签”。
  2. 如果是“加签”,检查代码中是否传入了正确的 secret 并生成了签名。
  3. 如果是云监控等第三方服务集成,确认该服务是否支持加签模式。

为什么会这样

钉钉机器人的“加签”机制是一种安全验证方式。当你在创建机器人时勾选了“加签”选项,钉钉服务器会要求请求中携带一个由 secret 和当前时间戳计算出的签名。

如果代码中没有实现这个逻辑,或者计算签名的方法不对(比如时间戳格式错误、secret 未正确参与计算),钉钉服务器就无法验证请求的合法性,从而返回签名校验失败的错误。此外,部分阿里云服务(如云监控)在集成钉钉机器人时,仅支持关键字匹配,不支持加签,强行开启会导致签名不匹配。

分步处理

第一步:检查机器人安全设置

钉钉机器人发送消息提示 signature 校验失败原因是什么?

进入钉钉群机器人配置页面,查看安全设置。

  • 如果勾选了“加签”,你需要获取 Secret(以 SEC 开头),并在代码中实现签名逻辑。
  • 如果未勾选“加签”,仅设置了关键字,请确保发送的消息内容中包含至少一个关键字。

第二步:检查代码实现

若使用加签模式,代码中必须包含签名生成逻辑。核心步骤如下:

import time
import hmac
import hashlib
import base64
import urllib.parse

timestamp = str(round(time.time() * 1000))
secret = 'YOUR_SECRET'
secret_enc = secret.encode('utf-8')
string_to_sign = '{}\n{}'.format(timestamp, secret)
string_to_sign_enc = string_to_sign.encode('utf-8')
hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))

确保将生成的 timestamp 和 sign 拼接到 webhook URL 中。

钉钉机器人发送消息提示 signature 校验失败原因是什么?

第三步:确认服务兼容性

如果你是在配置云监控报警联系人时遇到“机器人发送签名不匹配”,这是因为云监控不支持钉钉机器人加签。

处理方法:

  • 去掉机器人配置中的“加签”勾选。
  • 添加关键字,仅包括:云监控、云服务、监控、Monitor、ECS 和报警。

怎么验证是否生效

完成上述调整后,进行一次测试发送:

  • 自定义代码发送:运行脚本发送一条文本消息,若返回 errcode 为 0 或成功提示,则说明签名通过。
  • 云监控测试:在云监控控制台点击“测试”,若不再报错“签名不匹配”,则配置正确。

如果仍然失败,检查服务器时间与标准时间是否同步,签名计算对时间戳敏感,时间偏差过大会导致失效。

常见坑

  • 时间戳超时:签名机制依赖时间戳,如果服务器时间不准,签名会失效。建议配置 NTP 时间同步。
  • Secret 未编码:Secret 中包含特殊字符时,必须进行正确的 URL 编码,否则签名计算结果不一致。
  • 服务限制:如前所述,云监控等特定场景不支持加签,只能使用关键字,强行加签必失败。
  • 关键字缺失:如果取消了加签但未设置关键字,消息也会发送失败,需确保两者至少配置其一。

参考来源

  • DingtalkChatbot 避坑指南:解决 90% 开发者会遇到的 5 个常见问题
  • 设置报警联系人的钉钉机器人时测试报错信息:机器人发送签名不匹配(更新时间:2024-02-06)
  • 钉钉机器人消息发不出去?除了 40035,这些 errcode 和 errmsg 你也得知道