钉钉开发文档:https://developers.dingtalk.com/document/app/configure-event-subcription/title-dvf-srp-e9i
消息加解密
为了保证数据传输的安全,钉钉在推送订阅事件时,会携带配置的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。
取出返回的JSON中的encrypt字段:
加解密代码示例如下:
public Map<String, String> callBack(
@RequestParam(value = "msg_signature", required = false) String msg_signature,
@RequestParam(value = "timestamp", required = false) String timeStamp,
@RequestParam(value = "nonce", required = false) String nonce,
@RequestBody(required = false) JSONObject json) {
try {
DingCallbackCrypto callbackCrypto = new DingCallbackCrypto(Constant.AES_TOKEN, Constant.AES_KEY, Constant.OWNER_KEY);
String encryptMsg = json.getString("encrypt");
String decryptMsg = callbackCrypto.getDecryptMsg(msg_signature, timeStamp, nonce, encryptMsg);
JSONObject eventJson = JSON.parseObject(decryptMsg);
String eventType = eventJson.getString("EventType");
if ("check_url".equals(eventType)) {
bizLogger.info("测试回调url的正确性");
} else if ("user_add_org".equals(eventType)) {
bizLogger.info("发生了:" + eventType + "事件");
} else {
bizLogger.info("发生了:" + eventType + "事件");
}
Map<String, String> successMap = callbackCrypto.getEncryptedMap("success");
return successMap;
} catch (DingTalkEncryptException e) {
e.printStackTrace();
}
return null;
}
[此贴子已经被作者于2021/8/1 13:26:56编辑过]