Преглед изворни кода

【越加红】纷享销客 事件订阅回调功能

wub пре 3 година
родитељ
комит
813c4f295d

+ 14 - 0
src/main/java/com/uas/eis/beans/arg/CrmCallBackArg.java

@@ -0,0 +1,14 @@
+package com.uas.eis.beans.arg;
+
+import lombok.Data;
+
+@Data
+public class CrmCallBackArg {
+    private String signature;
+    private Long timestamp;
+    private String nonce;
+    private String messageId;
+    private Integer retryTimes;
+    private String enterpriseAccount;
+    private String encryptedContent;
+}

+ 11 - 0
src/main/java/com/uas/eis/beans/result/CrmCallBackResult.java

@@ -0,0 +1,11 @@
+package com.uas.eis.beans.result;
+
+import lombok.Data;
+
+@Data
+public class CrmCallBackResult {
+    private String signature;
+    private Long timestamp;
+    private String nonce;
+    private String encryptedResult;
+}

+ 4 - 0
src/main/java/com/uas/eis/controller/BaseController.java

@@ -0,0 +1,4 @@
+package com.uas.eis.controller;
+
+public class BaseController {
+}

+ 56 - 0
src/main/java/com/uas/eis/controller/EventCallbackController.java

@@ -0,0 +1,56 @@
+package com.uas.eis.controller;
+
+import com.uas.eis.beans.arg.CrmCallBackArg;
+import com.uas.eis.beans.result.CrmCallBackResult;
+import com.uas.eis.utils.SignUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+@Slf4j
+@RestController
+@RequestMapping("/event/")
+public class EventCallbackController extends BaseController{
+    private static final String SUCCESS = "success";
+    private String aesKey = "cXdlcnR5dWlvcGFzZGZnaGprbHp4Y3Zibm1xd2VycXc=";
+
+    @ResponseBody
+    @RequestMapping(value = "crmCallback", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
+    public CrmCallBackResult crmCallBack(CrmCallBackArg arg) throws Exception {
+        Integer retryTimes = arg.getRetryTimes();
+        String signature = null;
+        if (retryTimes != null) {
+            signature = SignUtil.shaEncode(arg.getTimestamp() + arg.getNonce() + arg.getMessageId() + retryTimes + arg.getEnterpriseAccount() + arg.getEncryptedContent() + aesKey);
+        } else {
+            signature = SignUtil.shaEncode(arg.getTimestamp() + arg.getNonce() + arg.getMessageId() + arg.getEnterpriseAccount() + arg.getEncryptedContent() + aesKey);
+        }
+        //校验signature
+        if (!arg.getSignature().equals(signature)) {
+            Long returnTimestamp = System.currentTimeMillis();
+            String returnEncryptedResult = SignUtil.encryptAes("sinature is wrong", aesKey);
+            String returnNonce = (int) (Math.random() * 100000) + "";
+            String returnSignature = SignUtil.shaEncode(returnTimestamp + returnNonce + returnEncryptedResult + aesKey);
+            CrmCallBackResult crmCallBackResult = new CrmCallBackResult();
+            crmCallBackResult.setTimestamp(returnTimestamp);
+            crmCallBackResult.setEncryptedResult(returnEncryptedResult);
+            crmCallBackResult.setNonce(returnNonce);
+            crmCallBackResult.setSignature(returnSignature);
+            log.warn("crmCallBack={}", crmCallBackResult);
+            return crmCallBackResult;
+        }
+        //处理第三方业务逻辑
+        String json = SignUtil.decryptAes(arg.getEncryptedContent(), aesKey);
+        //....
+        //返回结果
+        Long returnTimestamp = System.currentTimeMillis();
+        String returnEncryptedResult = SignUtil.encryptAes("success", aesKey);
+        String returnNonce = (int) (Math.random() * 1000000) + "";
+        String returnSignature = SignUtil.shaEncode(returnTimestamp + returnNonce + returnEncryptedResult + aesKey);
+        CrmCallBackResult crmCallBackResult = new CrmCallBackResult();
+        crmCallBackResult.setTimestamp(returnTimestamp);
+        crmCallBackResult.setEncryptedResult(returnEncryptedResult);
+        crmCallBackResult.setNonce(returnNonce);
+        crmCallBackResult.setSignature(returnSignature);
+        log.info("json={},crmCallBack={}", json, crmCallBackResult);
+        return crmCallBackResult;
+    }
+}

+ 49 - 0
src/main/java/com/uas/eis/utils/SignUtil.java

@@ -0,0 +1,49 @@
+package com.uas.eis.utils;
+
+import org.apache.commons.codec.binary.Base64;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import java.security.MessageDigest;
+
+public class SignUtil {
+    public static String decryptAes(String encryptedContent, String aesKey) throws Exception {
+        byte[] ciphertextBytes = Base64.decodeBase64(encryptedContent); // decode加密密文结果
+        byte[] aesKeyBytes = Base64.decodeBase64(aesKey); // decode 秘钥
+        SecretKeySpec keySpec = new SecretKeySpec(aesKeyBytes, "AES");
+        IvParameterSpec iv = new IvParameterSpec(aesKeyBytes, 0, 16); // 初始化向量
+        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); // 加密模式为CBC
+        cipher.init(Cipher.DECRYPT_MODE, keySpec, iv);
+        byte[] plaintextBytes = cipher.doFinal(ciphertextBytes);
+        String result = new String(plaintextBytes, "utf-8"); // 解密结果
+        return result;
+    }
+
+    public static String encryptAes(String result, String aesKey) throws Exception {
+        byte[] plaintextBytes = result.getBytes();
+        byte[] aesKeyBytes = Base64.decodeBase64(aesKey);
+        SecretKeySpec keySpec = new SecretKeySpec(aesKeyBytes, "AES");
+        IvParameterSpec iv = new IvParameterSpec(aesKeyBytes, 0, 16);
+        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
+        cipher.init(Cipher.ENCRYPT_MODE, keySpec, iv);
+        byte[] encryptedBytes = cipher.doFinal(plaintextBytes);
+        String encryptedResult = Base64.encodeBase64String(encryptedBytes); //转换为64位编码
+        return encryptedResult;
+    }
+
+    public static String shaEncode(String text) throws Exception {
+        MessageDigest shaDigest = MessageDigest.getInstance("SHA");
+        byte[] byteArray = text.getBytes("UTF-8");
+        byte[] md5Bytes = shaDigest.digest(byteArray);
+        StringBuffer hexValue = new StringBuffer();
+        for (int i = 0; i < md5Bytes.length; i++) {
+            int val = ((int) md5Bytes[i]) & 0xff;
+            if (val < 16) {
+                hexValue.append("0");
+            }
+            hexValue.append(Integer.toHexString(val));
+        }
+        return hexValue.toString();
+    }
+}