使用场景
- 在你的业务对数据的实时性要求较高时。例如:在新员工入职或者离职时,应用需要第一时间变更用户数据,此时就可以订阅通讯录事件。
- 你的应用需要及时响应用户的操作时。例如:某用户加入某群聊时,应用可以订阅群会话事件,在用户进入群聊的时候,向用户发送欢迎等信息。
事件订阅流程
事件订阅的流程如下图所示。 首先,开发者需要在钉钉开放平台配置HTTP请求接收地址用于接收推送的订阅事件,然后设置要订阅的事件。在配置完请求地址后,钉钉开放平台会向该地址发送POST请求,只有在规定时间内正确返回了包含”success”的加密字符串才完成事件订阅。
配置请求地址和事件订阅
- 登录开发者后台,找到已创建的企业内部应用。
-
单击 事件订阅,然后单击编辑配置用于接收请求的HTTP地址。
注意
确保该地址公网可以访问。
编辑完请求地址,单击 保存 按钮时,开放平台会向你配置的网址推送一个 application/json 格式的 POST 请求, 用于验证你配置的网址的合法性。请求如下:
当你收到开放平台的POST验证请求时,你需要做解密处理,并在 1500ms 内返回包含 success 的加密字符串(JSON格式)。钉钉开放平台收到返回的JSON信息后会做解密处理,如果可以得到正常的success字符串,则验证回调信息推送正常,否则会判定为失败的回调信息。 -
成功配置请求地址后,在 事件订阅 列表区域,开启要订阅的事件。
接收并响应事件
-
接收事件信息
当事件发生时,钉钉会主动向配置的HTTP地址发送POST请求,推送对应的事件信息。例如订阅通讯录事件后,当通讯录发生变更时,会向注册的HTTP地址推送事件信息,其格式如下。
说明
钉钉服务器推送信息是即时推送,如果企业的回调地址没有在1500毫秒内返回正确的加密信息给钉钉服务器,钉钉服务器会判断为推送失败。
请求的URL格式如下:
包含的JSON数据如下:其中:
- signature为消息体签名。
- timestamp为时间戳。
- nonce为随机字符串。
- encrypt为加密的推送事件信息。
-
响应事件信息
当你收到开放平台的POST验证请求时,你需要做解密处理,并在 1500ms 内返回包含 success 的加密字符串(JSON格式)。钉钉开放平台收到返回的JSON信息后会做解密处理,如果可以得到正常的success字符串,则验证回调信息推送正常,否则会判定为失败的回调信息。
具体返回给钉钉的数据格式如下:
注意
返回的数据格式必须是JSON格式。
其中:
- msg_signature为消息体签名。
- timeStamp为时间戳。
- nonce为随机字符串。
- encrypt为success加密字符串。
消息加解密
为了保证数据传输的安全,钉钉在推送订阅事件时,会携带配置的token用来验证事件来源。同时使用该密钥对消息内容做对称加密。 单击这里获取回调加解密类库和对应demo。 钉钉服务器会把msg消息体明文编码成encrypt。encrypt = Base64_Encode(AES_Encrypt[random(16B) + msg_len(4B) + msg + $key])是对明文消息msg加密处理后的Base64编码。其中:
- random 为16字节的随机字符串。
- msg_len 为4字节的msg长度,网络字节序。
- msg 为消息体明文。
- key 为应用的appKey。
- 对密文BASE64解码:aes_msg=Base64_Decode(encrypt);
- 使用AESKey做AES解密:rand_msg=AES_Decrypt(aes_msg);
- 此代码示例的加解密过程依赖 DingCallbackCrypto 工具类,参见dingtalk-callback-Crypto。
-
示例中的Constant.OWNER_KEY说明如下:
- 当使用本文档中的方式接收钉钉推送的订阅事件时,是以应用为维度推送的,OWNER_KEY为应用的AppKey,可在开发者后台的应用详情页面中获取。
- 当使用HTTP回调注册接口方式接收钉钉推送的订阅事件时,是以企业为维度推送的,OWNER_KEY为CorpId。
常见问题
-
问题描述
点击保存,页面报错“HTTP请求结果校验返回字段值失败”,如下图所示。
-
原因
- 返回给钉钉服务器的json信息中有其中一个字段值不正确。
- 返回给钉钉服务器的信息不是json格式。
-
解决方案
构造main方法,使用回调地址返回的四个字段值,调用加密接口,验证得到的值是否为success字符串。
例如:
此时的运行结果如下:
- 如果得到了success字符串,说明返回的值没有问题,问题出现在回调接口返回给钉钉服务器的值参数格式不对,需要再次确认。
-
如果运行出现报错,常见运行报错和原因如下: