接收

当用户@机器人时,钉钉会通过机器人开发者的HTTPS服务地址,把消息内容发送出去,报文协议如下。

HTTP HEADER

{
  "Content-Type": "application/json; charset=utf-8",
  "timestamp": "1577262236757",
  "sign":"xxxxxxxxxx"
}
参数说明
timestamp消息发送的时间戳,单位是毫秒。
sign签名值。

开发者需对header中的timestamp和sign进行验证,以判断是否是来自钉钉的合法请求,避免其他仿冒钉钉调用开发者的HTTPS服务传送数据,具体验证逻辑如下:

  • timestamp 与系统当前时间戳如果相差1小时以上,则认为是非法的请求。
  • sign 与开发者自己计算的结果不一致,则认为是非法的请求。

必须当timestamp和sign同时验证通过,才能认为是来自钉钉的合法请求。

sign的计算方法:

header中的timestamp + "\n" + 机器人的appSecret当做签名字符串,使用HmacSHA256算法计算签名,然后进行Base64 encode,得到最终的签名值。

HTTP BODY

{
    "conversationId": "xxx",
    "atUsers": [
        {
            "dingtalkId": "xxx",
            "staffId":"xxx"
        }
    ],
    "chatbotCorpId": "dinge8a565xxxx",
    "chatbotUserId": "$:LWCP_v1:$Cxxxxx",
    "msgId": "msg0xxxxx",
    "senderNick": "杨xx",
    "isAdmin": true,
    "senderStaffId": "user123",
    "sessionWebhookExpiredTime": 1613635652738,
    "createAt": 1613630252678,
    "senderCorpId": "dinge8a565xxxx",
    "conversationType": "2",
    "senderId": "$:LWCP_v1:$Ff09GIxxxxx",
    "conversationTitle": "机器人测试-TEST",
    "isInAtList": true,
    "sessionWebhook": "https://oapi.dingtalk.com/robot/sendBySession?session=xxxxx",
    "text": {
        "content": " 你好"
    },
    "msgtype": "text"
}
参数是否必填类型说明
msgtype是String目前只支持text。
content是String消息文本。
msgId是String加密的消息ID。
createAt是String消息的时间戳,单位ms。
conversationType是String1:单聊2:群聊
conversationId是String加密的会话ID。
conversationTitle否String群聊时才有的会话标题。
senderId是String加密的发送者ID。说明 使用senderStaffId,作为发送者userid值。
senderNick是String发送者昵称。
senderCorpId否String企业内部群有的发送者当前群的企业corpId。
sessionWebhook是String当前会话的Webhook地址。
sessionWebhookExpiredTime是Long当前会话的Webhook地址过期时间。
isAdmin否boolean是否为管理员。说明 机器人发布上线后生效。
chatbotCorpId否String加密的机器人所在的企业corpId。
isInAtList否boolean是否在@列表中。
senderStaffId否String企业内部群中@该机器人的成员userid。说明 该字段在机器人发布线上版本后,才会返回。
chatbotUserId是String加密的机器人ID。
atUsers Array被@人的信息。dingtalkId:加密的发送者ID。staffId:企业内部群有的发送者在企业内的userid。
最后修改:2022 年 05 月 19 日
要不?请我吃一下沙县连锁大酒店?