最近需要做一个业务:钉钉组织架构下添加人员之后,要对该人员的数据信息做一个处理,比如:存储表。
于是查阅了有关钉钉的订阅事件,直接让钉钉回调自己的接口即可。也就是当钉钉的组织架构下有人员新增的时候,就让他去调用给他配置的接口(回调)。
钉钉订阅事件是指钉钉开放平台提供的一种机制,允许开发者订阅企业内部发生的各类事件,例如员工加入、离职、部门变动、审批进度更新等。当这些事件在企业内部发生时,钉钉会向开发者事先指定的回调地址发送相应的通知,开发者可以根据通知进行进一步处理。
钉钉订阅事件广泛应用于企业内部信息的实时监控和处理。以下是几个常见的应用场景:
人事管理:及时了解员工加入、离职以及岗位调整等人事变动,方便进行人力资源管理。
审批流程跟踪:实时获取审批进度更新,帮助相关人员掌握工作流程状态。
部门协作:订阅部门变动事件,及时调整团队工作布局,保持组织结构的同步性。
数据分析与监控:通过订阅特定数据变动事件,实时监控关键业务数据,并进行进一步分析与处理。
我们要先去看一个钉钉的开发文档,可以看到他有一个通讯录事件:添加链接描述
这里就有相关的事件类型,我们需要去取对应的事件类型即可。而且钉钉也有对应的代码示例,可以在钉钉上进行测试调用。
通俗来将钉钉回调就是让钉钉来订阅我们的一个接口。还是看钉钉的文档介绍。
添加链接描述
在钉钉上在钉钉开放平台注册并创建一个应用。然后,在应用中创建需要订阅的事件类型,例如员工变动事件、审批进度更新事件等。每个事件都有对应的标识符和描述,开发者可以根据需要选择订阅的事件。
这里加密aes_key和token钉钉自己生成。请求网址就需要自己在代码中写接口。
具体的可以点击“了解更多”可以查看具体的代码应该怎么使用。这里先给大家看一下我在项目组中的使用。
@ApiOperation("钉钉回调同步变动的人员")
@PostMapping(value = "/dingCallback/{id}")
public Map<String, String> dingCallback(@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,@PathVariable("id") String id){
try {
// 1. 从http请求中获取加解密参数
// 2. 使用加解密类型
// Constant.OWNER_KEY 说明:
// 1、开发者后台配置的订阅事件为应用级事件推送,此时OWNER_KEY为应用的APP_KEY。
// 2、调用订阅事件接口订阅的事件为企业级事件推送,
// 此时OWNER_KEY为:企业的appkey(企业内部应用)或 SUITE_KEY(三方应用)
Map<String,String> config= dingProjectConfig.getDingproject().get(id);
//回调页面上的获取的值
String token=config.get("token");
String aesKey = config.get("aesKey");
String corpId = config.get("corpId");
String tenantId=config.get("tenantId");
// String appKey=config.get("appId");
String appSecret=config.get("secret");
DingCallbackCrypto callbackCrypto = new DingCallbackCrypto(token, aesKey, corpId);
String encryptMsg = json.getString("encrypt");
String decryptMsg = callbackCrypto.getDecryptMsg(msg_signature, timeStamp, nonce, encryptMsg);
// 3. 反序列化回调事件json数据
JSONObject eventJson = JSON.parseObject(decryptMsg);
JSONObject eventType=JSON.parseObject(String.valueOf(eventJson));
DingEntity dingEntity = JSONObject.parseObject(JSONObject.toJSONString(eventType),DingEntity.class);
String event= dingEntity.getEventType();
// 4. 根据EventType分类处理
if ("check_url".equals(dingEntity.getEventType())) {
// 测试回调url的正确性
System.out.println("测试回调url的正确性");
} else if ("user_add_org".equals(event)) {
//用户增加事件
organizationService.insertNewDingInformation(dingEntity,tenantId,corpId,appSecret);
} else {
// 添加其他已注册的
System.out.println("发生了其他事件");
}
// 5. 返回success的加密数据
Map<String, String> successMap = callbackCrypto.getEncryptedMap("success");
System.out.println("successMap@@@@@@@@@@@@"+successMap);
return successMap;
} catch (DingCallbackCrypto.DingTalkEncryptException e) {
e.printStackTrace();
}
return null;
}
需要注意的是在代码中需要把H5应用的token、加密aes_Key、appKey、Appsecret填写上
这两部分的内容。
主要是这两部分进行钉钉解密操作。
在这段代码中,如果解密成功会有判断的事件,也就是他会判断钉钉的是什么订阅,这里有它的一部分标识,比如:新增人员的标识是user_add_org,等等,这部分是在开篇有介绍过。
在这些if判断中可以去编写自己的代码业务处理逻辑。
1、这里需要特别注意的是token、appKey这些值一定要书写正确,
2、设置回调地址的时候,上面不能有空格
3、多看钉钉帮助文档
钉钉订阅事件的优势和特点
1、实时性:钉钉订阅事件可以在事件发生之后立即通知开发者,保证了信息的实时性和准确性。
2、简化操作:开发者只需要创建订阅事件、配置回调地址和编写业务处理代码,即可轻松实现对企业内部3、变化的订阅,无需频繁查询和轮询。
4、扩展性:钉钉订阅事件支持多种类型的企业内部事件,方便根据具体需求进行订阅和处理,具有很好的扩展性和灵活性。
钉钉订阅事件为企业提供了一种便捷的方式,实时订阅并处理企业内部关键信息的变化。无论是人事管理、审批流程跟踪还是数据分析与监控,都能通过钉钉订阅事件及时获取所需的信息并进行相应的处理。通过合理利用这一功能,企业可以极大地提高工作效率和决策能力,实现更加高效精准的协同合作。