概述
最近项目中需要实现对接钉钉,并实现单向通讯录同步(钉钉服务器
-> 对接平台
)本文通过一个简单的案例快速实现相关的DEMO (本文主要实现与钉钉对接)。
钉钉API: https://open-doc.dingtalk.com...
流程示意图
准备工作
在使用回调接口前,需要做以下准备工作:
1) 提供一个接收消息的RESTful接口。
2) 调用钉钉API,主动注册回调通知。
3) 因为涉及到消息的加密解密,默认的JDK存在一些限制,先要替换相关jar:
在官方网站下载JCE无限制权限策略文件
JDK6的下载地址: http://www.oracle.com/technet...
JDK7的下载地址: http://www.oracle.com/technet...
JDK8的下载地址: http://www.oracle.com/technet...
下载后解压,可以看到local_policy.jar和US_export_policy.jar以及readme.txt。
如果安装的是JRE,将两个jar文件放到%JRE_HOME% libsecurity目录下覆盖原来的文件,
如果安装的是JDK,将两个jar文件放到%JDK_HOME%jrelibsecurity目录下覆盖原来文件。
4) 内网穿透映射本地RESTful接口到公网,推荐使用Ngrok
: http://ngrok.ciqiuwl.cn/
具体实现
1. 提供回调接口
package com.wuwenze.dingtalk.rest;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.mzlion.core.lang.Assert;
import com.wuwenze.dingtalk.api.DingTalkConst;
import com.wuwenze.dingtalk.encrpty.DingTalkEncryptor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import java.io.Serializable;
import java.util.Map;
/**
* @author wwz
* @version 1 (2018/7/26)
* @since Java7
*/
@Slf4j
@RestController
public class DingTalkCallbackRest {
@PostMapping("/dingtalk/receive")
public Map<String, ? extends Serializable> receive(//
String signature, String timestamp, String nonce,@RequestBody String requestBody) {
Assert.notNull(signature, "signature is null.");
Assert.notNull(timestamp, "timestamp is null.");
Assert.notNull(nonce, "nonce is null.");
Assert.notNull(requestBody, "requestBody is null.");
log.info("#receive 接收密文:{}", requestBody);
DingTalkEncryptor dingTalkEncryptor = new DingTalkEncryptor(//
DingTalkConst.CALLBACK_TOKEN, DingTalkConst.CALLBACK_AES_KEY, DingTalkConst.CORP_ID);
JSONObject jsonEncrypt = JSON.parseObject(requestBody);
String encryptMessage = dingTalkEncryptor.getDecryptMsg(signature, timestamp, nonce, jsonEncrypt.getString("encrypt"));
log.info("#receive 密文解密后:{}", encryptMessage);
// TODO: 异步处理报文,解析相关信息
// 返回加密后的success (快速响应)
return dingTalkEncryptor.getEncryptedMsg("success", Long.parseLong(timestamp), nonce);
}
}
接口写好之后,还需要将接口暴露在公网,如此钉钉服务器才能进行调用,下为内网穿透示意图:
钉钉为我们开发者提供了一个Ngrok服务,在https://github.com/open-dingt...,按照操作文章指引配置即可。
我在这边使用的是其他的Ngrok服务,官网地址是http://ngrok.ciqiuwl.cn/,配置后启动如下图所示:
将本地的http://127.0.0.1:8080
映射到http://wuwz.ngrok.xiaomiqiu.cn
,最终提供给钉钉的回调接口地址即为:http://wuwz.ngrok.xiaomiqiu.cn/dingtalk/receive
以上准备工作完后成,就可以将接口启动起来,继续后续的操作。
2. 主动注册回调接口
写一个测试方法,将
http://wuwz.ngrok.xiaomiqiu.cn/dingtalk/receive
注册到钉钉,后续钉钉相关的消息都会推送到此处。
package com.wuwenze.dingtalk;
import com.wuwenze.dingtalk.api.DingTalkApi;
import com.wuwenze.dingtalk.api.DingTalkConst;
import com.wuwenze.dingtalk.enums.DingTalkCallbackTag;
/**
* @author wwz
* @version 1 (2018/7/27)
* @since Java7
*/
public class TestRegisterCallback {
public static void main(String[] args) {
// 获取Token
String accessToken = DingTalkApi.getAccessTokenCache();
// 先删除之前注册的回调