Skip to main content

使用场景

  • 在你的业务对数据的实时性要求较高时。例如:在新员工入职或者离职时,应用需要第一时间变更用户数据,此时就可以订阅通讯录事件。
  • 你的应用需要及时响应用户的操作时。例如:某用户加入某群聊时,应用可以订阅群会话事件,在用户进入群聊的时候,向用户发送欢迎等信息。
以上只是几个非常简单的使用场景,开发者可以根据不同的事件,进行不同的处理。

事件订阅流程

事件订阅的流程如下图所示。 首先,开发者需要在钉钉开放平台配置HTTP请求接收地址用于接收推送的订阅事件,然后设置要订阅的事件。在配置完请求地址后,钉钉开放平台会向该地址发送POST请求,只有在规定时间内正确返回了包含”success”的加密字符串才完成事件订阅。 事件订阅

配置请求地址和事件订阅

  1. 登录开发者后台,找到已创建的企业内部应用。
  2. 单击 事件订阅,然后单击编辑配置用于接收请求的HTTP地址。 注意 确保该地址公网可以访问。 p201853 编辑完请求地址,单击 保存 按钮时,开放平台会向你配置的网址推送一个 application/json 格式的 POST 请求, 用于验证你配置的网址的合法性。请求如下:
    当你收到开放平台的POST验证请求时,你需要做解密处理,并在 1500ms 内返回包含 success 的加密字符串(JSON格式)。钉钉开放平台收到返回的JSON信息后会做解密处理,如果可以得到正常的success字符串,则验证回调信息推送正常,否则会判定为失败的回调信息。
  3. 成功配置请求地址后,在 事件订阅 列表区域,开启要订阅的事件。 事件列表

接收并响应事件

  • 接收事件信息 当事件发生时,钉钉会主动向配置的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消息体明文编码成encryptencrypt = Base64_Encode(AES_Encrypt[random(16B) + msg_len(4B) + msg + $key])是对明文消息msg加密处理后的Base64编码。其中:
  • random 为16字节的随机字符串。
  • msg_len 为4字节的msg长度,网络字节序。
  • msg 为消息体明文。
  • key 为应用的appKey。
取出返回的JSON中的encrypt字段:
  • 对密文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字符串,说明返回的值没有问题,问题出现在回调接口返回给钉钉服务器的值参数格式不对,需要再次确认。
    • 如果运行出现报错,常见运行报错和原因如下: