diff --git a/jsowell-admin/src/main/java/com/jsowell/lianlian/LianLianController.java b/jsowell-admin/src/main/java/com/jsowell/lianlian/LianLianController.java index b09bcab7b..30d0b406c 100644 --- a/jsowell-admin/src/main/java/com/jsowell/lianlian/LianLianController.java +++ b/jsowell-admin/src/main/java/com/jsowell/lianlian/LianLianController.java @@ -7,11 +7,15 @@ import com.jsowell.common.enums.ykc.ReturnCodeEnum; import com.jsowell.common.exception.BusinessException; import com.jsowell.common.response.RestApiResponse; import com.jsowell.common.util.StringUtils; +import com.jsowell.pile.domain.DockingPlatformConfig; import com.jsowell.pile.dto.*; +import com.jsowell.pile.service.IDockingPlatformConfigService; import com.jsowell.thirdparty.lianlian.common.CommonResult; import com.jsowell.thirdparty.lianlian.domain.StationStatsInfo; -import com.jsowell.thirdparty.lianlian.dto.QueryTokenDTO; +import com.jsowell.thirdparty.lianlian.dto.CommonParamsDTO; import com.jsowell.thirdparty.lianlian.service.LianLianService; +import com.jsowell.thirdparty.lianlian.util.Cryptos; +import com.jsowell.thirdparty.lianlian.util.Encodes; import com.jsowell.thirdparty.lianlian.vo.*; import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -35,6 +39,8 @@ public class LianLianController extends BaseController { @Autowired private LianLianService lianLianService; + @Autowired + private IDockingPlatformConfigService dockingPlatformConfigService; /** * 推送充电站信息 notification_stationInfo @@ -149,23 +155,25 @@ public class LianLianController extends BaseController { * @param dto * @return */ - @PostMapping("/query_stations_info") - public RestApiResponse query_stations_info(@RequestBody QueryStationInfoDTO dto) { - logger.info("联联平台查询充电站信息 params:{}", JSONObject.toJSONString(dto)); - RestApiResponse response = null; - try { - LianLianPageResponse pageResponse = lianLianService.query_stations_info(dto); - response = new RestApiResponse<>(pageResponse); - }catch (BusinessException e) { - logger.error("联联平台查询充电站信息 error",e); - response = new RestApiResponse<>(e.getCode(), e.getMessage()); - }catch (Exception e) { - logger.error("联联平台查询充电站信息 error", e); - response = new RestApiResponse<>(e); - } - logger.info("联联平台查询充电站信息 result:{}", response); - return response; - } + // @PostMapping("/query_stations_info") + // public RestApiResponse query_stations_info(@RequestBody QueryStationInfoDTO dto) { + // logger.info("联联平台查询充电站信息 params:{}", JSONObject.toJSONString(dto)); + // RestApiResponse response = null; + // try { + // // 校验签名 + // // lianLianService.checkoutSign(); + // LianLianPageResponse pageResponse = lianLianService.query_stations_info(dto); + // response = new RestApiResponse<>(pageResponse); + // }catch (BusinessException e) { + // logger.error("联联平台查询充电站信息 error",e); + // response = new RestApiResponse<>(e.getCode(), e.getMessage()); + // }catch (Exception e) { + // logger.error("联联平台查询充电站信息 error", e); + // response = new RestApiResponse<>(e); + // } + // logger.info("联联平台查询充电站信息 result:{}", response); + // return response; + // } /** * 联联平台查询充电站状态信息 @@ -320,7 +328,7 @@ public class LianLianController extends BaseController { * http://localhost:8080/LianLian/v1/query_token */ @PostMapping("/v1/query_token") - public CommonResult queryToken(QueryTokenDTO dto) { + public CommonResult queryToken(CommonParamsDTO dto) { try { Map map = lianLianService.generateToken(dto); return CommonResult.success(0, "", map.get("data"), map.get("sig")); @@ -329,4 +337,34 @@ public class LianLianController extends BaseController { return CommonResult.failed("获取token发生异常"); } } + + /** + * 联联平台查询充电站信息 + * http://localhost:8080/LianLian/query_stations_info + * @param dto + * @return + */ + @PostMapping("/query_stations_info") + public CommonResult query_stations_info(@RequestBody CommonParamsDTO dto) { + try { + // 校验签名 + Map resultMap = lianLianService.checkoutSign(dto); + if (resultMap == null) { + // 签名错误 + return CommonResult.failed("签名校验错误"); + } + String operatorSecret = resultMap.get("OperatorSecret"); + String dataString = resultMap.get("Data"); + // 解密data + byte[] plainText = Cryptos.aesDecrypt(Encodes.decodeBase64(dataString), operatorSecret.getBytes(), operatorSecret.getBytes()); + String dataStr = new String(plainText, "UTF-8"); + // 转换成相应对象 + QueryStationInfoDTO queryStationInfoDTO = JSONObject.parseObject(dataStr, QueryStationInfoDTO.class); + LianLianPageResponse response = lianLianService.query_stations_info(queryStationInfoDTO); + return CommonResult.success(response); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } } diff --git a/jsowell-admin/src/test/java/SpringBootTestController.java b/jsowell-admin/src/test/java/SpringBootTestController.java index 9640ff9de..912beec92 100644 --- a/jsowell-admin/src/test/java/SpringBootTestController.java +++ b/jsowell-admin/src/test/java/SpringBootTestController.java @@ -36,7 +36,7 @@ import com.jsowell.service.MemberService; import com.jsowell.service.OrderService; import com.jsowell.service.PileRemoteService; import com.jsowell.service.PileService; -import com.jsowell.thirdparty.lianlian.dto.QueryTokenDTO; +import com.jsowell.thirdparty.lianlian.dto.CommonParamsDTO; import com.jsowell.thirdparty.lianlian.service.LianLianService; import com.jsowell.thirdparty.lianlian.util.Cryptos; import com.jsowell.thirdparty.lianlian.util.Encodes; @@ -204,7 +204,7 @@ public class SpringBootTestController { request.put("Sig", sig); String tokenRequest = JSONUtil.toJsonStr(request); - QueryTokenDTO dto = JSONObject.parseObject(tokenRequest, QueryTokenDTO.class); + CommonParamsDTO dto = JSONObject.parseObject(tokenRequest, CommonParamsDTO.class); lianLianService.generateToken(dto); } @@ -226,15 +226,15 @@ public class SpringBootTestController { // LianLianGetTokenDTO dto = new LianLianGetTokenDTO(); // dto.setOperatorId("MA1JLFUU8"); // dto.setOperatorSecret("Nh62XxlIR5OjAzFj"); - String token = lianLianService.getToken("", "MA1JLFUU8", "fGwLsxW1HdzLw7jp"); - System.out.println("token:" + token); + // String token = lianLianService.getToken("", "MA1JLFUU8", "fGwLsxW1HdzLw7jp"); + // System.out.println("token:" + token); String operatorId = "I4XLPQPV"; String operatorSecret = "3DSBTWHVIC6KVCKI"; // 请求data Map data = new HashMap<>(); - data.put("OperatorID", operatorId); - data.put("OperatorSecret", operatorSecret); + // data.put("OperatorID", operatorId); + // data.put("OperatorSecret", operatorSecret); String dataJson = JSONUtil.toJsonStr(data); // 加密 @@ -251,22 +251,23 @@ public class SpringBootTestController { // 生成签名 String sig = GBSignUtils.sign(request, operatorSecret); request.put("Sig", sig); - - QueryTokenDTO dto = new QueryTokenDTO(); - dto.setOperatorID(operatorId); - dto.setData(strData); - dto.setTimeStamp(timeStamp); - dto.setSeq("0001"); - dto.setSig(sig); - Map map = lianLianService.generateToken(dto); - String data1 = map.get("Data"); - // 解密data - byte[] plainText = Cryptos.aesDecrypt(Encodes.decodeBase64(data1), - operatorSecret.getBytes(), operatorSecret.getBytes()); - String dataStr = new String(plainText, "UTF-8"); - Map resultMap = (Map) JSON.parse(dataStr); - token = resultMap.get("AccessToken"); - System.out.println("解密后token:" + token); + JSONObject jsonObject = new JSONObject(request); + System.out.println(jsonObject); + // CommonParamsDTO dto = new CommonParamsDTO(); + // dto.setOperatorID(operatorId); + // dto.setData(strData); + // dto.setTimeStamp(timeStamp); + // dto.setSeq("0001"); + // dto.setSig(sig); + // Map map = lianLianService.generateToken(dto); + // String data1 = map.get("Data"); + // // 解密data + // byte[] plainText = Cryptos.aesDecrypt(Encodes.decodeBase64(data1), + // operatorSecret.getBytes(), operatorSecret.getBytes()); + // String dataStr = new String(plainText, "UTF-8"); + // Map resultMap = (Map) JSON.parse(dataStr); + // String token = resultMap.get("AccessToken"); + // System.out.println("解密后token:" + token); // LianLianPushStationInfoDTO dto1 = LianLianPushStationInfoDTO.builder() diff --git a/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/lianlian/dto/QueryTokenDTO.java b/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/lianlian/dto/CommonParamsDTO.java similarity index 93% rename from jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/lianlian/dto/QueryTokenDTO.java rename to jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/lianlian/dto/CommonParamsDTO.java index e6d023891..c8db520b8 100644 --- a/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/lianlian/dto/QueryTokenDTO.java +++ b/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/lianlian/dto/CommonParamsDTO.java @@ -6,7 +6,7 @@ import lombok.Setter; @Getter @Setter -public class QueryTokenDTO { +public class CommonParamsDTO { @JsonProperty(value = "OperatorID") private String operatorID; diff --git a/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/lianlian/service/LianLianService.java b/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/lianlian/service/LianLianService.java index 703173449..0b16c2bf6 100644 --- a/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/lianlian/service/LianLianService.java +++ b/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/lianlian/service/LianLianService.java @@ -2,7 +2,7 @@ package com.jsowell.thirdparty.lianlian.service; import com.jsowell.pile.dto.*; import com.jsowell.thirdparty.lianlian.domain.StationStatsInfo; -import com.jsowell.thirdparty.lianlian.dto.QueryTokenDTO; +import com.jsowell.thirdparty.lianlian.dto.CommonParamsDTO; import com.jsowell.thirdparty.lianlian.vo.*; import java.io.UnsupportedEncodingException; @@ -154,5 +154,17 @@ public interface LianLianService { */ String pushPileChargeStatusChange(String orderCode); - Map generateToken(QueryTokenDTO dto) throws UnsupportedEncodingException; + /** + * 生成令牌 + * @param dto + * @return + * @throws UnsupportedEncodingException + */ + Map generateToken(CommonParamsDTO dto) throws UnsupportedEncodingException; + + /** + * 校验签名 + * @param dto + */ + Map checkoutSign(CommonParamsDTO dto); } diff --git a/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/lianlian/service/impl/LianLianServiceImpl.java b/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/lianlian/service/impl/LianLianServiceImpl.java index 55adf8ced..8ecb606bd 100644 --- a/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/lianlian/service/impl/LianLianServiceImpl.java +++ b/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/lianlian/service/impl/LianLianServiceImpl.java @@ -36,7 +36,7 @@ import com.jsowell.pile.vo.web.PileConnectorInfoVO; import com.jsowell.pile.vo.web.PileModelInfoVO; import com.jsowell.pile.vo.web.PileStationVO; import com.jsowell.thirdparty.lianlian.domain.*; -import com.jsowell.thirdparty.lianlian.dto.QueryTokenDTO; +import com.jsowell.thirdparty.lianlian.dto.CommonParamsDTO; import com.jsowell.thirdparty.lianlian.service.LianLianService; import com.jsowell.thirdparty.lianlian.util.Cryptos; import com.jsowell.thirdparty.lianlian.util.Encodes; @@ -1233,33 +1233,30 @@ public class LianLianServiceImpl implements LianLianService { return result; } + /** + * 生成令牌 + * @param dto + * @return + * @throws UnsupportedEncodingException + */ @Override - public Map generateToken(QueryTokenDTO dto) throws UnsupportedEncodingException { + public Map generateToken(CommonParamsDTO dto) throws UnsupportedEncodingException { String operatorID = dto.getOperatorID(); - // 通过operatorID 查出 operatorSecret TODO 建表 设置密钥 + // 通过operatorID 查出 operatorSecret DockingPlatformConfig platformConfig = dockingPlatformConfigService.getInfoByOperatorId(operatorID); if (platformConfig == null) { return null; } String operatorSecret = platformConfig.getOperatorSecret(); - - Map map = Maps.newLinkedHashMap(); - map.put("OperatorID", dto.getOperatorID()); - map.put("Data", dto.getData()); - map.put("TimeStamp", dto.getTimeStamp()); - map.put("Seq", dto.getSeq()); - String sign = GBSignUtils.sign(map, operatorSecret); - System.out.println(sign); - - // 验证签名 得到请求方传过来的签名sig->自己拿到请求体后,再按双方约定的协议生成一个sig->对比两个sig是否一致 - if (!StringUtils.equals(dto.getSig(), sign)) { - System.out.println("签名校验==失败"); + // 校验签名 + Map checkResultMap = checkoutSign(dto); + if (checkResultMap == null) { + // 校验失败 return null; } - System.out.println("签名校验通过!!!"); - + String dataString = checkResultMap.get("Data"); // 解密data - byte[] plainText = Cryptos.aesDecrypt(Encodes.decodeBase64(dto.getData()), operatorSecret.getBytes(), operatorSecret.getBytes()); + byte[] plainText = Cryptos.aesDecrypt(Encodes.decodeBase64(dataString), operatorSecret.getBytes(), operatorSecret.getBytes()); String dataStr = new String(plainText, "UTF-8"); Map resMap = (Map) JSON.parse(dataStr); String secret = resMap.get("OperatorSecret"); @@ -1285,19 +1282,59 @@ public class LianLianServiceImpl implements LianLianService { vo.setSuccStat("0"); Map resultMap = Maps.newLinkedHashMap(); - // 加密数据 TODO vo对象加密 + // 加密数据 byte[] encryptText = Cryptos.aesEncrypt(JSONObject.toJSONString(vo).getBytes(), platformConfig.getDataSecret().getBytes(), platformConfig.getDataSecretIv().getBytes()); String encryptData = Encodes.encodeBase64(encryptText); resultMap.put("Data", encryptData); - // 生成sig TODO 生成sig + // 生成sig String resultSign = GBSignUtils.sign(resultMap, operatorSecret); resultMap.put("Sig", resultSign); return resultMap; } + /** + * 校验签名并返回data(未解密) + * @param dto + */ + @Override + public Map checkoutSign(CommonParamsDTO dto){ + String operatorID = dto.getOperatorID(); + // 通过operatorID 查出 operatorSecret + DockingPlatformConfig platformConfig = dockingPlatformConfigService.getInfoByOperatorId(operatorID); + if (platformConfig == null) { + return null; + } + String operatorSecret = platformConfig.getOperatorSecret(); + + Map map = Maps.newLinkedHashMap(); + map.put("OperatorID", dto.getOperatorID()); + map.put("Data", dto.getData()); + map.put("TimeStamp", dto.getTimeStamp()); + map.put("Seq", dto.getSeq()); + String sign = GBSignUtils.sign(map, operatorSecret); + System.out.println(sign); + + // 验证签名 得到请求方传过来的签名sig->自己拿到请求体后,再按双方约定的协议生成一个sig->对比两个sig是否一致 + if (!StringUtils.equals(dto.getSig(), sign)) { + System.out.println("签名校验==失败"); + return null; + } + System.out.println("签名校验通过!!!"); + + // 解密data + // byte[] plainText = Cryptos.aesDecrypt(Encodes.decodeBase64(dto.getData()), operatorSecret.getBytes(), operatorSecret.getBytes()); + // String dataStr = new String(plainText, "UTF-8"); + // Map resMap = (Map) JSON.parse(dataStr); + // return resMap; + Map resultMap = new LinkedHashMap<>(); + resultMap.put("Data", dto.getData()); + resultMap.put("OperatorSecret", operatorSecret); + return resultMap; + } + /** * TODO 请求打印充电小票 */