diff --git a/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/huawei/HuaweiServiceV2.java b/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/huawei/HuaweiServiceV2.java new file mode 100644 index 000000000..da8a68a18 --- /dev/null +++ b/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/huawei/HuaweiServiceV2.java @@ -0,0 +1,116 @@ +package com.jsowell.thirdparty.huawei; + +import cn.hutool.http.HttpUtil; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.jsowell.common.constant.Constants; +import com.jsowell.common.core.redis.RedisCache; +import com.jsowell.common.enums.thirdparty.ThirdPlatformTypeEnum; +import com.jsowell.common.util.DateUtils; +import com.jsowell.common.util.StringUtils; +import com.jsowell.pile.domain.ThirdPartySettingInfo; +import com.jsowell.pile.service.ThirdPartySettingInfoService; +import com.jsowell.thirdparty.lianlian.common.CommonResult; +import com.jsowell.thirdparty.lianlian.dto.CommonParamsDTO; +import com.jsowell.thirdparty.lianlian.util.Cryptos; +import com.jsowell.thirdparty.lianlian.util.Encodes; +import com.jsowell.thirdparty.lianlian.util.GBSignUtils; +import com.jsowell.thirdparty.zhongdianlian.dto.ZDLGetTokenDTO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.nio.charset.StandardCharsets; +import java.util.Date; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * 华为Service + * + * @author Lemon + * @Date 2024/1/19 14:10:02 + */ +@Service +public class HuaweiServiceV2 { + + @Autowired + private ThirdPartySettingInfoService thirdPartySettingInfoService; + + @Autowired + private RedisCache redisCache; + + /** + * 获取华为 Token + * @return + */ + public String getHuaWeiToken() { + String operatorId = Constants.OPERATORID_JIANG_SU; + String redisKey = "huawei_get_token:" + operatorId; + // 先查缓存 + String cacheToken = redisCache.getCacheObject(redisKey); + if (StringUtils.isNotBlank(cacheToken)) { + return cacheToken; + } + // 通过华为的type查询出密钥配置 + ThirdPartySettingInfo info = new ThirdPartySettingInfo(); + info.setType(ThirdPlatformTypeEnum.HUA_WEI.getCode()); + ThirdPartySettingInfo settingInfo = thirdPartySettingInfoService.selectSettingInfo(info); + + String operatorSecret = settingInfo.getOperatorSecret(); + String dataSecret = settingInfo.getDataSecret(); + String dataSecretIv = settingInfo.getDataSecretIv(); + String signSecret = settingInfo.getSignSecret(); + String urlAddress = settingInfo.getUrlAddress(); + + String requestUrl = urlAddress + "query_token"; + + // 拼装参数 + JSONObject jsonObject = new JSONObject(); + jsonObject.put("OperatorID", operatorId); + jsonObject.put("OperatorSecret", operatorSecret); + + // 加密 + byte[] encryptText = Cryptos.aesEncrypt(jsonObject.toJSONString().getBytes(StandardCharsets.UTF_8), + dataSecret.getBytes(), dataSecretIv.getBytes()); + String strData = Encodes.encodeBase64(encryptText); + + Map request = new LinkedHashMap<>(); + request.put("OperatorID", operatorId); + request.put("Data", strData); + request.put("TimeStamp", DateUtils.parseDateToStr(DateUtils.YYYYMMDDHHMMSS, new Date())); + request.put("Seq", "0001"); + + // 生成签名 + String sig = GBSignUtils.sign(request, signSecret); + request.put("Sig", sig); + + String tokenRequest = JSONObject.toJSONString(request); + String response = HttpUtil.post(requestUrl, tokenRequest); + + CommonResult commonResult = JSONObject.parseObject(response, CommonResult.class); + if (commonResult.getRet() != 0) { + return commonResult.getMsg(); + } + // 解密data + byte[] plainText = Cryptos.aesDecrypt(Encodes.decodeBase64((String) commonResult.getData()), + dataSecret.getBytes(), dataSecretIv.getBytes()); + String dataStr = new String(plainText, StandardCharsets.UTF_8); + Map resultMap = (Map) JSON.parse(dataStr); + int succStat = Integer.parseInt(resultMap.get("SuccStat")); + if (succStat != 0) { + return resultMap.get("FailReason"); + } + String token = resultMap.get("AccessToken"); + int tokenAvailableTime = Integer.parseInt(resultMap.get("TokenAvailableTime")); // 凭证有效期,单位秒 + // 存入缓存 + redisCache.setCacheObject(redisKey, token, tokenAvailableTime, TimeUnit.SECONDS); + return token; + } + + + + + + +}