package com.zsElectric.boot.common.util.electric; import cn.hutool.core.bean.BeanUtil; import com.google.gson.Gson; import com.google.gson.JsonObject; import com.zsElectric.boot.common.constant.ConnectivityConstants; import com.zsElectric.boot.common.util.AESCryptoUtils; import com.zsElectric.boot.common.util.HmacMD5Util; import com.zsElectric.boot.common.util.OkHttpUtil; import com.zsElectric.boot.common.util.SequenceGenUtil; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; import java.util.Objects; @Slf4j @Component public class ChargingUtil { @Resource private ElectricTokenManager tokenManager; @Resource private OkHttpUtil okHttpUtil; /** * 请求封装 * @param url * @param queryParms * @param tokenRequired * @return */ public JsonObject chargingRequest(String url, Map queryParms,boolean tokenRequired){ Map headers = new HashMap<>(); if(tokenRequired){ headers.put("Authorization", "Bearer " + tokenManager.getValidAccessToken()); } try { RequestParmsEntity requestParms = new RequestParmsEntity(); SequenceGenUtil.SequenceResult result = SequenceGenUtil.generate(); requestParms .setOperatorID(ConnectivityConstants.OPERATOR_ID) .setData(AesCryptoUtil.encrypt(queryParms.toString(),ConnectivityConstants.PLATFORM_DATA_SECRET, ConnectivityConstants.PLATFORM_DATA_SECRET_IV)) .setTimeStamp(result.getTimestamp()) .setSeq(result.getSequence()) .setSig(HmacMD5Util.genSign(requestParms.getOperatorID(),requestParms.getData(),requestParms.getTimeStamp(),requestParms.getSeq(),ConnectivityConstants.SIG_SECRET)); JsonObject response = okHttpUtil.doPostForm(url, BeanUtil.beanToMap(requestParms), headers); if (Objects.isNull(response)) { log.error("调用第三方接口获取Token失败"); return null; } return response; }catch (Exception e){ throw new RuntimeException("调用第三方接口发生异常", e); } } /** * 响应解密 * @param response * @return */ public JsonObject responseDecode(JsonObject response){ try { if (Objects.isNull(response)) { log.error("第三方接口响应数据为空"); return null; } Gson gson = new Gson(); ResponseParmsEntity responseParms = gson.fromJson(response, ResponseParmsEntity.class); String data = responseParms.getRet() + responseParms.getMsg() + responseParms.getData(); boolean verify = HmacMD5Util.verify(data, ConnectivityConstants.PLATFORM_SIG_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); } } }