钉钉自定义 webhook 机器人不支持接收消息,只有企业内部应用或 ISV 应用通过事件订阅才能解析用户回复。实现自动响应需要配置回调地址并在服务端验证签名后调用发送接口。
先说结论:普通 webhook 机器人无法接收消息,必须使用具备事件订阅权限的企业内部应用
- 适合:需要双向交互的群聊或单聊场景
- 先看:钉钉开放平台应用创建与权限配置
- 建议:服务端必须实现签名验证以防请求伪造
快速处理思路
该场景不涉及命令行操作,核心在于应用权限升级与回调服务开发。先在钉钉开发者后台创建企业内部应用,开启事件订阅权限,获取 AppKey 和 AppSecret。接着部署公网可访问的 HTTPS 回调服务,用于接收钉钉推送的消息事件。最后在代码中解析加密 payload,验证签名后调用消息发送接口回复用户。
为什么会这样
钉钉机器人分为自定义 webhook 和企业内部应用两种类型,权限模型不同。自定义 webhook 设计为单向通知,仅支持服务端主动向群内推送消息,不具备接收回调的 capability。企业内部应用拥有更完整的 API 权限,通过事件订阅机制可以监听群消息、单聊消息等事件,从而实现双向交互。
分步处理
步骤 1:创建应用并配置权限
登录钉钉开发者后台,创建企业内部应用。在功能配置中找到事件订阅,开通权限。记录 AppKey、AppSecret 以及事件订阅中的加密密钥(EncodingAESKey)和验证令牌(Token)。
步骤 2:配置回调地址
在事件订阅页面填写回调 URL,该地址必须是公网 HTTPS 地址。钉钉会向该地址发送验证请求,服务端需按文档要求返回加密后的 echo 字符串才能验证通过。
步骤 3:编写消息接收逻辑
服务端接收 POST 请求,读取请求头中的签名参数。使用 AppSecret 和 EncodingAESKey 对请求体进行解密和签名验证。验证通过后解析 JSON 数据,提取发送人 ID、消息内容和会话 ID。
步骤 4:实现自动回复
根据业务逻辑生成回复内容。调用钉钉服务端 API 接口(如 message/send 或针对会话的回复接口),传入访问令牌(access_token)和目标会话信息发送消息。注意接口调用频率限制,避免触发限流。
怎么验证是否生效
查看服务端应用日志,确认收到钉钉推送的 event_type 为 im_message 的请求且解密成功。在钉钉群内发送测试消息,观察是否在预期时间内收到机器人回复。检查钉钉开发者后台事件订阅状态,确保回调 URL 验证显示为正常。
常见坑
混淆自定义机器人与企业内部应用,导致无法配置回调地址。服务端处理超时,钉钉回调要求 5 秒内响应,复杂逻辑需异步处理。签名验证失败,通常因加密密钥配置错误或算法实现不一致导致。未使用 HTTPS,回调地址必须是加密传输协议。
常见问题
自定义 webhook 机器人能接收用户消息吗?
不能,自定义 webhook 仅支持发送消息,接收消息必须使用企业内部应用。
回调地址验证失败怎么办?
检查服务端是否按钉钉加密规则返回了正确的 echo 字符串,确保网络可达且使用 HTTPS。
自动回复有延迟正常吗?
正常,受网络传输和服务端处理时间影响,但应控制在秒级,避免超过钉钉回调超时限制。
需要存储用户消息吗?
视业务需求而定,若需上下文对话建议存储,单纯关键词回复可即时处理不落地。
参考来源
- 钉钉开放平台 - 事件订阅配置文档
- 钉钉开放平台 - 服务端 API 接口说明