钉钉机器人失效通常是因为 access_token 过期(有效期 2 小时)或应用密钥 AppSecret 被重置,而非应用凭证本身自动过期。续期方法是重新调用接口获取新 token 或在控制台重置密钥后更新配置。
先说结论:绝大多数“凭证过期”实为 access_token 超时,需程序自动刷新而非手动续期。
- 先确认:查看接口返回错误码是否为 invalid_token 或 code 40001
- 先处理:调用 gettoken 接口重新获取 access_token 并更新缓存
- 再验证:发送一条测试消息确认机器人恢复响应
命令速用版
若需手动测试凭证是否可用,可通过 curl 命令请求接口获取新 token,替换实际的 appKey 和 appSecret:
curl "https://api.dingtalk.com/v1.0/oauth2/accessToken" -X POST -H "Content-Type: application/json" -d '{"appKey": "你的 AppKey", "appSecret": "你的 AppSecret"}'返回 JSON 中包含 accessToken 字段即表示凭证有效,若返回 errcode 非 0 则说明密钥错误或应用状态异常。
为什么会这样
钉钉开放平台的访问凭证分为静态密钥和动态令牌,大部分失效源于动态令牌超时。
AppKey 和 AppSecret 是应用在控制台生成的静态凭证,除非手动重置或应用被禁用,否则不会自动过期。但使用它们换取的 access_token 是动态令牌,默认有效期为 2 小时。开发者若在代码中硬编码 token 且未实现自动刷新机制,2 小时后接口调用会因 token 失效而报错,表现为机器人停止响应。
分步处理
按照以下顺序排查并恢复服务,避免直接重置密钥导致旧配置大面积失效。
步骤 1:确认错误类型
检查服务器日志中钉钉接口返回的 errorMessage。若包含“invalid token”、“token 过期”或错误码 40001,确认为 token 过期问题;若提示“app secret 错误”,则需检查配置是否与控制台一致。
步骤 2:刷新访问令牌
在代码中调用获取 token 接口。内部应用通常使用 GET 请求https://oapi.dingtalk.com/gettoken,新版接口使用 POST 请求https://api.dingtalk.com/v1.0/oauth2/accessToken。获取新 token 后,立即更新本地缓存或环境变量,确保后续请求使用新值。
步骤 3:更新应用配置(仅必要时)
若确认 AppSecret 已泄露或控制台提示强制重置,登录钉钉开发者后台,进入应用管理页面点击重置密钥。重置后必须同步更新所有使用该密钥的服务端配置,否则旧 token 会立即失效。
怎么验证是否生效
完成刷新后,通过以下方式确认机器人恢复:
- 发送测试消息:调用发送工作通知接口,返回 errorCode 为 0 表示成功。
- 检查回调服务:若使用回调模式,查看服务器是否收到钉钉推送的事件请求。
- 监控日志:观察后续 1 小时内无 token 相关报错日志。
常见坑
处理凭证问题时需避开以下高频错误场景:
- 缓存时间过长:access_token 有效期为 7200 秒,建议缓存时间设置为 7000 秒以内,预留刷新缓冲。
- IP 白名单限制:部分接口要求服务器 IP 在应用后台配置白名单,更换服务器后未更新会导致获取 token 失败。
- 多实例竞争:多个服务实例同时刷新 token 可能导致频次限制,建议使用分布式锁或统一授权服务管理 token。
- 密钥重置影响:重置 AppSecret 会使所有旧 token 立即失效,需在业务低峰期操作并同步更新所有环境。
常见问题
access_token 有效期是多久?
默认有效期为 2 小时(7200 秒),超时后需重新调用接口获取。
重置 AppSecret 后旧 token 还能用吗?
不能,重置密钥后所有基于旧密钥生成的 token 会立即失效,必须重新获取。
机器人失效一定是凭证问题吗?
不一定,还需检查应用是否被禁用、IP 白名单是否变更或消息接口权限是否不足。
参考来源
- 钉钉开放平台文档,获取 access_token,https://open.dingtalk.com/document/orgapp-server/obtain-orgapp-token
- 钉钉开放平台文档,错误码查询,https://open.dingtalk.com/document/orgapp-server/error-code