|
@@ -7,18 +7,20 @@ import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.springframework.web.bind.annotation.*;
|
|
import org.springframework.web.bind.annotation.*;
|
|
|
|
|
|
|
|
+import java.util.Map;
|
|
|
|
+
|
|
@RestController
|
|
@RestController
|
|
@RequestMapping("/")
|
|
@RequestMapping("/")
|
|
public class DingDingController {
|
|
public class DingDingController {
|
|
- private final Logger log = LoggerFactory.getLogger(getClass());
|
|
|
|
|
|
+ private final Logger bizLogger = LoggerFactory.getLogger(getClass());
|
|
String token = "cf776d62c5fb3508b5d8c2cbb9f3df0c";
|
|
String token = "cf776d62c5fb3508b5d8c2cbb9f3df0c";
|
|
String aesKey = "ktmbamhymjsf60ndwp6n81mnu92847oynsgj9e0zr9v";
|
|
String aesKey = "ktmbamhymjsf60ndwp6n81mnu92847oynsgj9e0zr9v";
|
|
- String corpId = "169917db7f1ee5f435c2f4657eb6378f";
|
|
|
|
|
|
+ String suiteKey = "suitejwoq9dw4bxv4stdb";
|
|
|
|
|
|
@PostMapping(value = "dingCallback")
|
|
@PostMapping(value = "dingCallback")
|
|
- public Object dingCallback(
|
|
|
|
|
|
+ public Map<String, String> dingCallback(
|
|
@RequestParam(value = "signature") String signature,
|
|
@RequestParam(value = "signature") String signature,
|
|
- @RequestParam(value = "timestamp") Long timestamp,
|
|
|
|
|
|
+ @RequestParam(value = "timestamp") String timestamp,
|
|
@RequestParam(value = "nonce") String nonce,
|
|
@RequestParam(value = "nonce") String nonce,
|
|
@RequestBody(required = false) JSONObject body
|
|
@RequestBody(required = false) JSONObject body
|
|
) {
|
|
) {
|
|
@@ -35,21 +37,60 @@ public class DingDingController {
|
|
// String eventType = callBackContent.getString("EventType");
|
|
// String eventType = callBackContent.getString("EventType");
|
|
//TODO 将数据持久化
|
|
//TODO 将数据持久化
|
|
// return plainText;
|
|
// return plainText;
|
|
|
|
+// try {
|
|
|
|
+// DingCallbackCrypto encryptor = new DingCallbackCrypto(token, aesKey, suiteKey);
|
|
|
|
+// String encrypt = body.getString("encrypt");
|
|
|
|
+// String plainText = encryptor.getDecryptMsg(signature, timestamp.toString(), nonce, encrypt);
|
|
|
|
+// JSONObject callBackContent = JSON.parseObject(plainText);
|
|
|
|
+// // 根据回调事件类型做不同的业务处理
|
|
|
|
+// String eventType = callBackContent.getString("EventType");
|
|
|
|
+// log.info("eventType=="+eventType);
|
|
|
|
+// System.out.println("eventType=="+eventType);
|
|
|
|
+// System.out.println("plainText=="+plainText);
|
|
|
|
+//
|
|
|
|
+//
|
|
|
|
+// return plainText;
|
|
|
|
+// } catch (DingCallbackCrypto.DingTalkEncryptException e) {
|
|
|
|
+// e.printStackTrace();
|
|
|
|
+// return e.getMessage();
|
|
|
|
+// }
|
|
|
|
+
|
|
try {
|
|
try {
|
|
- DingCallbackCrypto encryptor = new DingCallbackCrypto(token, aesKey, corpId);
|
|
|
|
- String encrypt = body.getString("encrypt");
|
|
|
|
- String plainText = encryptor.getDecryptMsg(signature, timestamp.toString(), nonce, encrypt);
|
|
|
|
- JSONObject callBackContent = JSON.parseObject(plainText);
|
|
|
|
- // 根据回调事件类型做不同的业务处理
|
|
|
|
- String eventType = callBackContent.getString("EventType");
|
|
|
|
- log.info("eventType=="+eventType);
|
|
|
|
- System.out.println("eventType=="+eventType);
|
|
|
|
- System.out.println("plainText=="+plainText);
|
|
|
|
- return plainText;
|
|
|
|
|
|
+ // 1. 从http请求中获取加解密参数
|
|
|
|
+
|
|
|
|
+ // 2. 使用加解密类型
|
|
|
|
+ // Constant.OWNER_KEY 说明:
|
|
|
|
+ // 1、开发者后台配置的订阅事件为应用级事件推送,
|
|
|
|
+ // 此时OWNER_KEY为应用的APP_KEY(企业内部应用)或SUITE_KEY(三方应用)。
|
|
|
|
+ // 2、调用订阅事件接口订阅的事件为企业级事件推送,
|
|
|
|
+ // 此时OWNER_KEY为:企业的CORP_ID(企业内部应用)或SUITE_KEY(三方应用)
|
|
|
|
+ DingCallbackCrypto callbackCrypto = new DingCallbackCrypto(token, aesKey, suiteKey);
|
|
|
|
+ String encryptMsg = body.getString("encrypt");
|
|
|
|
+ String decryptMsg = callbackCrypto.getDecryptMsg(signature, timestamp, nonce, encryptMsg);
|
|
|
|
+
|
|
|
|
+ // 3. 反序列化回调事件json数据
|
|
|
|
+ JSONObject eventJson = JSON.parseObject(decryptMsg);
|
|
|
|
+ String eventType = eventJson.getString("EventType");
|
|
|
|
+
|
|
|
|
+ // 4. 根据EventType分类处理
|
|
|
|
+ if ("check_url".equals(eventType)) {
|
|
|
|
+ // 测试回调url的正确性
|
|
|
|
+ bizLogger.info("测试回调url的正确性");
|
|
|
|
+ } else if ("user_add_org".equals(eventType)) {
|
|
|
|
+ // 处理通讯录用户增加事件
|
|
|
|
+ bizLogger.info("发生了:" + eventType + "事件");
|
|
|
|
+ } else {
|
|
|
|
+ // 添加其他已注册的
|
|
|
|
+ bizLogger.info("发生了:" + eventType + "事件");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 5. 返回success的加密数据
|
|
|
|
+ Map<String, String> successMap = callbackCrypto.getEncryptedMap("success");
|
|
|
|
+ return successMap;
|
|
} catch (DingCallbackCrypto.DingTalkEncryptException e) {
|
|
} catch (DingCallbackCrypto.DingTalkEncryptException e) {
|
|
e.printStackTrace();
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
- return "fail";
|
|
|
|
|
|
+ return null;
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
}
|