釘釘 回調事件 消息加解密


 

官網文檔:

https://developers.dingtalk.com/document/app/configure-event-subcription/title-bec-rsq-8wj

官方示例:

https://github.com/open-dingtalk/dingtalk-callback-Crypto?spm=ding_open_doc.document.0.0.692c7008rgi7iZ

 

 

依賴commons-codes包

<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.15</version>
</dependency>

 

API使用說明

  1. 實例化加解密類,入參是token, aesKey, ownerKey(企業回調是corpId, 三方應用回調是suiteKey) DingCallbackCrypto callbackCrypto = new DingCallbackCrypto(TOKEN, AES_KEY, OWNER_KEY);
  2. 解密釘釘推送的數據,從http請求中獲取解密參數 String decryptMsg = callbackCrypto.getDecryptMsg(msg_signature, timeStamp, nonce, encrypt);
  3. 返回success的加密字符串 Map<String, String> successMap = callbackCrypto.getEncryptedMap("success");

回調處理流程

@RequestMapping(value = "/callback", method = RequestMethod.POST)
    public Map<String, String> callback(HttpServletRequest request, @RequestBody String paramBodyStr) throws DingCallbackCrypto.DingTalkEncryptException {

        // 1. 從http請求中獲取加解密參數
        String msg_signature = request.getParameter("msg_signature");
        if (msg_signature == null) {
            msg_signature = request.getParameter("signature");
        }
        String timeStamp = request.getParameter("timeStamp");
        if (timeStamp == null) {
            timeStamp = request.getParameter("timestamp");
        }
        String nonce = request.getParameter("nonce");
        JSONObject jsonObj = JSON.parseObject(paramBodyStr);
        String encrypt = jsonObj.getString("encrypt");
        log.info("encrypt:" + encrypt);

        // 2. 使用加解密類型
        // DingCallbackCrypto callbackCrypto = new DingCallbackCrypto(TOKEN, AES_KEY, OWNER_KEY);
        DingCallbackCrypto callbackCrypto = new DingCallbackCrypto("ACfd7GB2IQMUAamb1AqbDBTr4kCjMXZgp"
                , "JOL6m4zOPmYUvtcNhPKWdTuJwY9DNAF39xKLm1YxJkg"
                , "dingh2hwao9znuoqz41d");//當使用本文檔中的方式接收釘釘推送的訂閱事件時,是以應用為維度推送的,OWNER_KEY為應用的AppKey
        final String decryptMsg = callbackCrypto.getDecryptMsg(msg_signature, timeStamp, nonce, encrypt);
        log.info("decryptMsg:" + decryptMsg);

        // 3. 反序列化回調事件json數據
        JSONObject eventJson = JSON.parseObject(decryptMsg);
        String eventType = eventJson.getString("EventType");

        // 4. 根據EventType分類處理
        if ("check_url".equals(eventType)) {
            // 測試回調url的正確性
            log.info("測試回調url的正確性");
        } else if ("user_add_org".equals(eventType)) {
            // 處理通訊錄用戶增加時間
            log.info("處理通訊錄用戶增加時間");
        } else {
            // 添加其他已注冊的
            log.info("添加其他已注冊的");
        }

        // 5. 返回success的加密數據
        Map<String, String> successMap = callbackCrypto.getEncryptedMap("success");
        log.info("successMap:" + successMap);
        return successMap;
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM