前言
项目中刚好涉及到了需要对接钉钉事件订阅(审批事件),谨以此篇博客和大家分享下。
需求
需要把钉钉每次发起请假流程审批的数据存入数据库。
总体流程
钉钉发起请假申请 -> 钉钉服务器把消息推送给我们项目服务器 -> 我们项目服务器解析入库
实现
钉钉接口文档地址:传送门
一、搭建本地测试服务
因为需要解析钉钉服务器发起的请求,编写一个控制器
DealDingTalkDataController.class
@Slf4j
@RestController
@RequestMapping("/deal/data")
@Api(value = "deal-data", tags = "处理钉钉请假数据")
public class DealDingTalkDataController {
/**
* 钉钉事件订阅aeskey
*/
@Value("${dingtalk.app.aeskey}")
private String aeskey;
/**
* 钉钉事件订阅token
*/
@Value("${dingtalk.app.token}")
private String token;
/**
* 钉钉appkey
*/
@Value("${dingtalk.app.appkey}")
private String ownerkey;
/**
* 注入UserLeaveDataService
*/
@Resource
UserLeaveDataService userLeaveDataService;
@PostMapping
public Map<String, String> dealData(@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) throws DingCallbackCrypto.DingTalkEncryptException {
// 1. 从http请求中获取加解密参数
String encrypt = json.getString("encrypt");
// 2. 使用加解密类型
DingCallbackCrypto callbackCrypto = new DingCallbackCrypto(token, aeskey, ownerkey);
final String decryptMsg = callbackCrypto.getDecryptMsg(msg_signature, timeStamp, nonce, encrypt);
// 3. 反序列化回调事件json数据
JSONObject eventJson = JSON.parseObject(decryptMsg);
log.info("数据====eventJson: {}", eventJson);
String eventType = eventJson.getString("EventType");
// 4. 根据EventType分类处理
if ("check_url".equals(eventType)) {
// 测试回调url的正确性
} else if ("user_add_org".equals(eventType)) {
// 处理通讯录用户增加时间
} else if ("bpms_task_change".equals(eventType)) {
// 处理审批实例变更(审批任务开始、结束、转交)
} else if ("bpms_instance_change".equals(eventType)) {
// 处理审批实例始末(审批任务开始、结束)
// 存入数据库
userLeaveDataService.addData(decryptMsg);
}
// 5. 返回success的加密数据
Map<String, String> successMap = callbackCrypto.getEncryptedMap("success");
return successMap;
}
}
配置文件application.properties
# 钉钉应用信息
# 钉钉事件订阅相关参数
dingtalk.app.appkey=123
dingtalk.app.aeskey=123
dingtalk.app.token=123
注意
配置文件中的参数值123替换成你自己应用的参数
第一个参数appkey就是你应用的appkey
第二个第三个参数如下图
操作文档(不愿意看的话直接跳过看我步骤):传送门
1.登录开发者后台
2.单击事件订阅
内网穿透工具网上一大堆,随便下载个就行
3.上面随机生成的参数放到配置文件里并替换
4.如果是本地测试的话,把内网穿透工具打开映射到自己的项目(注意端口)
5.启动项目,随便访问下外网(内网穿透的映射到外网的地址)接口看下能否成功,比如你本地可以访问localhost:8080/doc.html, 测试下:外网地址/doc.html 能否正常访问,能的话说明内网穿透成功
5.填好外网网址(此处要注意是外网地址 + /deal/data,即映射到你那个处理钉钉的请求里),保存。成功的话说明钉钉服务器和我们本地连接成功。
失败的话看这里,最下面有异常处理解决
6.写逻辑处理你获取到的数据
// 4. 根据EventType分类处理
if ("check_url".equals(eventType)) {
// 测试回调url的正确性
} else if ("user_add_org".equals(eventType)) {
// 处理通讯录用户增加时间
} else if ("bpms_task_change".equals(eventType)) {
// 处理审批实例变更(审批任务开始、结束、转交)
} else if ("bpms_instance_change".equals(eventType)) {
// 处理审批实例始末(审批任务开始、结束)
// 存入数据库
userLeaveDataService.addData(decryptMsg);
}
最后一个else if 处理逻辑入数据库,这里很多魔法值就不要在意这些细节了,有时间的话把魔法值放到常量类里。
写在最后
非常感谢大家的认真阅读,如果有其他好代码技巧都可以和我交流哦,如有不足,还望各位看官多批评指正=_=
技术交流秋秋群:719023986
微x关注:干饭必备外卖神券,每天领大额卷
微x关注:正好想买,自助查桃宝京d卷