Procházet zdrojové kódy

feat(electric): 新增充电接口请求与响应处理功能

- 新增充电接口请求方法,支持token鉴权和参数加密
- 新增响应数据解密和签名校验逻辑
- 新增运营商相关常量配置
- 新增响应参数实体类用于解析第三方接口返回数据
- 在Token管理器中集成响应解密方法以处理token查询接口返回数据
wzq před 1 měsícem
rodič
revize
9736bcec6c

+ 25 - 0
src/main/java/com/zsElectric/boot/common/constant/ConnectivityConstants.java

@@ -8,6 +8,31 @@ package com.zsElectric.boot.common.constant;
  */
 public interface ConnectivityConstants {
 
+    /**
+     * 运营商ID
+     */
+    String PLATFORM_OPERATOR_ID = "MA6DP6BE7";
+
+    /**
+     * 运营商密钥
+     */
+    String PLATFORM_OPERATOR_SECRET = "yY8GtZrjhHcwptSZ";
+
+    /**
+     * 签名密钥
+     */
+    String PLATFORM_SIG_SECRET = "iIbnIjG6NzUtwzRA";
+
+    /**
+     * 数据密钥
+     */
+    String PLATFORM_DATA_SECRET = "zIicJFCLyYcjpJBd";
+
+    /**
+     * 数据密钥向量
+     */
+    String PLATFORM_DATA_SECRET_IV = "sSsZYLus0nrIyQkr";
+
     /**
      * 运营商ID
      */

+ 57 - 0
src/main/java/com/zsElectric/boot/common/util/electric/ChargingUtil.java

@@ -1,6 +1,8 @@
 package com.zsElectric.boot.common.util.electric;
 
 import cn.hutool.core.bean.BeanUtil;
+import com.google.gson.Gson;
+import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
 import com.zsElectric.boot.common.constant.ConnectivityConstants;
 import com.zsElectric.boot.common.util.AESCryptoUtil;
@@ -11,6 +13,7 @@ import jakarta.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 
+import java.security.NoSuchAlgorithmException;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Objects;
@@ -24,6 +27,13 @@ public class ChargingUtil {
     @Resource
     private OkHttpUtil okHttpUtil;
 
+    /**
+     * 请求封装
+     * @param url
+     * @param queryParms
+     * @param tokenRequired
+     * @return
+     */
     public JsonObject chargingRequest(String url, Map<String,Object> queryParms,boolean tokenRequired) {
         Map<String, String> headers = new HashMap<>();
         if(tokenRequired){
@@ -51,4 +61,51 @@ public class ChargingUtil {
             throw new RuntimeException("调用第三方接口发生异常", e);
         }
     }
+
+    /**
+     * 响应解密
+     * @param response
+     * @return
+     */
+    public JsonObject responseDecode(JsonObject response){
+
+        try {
+            Gson gson = new Gson();
+            ResponseParmsEntity responseParms = gson.fromJson(response, ResponseParmsEntity.class);
+            boolean verify = HmacMD5Util.verify(responseParms.getData(), ConnectivityConstants.PLATFORM_DATA_SECRET, responseParms.getSig());
+            if (!verify) {
+                log.error("第三方接口响应数据签名验证失败");
+                return null;
+            }
+
+            if (responseParms.getRet() != 0){
+                switch (responseParms.getRet()) {
+                    case -1:
+                        log.error("系统繁忙,此时请求方稍后重试");
+                        break;
+                    case 4001:
+                        log.error("签名错误");
+                        break;
+                    case 4002:
+                        log.error("Token错误");
+                        break;
+                    case 4003:
+                        log.error("参数不合法,缺少必需的示例:OperatorID、Sig、TimeStamp、Data、Seq五个参数");
+                        break;
+                    case 4004:
+                        log.error("请求的业务参数不合法,各接口定义自己的必须参数");
+                        break;
+                    case 500:
+                        log.error("系统错误");
+                        break;
+                }
+            }
+
+            String decodeData = AESCryptoUtil.decrypt(responseParms.getData(), ConnectivityConstants.PLATFORM_DATA_SECRET,
+                    ConnectivityConstants.PLATFORM_DATA_SECRET_IV);
+            return gson.fromJson(decodeData, JsonObject.class);
+        }catch (Exception e){
+            throw new RuntimeException("第三方接口响应发生异常", e);
+        }
+    }
 }

+ 44 - 0
src/main/java/com/zsElectric/boot/common/util/electric/ResponseParmsEntity.java

@@ -0,0 +1,44 @@
+package com.zsElectric.boot.common.util.electric;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+@Data
+@Accessors(chain = true)
+public class ResponseParmsEntity implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 响应状态
+     * -1:系统繁忙,此时请求方稍后重试
+     * 0:请求成功
+     * 4001:签名错误
+     * 4002:Token错误
+     * 4003:参数不合法,缺少必需的示例:OperatorID、Sig、TimeStamp、Data、Seq五个参数
+     * 4004:请求的业务参数不合法,各接口定义自己的必须参数
+     * 500:系统异常
+     *
+     */
+    private Integer Ret;
+
+    /**
+     * 响应消息
+     */
+    private String Msg;
+
+    /**
+     * 响应加密数据
+     */
+    private String Data;
+
+    /**
+     * 响应签名
+     */
+    private String Sig;
+
+}

+ 2 - 1
src/main/java/com/zsElectric/boot/common/util/electric/TokenManager.java

@@ -163,8 +163,9 @@ public class TokenManager {
                 log.error("调用第三方接口获取Token失败");
                 return null;
             }
+            JsonObject decode = chargingUtil.responseDecode(response);
             Gson gson = new Gson();
-            QueryTokenResponseData responseData = gson.fromJson(response, QueryTokenResponseData.class);
+            QueryTokenResponseData responseData = gson.fromJson(decode, QueryTokenResponseData.class);
 
             if (responseData.getSuccStat() == 1){
                 //0-无,1-OperatorID无效