• Java-钉钉订阅事件


    背景

    最近需要做一个业务:钉钉组织架构下添加人员之后,要对该人员的数据信息做一个处理,比如:存储表。
    于是查阅了有关钉钉的订阅事件,直接让钉钉回调自己的接口即可。也就是当钉钉的组织架构下有人员新增的时候,就让他去调用给他配置的接口(回调)。

    什么是钉钉订阅事件

    钉钉订阅事件是指钉钉开放平台提供的一种机制,允许开发者订阅企业内部发生的各类事件,例如员工加入、离职、部门变动、审批进度更新等。当这些事件在企业内部发生时,钉钉会向开发者事先指定的回调地址发送相应的通知,开发者可以根据通知进行进一步处理。

    钉钉订阅事件的应用场景

    钉钉订阅事件广泛应用于企业内部信息的实时监控和处理。以下是几个常见的应用场景:

    人事管理:及时了解员工加入、离职以及岗位调整等人事变动,方便进行人力资源管理。
    审批流程跟踪:实时获取审批进度更新,帮助相关人员掌握工作流程状态。
    部门协作:订阅部门变动事件,及时调整团队工作布局,保持组织结构的同步性。
    数据分析与监控:通过订阅特定数据变动事件,实时监控关键业务数据,并进行进一步分析与处理。

    整体思路

    查看钉钉文档

    我们要先去看一个钉钉的开发文档,可以看到他有一个通讯录事件:添加链接描述
    在这里插入图片描述
    这里就有相关的事件类型,我们需要去取对应的事件类型即可。而且钉钉也有对应的代码示例,可以在钉钉上进行测试调用。

    什么是钉钉回调

    通俗来将钉钉回调就是让钉钉来订阅我们的一个接口。还是看钉钉的文档介绍。
    添加链接描述

    钉钉回调具体实操

    创建自己的应用

    在钉钉上在钉钉开放平台注册并创建一个应用。然后,在应用中创建需要订阅的事件类型,例如员工变动事件、审批进度更新事件等。每个事件都有对应的标识符和描述,开发者可以根据需要选择订阅的事件。在这里插入图片描述

    这里加密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;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    需要注意的是在代码中需要把H5应用的token、加密aes_Key、appKey、Appsecret填写上
    在这里插入图片描述
    在这里插入图片描述
    这两部分的内容。
    主要是这两部分进行钉钉解密操作。

    在这段代码中,如果解密成功会有判断的事件,也就是他会判断钉钉的是什么订阅,这里有它的一部分标识,比如:新增人员的标识是user_add_org,等等,这部分是在开篇有介绍过。
    在这些if判断中可以去编写自己的代码业务处理逻辑。

    开发过程中遇到的问题

    1、这里需要特别注意的是token、appKey这些值一定要书写正确,
    2、设置回调地址的时候,上面不能有空格
    3、多看钉钉帮助文档

    总结

    钉钉订阅事件的优势和特点

    1、实时性:钉钉订阅事件可以在事件发生之后立即通知开发者,保证了信息的实时性和准确性。
    2、简化操作:开发者只需要创建订阅事件、配置回调地址和编写业务处理代码,即可轻松实现对企业内部3、变化的订阅,无需频繁查询和轮询。
    4、扩展性:钉钉订阅事件支持多种类型的企业内部事件,方便根据具体需求进行订阅和处理,具有很好的扩展性和灵活性。

    钉钉订阅事件为企业提供了一种便捷的方式,实时订阅并处理企业内部关键信息的变化。无论是人事管理、审批流程跟踪还是数据分析与监控,都能通过钉钉订阅事件及时获取所需的信息并进行相应的处理。通过合理利用这一功能,企业可以极大地提高工作效率和决策能力,实现更加高效精准的协同合作。

  • 相关阅读:
    【配置】win10+vscode+opencv4+mingw+cmake
    学透shell 带你写常用的100个 shell 脚本(一)定时删除过期文件
    iOS 消息推送面试题
    ONNX YOLOv6目标检测、GitHub搜索引擎、AI前沿论文 | ShowMeAI资讯日报 #2022.07.03
    AI创作系统ChatGPT网站源码/支持DALL-E3文生图/支持最新GPT-4-Turbo模型+Prompt应用
    SQL必需掌握的100个重要知识点:使用子查询
    2022年9月4日:面向初学者的 web 开发--JavaScript 数组和循环(没有完全搞懂)
    网络安全-记录web漏洞修复
    从零开始学习软件测试-第40天笔记
    Linux - linux命令进阶
  • 原文地址:https://blog.csdn.net/weixin_45309155/article/details/132773642