官網文檔:
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使用說明
- 實例化加解密類,入參是token, aesKey, ownerKey(企業回調是corpId, 三方應用回調是suiteKey) DingCallbackCrypto callbackCrypto = new DingCallbackCrypto(TOKEN, AES_KEY, OWNER_KEY);
- 解密釘釘推送的數據,從http請求中獲取解密參數 String decryptMsg = callbackCrypto.getDecryptMsg(msg_signature, timeStamp, nonce, encrypt);
- 返回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; }