Java对接钉钉事件订阅(审批事件)

前言

项目中刚好涉及到了需要对接钉钉事件订阅(审批事件),谨以此篇博客和大家分享下。

需求

需要把钉钉每次发起请假流程审批的数据存入数据库。

总体流程

钉钉发起请假申请 -> 钉钉服务器把消息推送给我们项目服务器 -> 我们项目服务器解析入库

实现

钉钉接口文档地址:传送门
一、搭建本地测试服务
因为需要解析钉钉服务器发起的请求,编写一个控制器
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卷

  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Java中,要实现与钉钉的扫码功能,通常会使用钉钉开放平台提供的API和SDK。钉钉提供了Java SDK供开发者集成,以便于处理用户扫描二维码登录、获取临时权限等功能。以下是一般的步骤: 1. 注册钉钉开发者账号并创建应用:首先,你需要在钉钉开放平台上注册(https://open.dingtalk.com/)并创建一个新的应用,获取App Key和App Secret。 2. 添加依赖:在你的项目中添加钉钉SDK的依赖,如果是Maven,可以在pom.xml中添加如下代码: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>dingtalk-sdk</artifactId> <version>版本号</version> </dependency> ``` 3. 初始化SDK:在应用启动时,用App Key和App Secret初始化SDK,如: ```java DingTalkClient.init("your_app_key", "your_app_secret"); ``` 4. 生成扫码二维码:调用SDK中的方法生成二维码,例如: ```java QRCode qrCode = new QRCode(); qrCode.setCodeType(QRCode.CODE_TYPE_TEMP); qrCode.setTitle("扫码登录"); qrCode.setExpiration(60); // 二维码有效时间(秒) String ticket = qrCode.getQRCodeTicket(); ``` 这将返回一个包含临时权限的二维码图片链接或二维码码串。 5. 用户扫码后,钉钉服务器会发送事件到你的回调地址,你可以通过监听这些事件来处理用户的登录请求。 6. 处理回调:在你的服务端,设置一个回调URL,当用户扫码后,钉钉会发送登录事件到这个地址,通过验证事件参数,验证用户身份。 相关问题: 1. 钉钉扫码的具体API调用是什么样子的? 2. 如何在Java中处理钉钉推送的扫码登录事件? 3. 如何验证钉钉服务器传递的扫码事件参数?
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值