This commit is contained in:
2023-05-27 16:01:35 +08:00
5 changed files with 152 additions and 64 deletions

View File

@@ -7,11 +7,15 @@ import com.jsowell.common.enums.ykc.ReturnCodeEnum;
import com.jsowell.common.exception.BusinessException; import com.jsowell.common.exception.BusinessException;
import com.jsowell.common.response.RestApiResponse; import com.jsowell.common.response.RestApiResponse;
import com.jsowell.common.util.StringUtils; import com.jsowell.common.util.StringUtils;
import com.jsowell.pile.domain.DockingPlatformConfig;
import com.jsowell.pile.dto.*; import com.jsowell.pile.dto.*;
import com.jsowell.pile.service.IDockingPlatformConfigService;
import com.jsowell.thirdparty.lianlian.common.CommonResult; import com.jsowell.thirdparty.lianlian.common.CommonResult;
import com.jsowell.thirdparty.lianlian.domain.StationStatsInfo; 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.service.LianLianService;
import com.jsowell.thirdparty.lianlian.util.Cryptos;
import com.jsowell.thirdparty.lianlian.util.Encodes;
import com.jsowell.thirdparty.lianlian.vo.*; import com.jsowell.thirdparty.lianlian.vo.*;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -35,6 +39,8 @@ public class LianLianController extends BaseController {
@Autowired @Autowired
private LianLianService lianLianService; private LianLianService lianLianService;
@Autowired
private IDockingPlatformConfigService dockingPlatformConfigService;
/** /**
* 推送充电站信息 notification_stationInfo * 推送充电站信息 notification_stationInfo
@@ -149,23 +155,25 @@ public class LianLianController extends BaseController {
* @param dto * @param dto
* @return * @return
*/ */
@PostMapping("/query_stations_info") // @PostMapping("/query_stations_info")
public RestApiResponse<?> query_stations_info(@RequestBody QueryStationInfoDTO dto) { // public RestApiResponse<?> query_stations_info(@RequestBody QueryStationInfoDTO dto) {
logger.info("联联平台查询充电站信息 params:{}", JSONObject.toJSONString(dto)); // logger.info("联联平台查询充电站信息 params:{}", JSONObject.toJSONString(dto));
RestApiResponse<?> response = null; // RestApiResponse<?> response = null;
try { // try {
LianLianPageResponse pageResponse = lianLianService.query_stations_info(dto); // // 校验签名
response = new RestApiResponse<>(pageResponse); // // lianLianService.checkoutSign();
}catch (BusinessException e) { // LianLianPageResponse pageResponse = lianLianService.query_stations_info(dto);
logger.error("联联平台查询充电站信息 error",e); // response = new RestApiResponse<>(pageResponse);
response = new RestApiResponse<>(e.getCode(), e.getMessage()); // }catch (BusinessException e) {
}catch (Exception e) { // logger.error("联联平台查询充电站信息 error",e);
logger.error("联联平台查询充电站信息 error", e); // response = new RestApiResponse<>(e.getCode(), e.getMessage());
response = new RestApiResponse<>(e); // }catch (Exception e) {
} // logger.error("联联平台查询充电站信息 error", e);
logger.info("联联平台查询充电站信息 result:{}", response); // response = new RestApiResponse<>(e);
return response; // }
} // logger.info("联联平台查询充电站信息 result:{}", response);
// return response;
// }
/** /**
* 联联平台查询充电站状态信息 * 联联平台查询充电站状态信息
@@ -320,7 +328,7 @@ public class LianLianController extends BaseController {
* http://localhost:8080/LianLian/v1/query_token * http://localhost:8080/LianLian/v1/query_token
*/ */
@PostMapping("/v1/query_token") @PostMapping("/v1/query_token")
public CommonResult<?> queryToken(QueryTokenDTO dto) { public CommonResult<?> queryToken(CommonParamsDTO dto) {
try { try {
Map<String, String> map = lianLianService.generateToken(dto); Map<String, String> map = lianLianService.generateToken(dto);
return CommonResult.success(0, "", map.get("data"), map.get("sig")); return CommonResult.success(0, "", map.get("data"), map.get("sig"));
@@ -329,4 +337,34 @@ public class LianLianController extends BaseController {
return CommonResult.failed("获取token发生异常"); 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<String, String> 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;
}
} }

View File

@@ -36,7 +36,7 @@ import com.jsowell.service.MemberService;
import com.jsowell.service.OrderService; import com.jsowell.service.OrderService;
import com.jsowell.service.PileRemoteService; import com.jsowell.service.PileRemoteService;
import com.jsowell.service.PileService; 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.service.LianLianService;
import com.jsowell.thirdparty.lianlian.util.Cryptos; import com.jsowell.thirdparty.lianlian.util.Cryptos;
import com.jsowell.thirdparty.lianlian.util.Encodes; import com.jsowell.thirdparty.lianlian.util.Encodes;
@@ -204,7 +204,7 @@ public class SpringBootTestController {
request.put("Sig", sig); request.put("Sig", sig);
String tokenRequest = JSONUtil.toJsonStr(request); String tokenRequest = JSONUtil.toJsonStr(request);
QueryTokenDTO dto = JSONObject.parseObject(tokenRequest, QueryTokenDTO.class); CommonParamsDTO dto = JSONObject.parseObject(tokenRequest, CommonParamsDTO.class);
lianLianService.generateToken(dto); lianLianService.generateToken(dto);
} }
@@ -226,15 +226,15 @@ public class SpringBootTestController {
// LianLianGetTokenDTO dto = new LianLianGetTokenDTO(); // LianLianGetTokenDTO dto = new LianLianGetTokenDTO();
// dto.setOperatorId("MA1JLFUU8"); // dto.setOperatorId("MA1JLFUU8");
// dto.setOperatorSecret("Nh62XxlIR5OjAzFj"); // dto.setOperatorSecret("Nh62XxlIR5OjAzFj");
String token = lianLianService.getToken("", "MA1JLFUU8", "fGwLsxW1HdzLw7jp"); // String token = lianLianService.getToken("", "MA1JLFUU8", "fGwLsxW1HdzLw7jp");
System.out.println("token:" + token); // System.out.println("token:" + token);
String operatorId = "I4XLPQPV"; String operatorId = "I4XLPQPV";
String operatorSecret = "3DSBTWHVIC6KVCKI"; String operatorSecret = "3DSBTWHVIC6KVCKI";
// 请求data // 请求data
Map<String, String> data = new HashMap<>(); Map<String, String> data = new HashMap<>();
data.put("OperatorID", operatorId); // data.put("OperatorID", operatorId);
data.put("OperatorSecret", operatorSecret); // data.put("OperatorSecret", operatorSecret);
String dataJson = JSONUtil.toJsonStr(data); String dataJson = JSONUtil.toJsonStr(data);
// 加密 // 加密
@@ -251,22 +251,23 @@ public class SpringBootTestController {
// 生成签名 // 生成签名
String sig = GBSignUtils.sign(request, operatorSecret); String sig = GBSignUtils.sign(request, operatorSecret);
request.put("Sig", sig); request.put("Sig", sig);
JSONObject jsonObject = new JSONObject(request);
QueryTokenDTO dto = new QueryTokenDTO(); System.out.println(jsonObject);
dto.setOperatorID(operatorId); // CommonParamsDTO dto = new CommonParamsDTO();
dto.setData(strData); // dto.setOperatorID(operatorId);
dto.setTimeStamp(timeStamp); // dto.setData(strData);
dto.setSeq("0001"); // dto.setTimeStamp(timeStamp);
dto.setSig(sig); // dto.setSeq("0001");
Map<String, String> map = lianLianService.generateToken(dto); // dto.setSig(sig);
String data1 = map.get("Data"); // Map<String, String> map = lianLianService.generateToken(dto);
// 解密data // String data1 = map.get("Data");
byte[] plainText = Cryptos.aesDecrypt(Encodes.decodeBase64(data1), // // 解密data
operatorSecret.getBytes(), operatorSecret.getBytes()); // byte[] plainText = Cryptos.aesDecrypt(Encodes.decodeBase64(data1),
String dataStr = new String(plainText, "UTF-8"); // operatorSecret.getBytes(), operatorSecret.getBytes());
Map<String, String> resultMap = (Map<String, String>) JSON.parse(dataStr); // String dataStr = new String(plainText, "UTF-8");
token = resultMap.get("AccessToken"); // Map<String, String> resultMap = (Map<String, String>) JSON.parse(dataStr);
System.out.println("解密后token" + token); // String token = resultMap.get("AccessToken");
// System.out.println("解密后token" + token);
// LianLianPushStationInfoDTO dto1 = LianLianPushStationInfoDTO.builder() // LianLianPushStationInfoDTO dto1 = LianLianPushStationInfoDTO.builder()

View File

@@ -6,7 +6,7 @@ import lombok.Setter;
@Getter @Getter
@Setter @Setter
public class QueryTokenDTO { public class CommonParamsDTO {
@JsonProperty(value = "OperatorID") @JsonProperty(value = "OperatorID")
private String operatorID; private String operatorID;

View File

@@ -2,7 +2,7 @@ package com.jsowell.thirdparty.lianlian.service;
import com.jsowell.pile.dto.*; import com.jsowell.pile.dto.*;
import com.jsowell.thirdparty.lianlian.domain.StationStatsInfo; 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 com.jsowell.thirdparty.lianlian.vo.*;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
@@ -154,5 +154,17 @@ public interface LianLianService {
*/ */
String pushPileChargeStatusChange(String orderCode); String pushPileChargeStatusChange(String orderCode);
Map<String, String> generateToken(QueryTokenDTO dto) throws UnsupportedEncodingException; /**
* 生成令牌
* @param dto
* @return
* @throws UnsupportedEncodingException
*/
Map<String, String> generateToken(CommonParamsDTO dto) throws UnsupportedEncodingException;
/**
* 校验签名
* @param dto
*/
Map<String, String> checkoutSign(CommonParamsDTO dto);
} }

View File

@@ -36,7 +36,7 @@ import com.jsowell.pile.vo.web.PileConnectorInfoVO;
import com.jsowell.pile.vo.web.PileModelInfoVO; import com.jsowell.pile.vo.web.PileModelInfoVO;
import com.jsowell.pile.vo.web.PileStationVO; import com.jsowell.pile.vo.web.PileStationVO;
import com.jsowell.thirdparty.lianlian.domain.*; 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.service.LianLianService;
import com.jsowell.thirdparty.lianlian.util.Cryptos; import com.jsowell.thirdparty.lianlian.util.Cryptos;
import com.jsowell.thirdparty.lianlian.util.Encodes; import com.jsowell.thirdparty.lianlian.util.Encodes;
@@ -1233,33 +1233,30 @@ public class LianLianServiceImpl implements LianLianService {
return result; return result;
} }
/**
* 生成令牌
* @param dto
* @return
* @throws UnsupportedEncodingException
*/
@Override @Override
public Map<String, String> generateToken(QueryTokenDTO dto) throws UnsupportedEncodingException { public Map<String, String> generateToken(CommonParamsDTO dto) throws UnsupportedEncodingException {
String operatorID = dto.getOperatorID(); String operatorID = dto.getOperatorID();
// 通过operatorID 查出 operatorSecret TODO 建表 设置密钥 // 通过operatorID 查出 operatorSecret
DockingPlatformConfig platformConfig = dockingPlatformConfigService.getInfoByOperatorId(operatorID); DockingPlatformConfig platformConfig = dockingPlatformConfigService.getInfoByOperatorId(operatorID);
if (platformConfig == null) { if (platformConfig == null) {
return null; return null;
} }
String operatorSecret = platformConfig.getOperatorSecret(); String operatorSecret = platformConfig.getOperatorSecret();
// 校验签名
Map<String, String> map = Maps.newLinkedHashMap(); Map<String, String> checkResultMap = checkoutSign(dto);
map.put("OperatorID", dto.getOperatorID()); if (checkResultMap == null) {
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; return null;
} }
System.out.println("签名校验通过!!!"); String dataString = checkResultMap.get("Data");
// 解密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"); String dataStr = new String(plainText, "UTF-8");
Map<String, String> resMap = (Map<String, String>) JSON.parse(dataStr); Map<String, String> resMap = (Map<String, String>) JSON.parse(dataStr);
String secret = resMap.get("OperatorSecret"); String secret = resMap.get("OperatorSecret");
@@ -1285,19 +1282,59 @@ public class LianLianServiceImpl implements LianLianService {
vo.setSuccStat("0"); vo.setSuccStat("0");
Map<String, String> resultMap = Maps.newLinkedHashMap(); Map<String, String> resultMap = Maps.newLinkedHashMap();
// 加密数据 TODO vo对象加密 // 加密数据
byte[] encryptText = Cryptos.aesEncrypt(JSONObject.toJSONString(vo).getBytes(), byte[] encryptText = Cryptos.aesEncrypt(JSONObject.toJSONString(vo).getBytes(),
platformConfig.getDataSecret().getBytes(), platformConfig.getDataSecretIv().getBytes()); platformConfig.getDataSecret().getBytes(), platformConfig.getDataSecretIv().getBytes());
String encryptData = Encodes.encodeBase64(encryptText); String encryptData = Encodes.encodeBase64(encryptText);
resultMap.put("Data", encryptData); resultMap.put("Data", encryptData);
// 生成sig TODO 生成sig // 生成sig
String resultSign = GBSignUtils.sign(resultMap, operatorSecret); String resultSign = GBSignUtils.sign(resultMap, operatorSecret);
resultMap.put("Sig", resultSign); resultMap.put("Sig", resultSign);
return resultMap; return resultMap;
} }
/**
* 校验签名并返回data(未解密)
* @param dto
*/
@Override
public Map<String, String> checkoutSign(CommonParamsDTO dto){
String operatorID = dto.getOperatorID();
// 通过operatorID 查出 operatorSecret
DockingPlatformConfig platformConfig = dockingPlatformConfigService.getInfoByOperatorId(operatorID);
if (platformConfig == null) {
return null;
}
String operatorSecret = platformConfig.getOperatorSecret();
Map<String, String> 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<String, String> resMap = (Map<String, String>) JSON.parse(dataStr);
// return resMap;
Map<String, String> resultMap = new LinkedHashMap<>();
resultMap.put("Data", dto.getData());
resultMap.put("OperatorSecret", operatorSecret);
return resultMap;
}
/** /**
* TODO 请求打印充电小票 * TODO 请求打印充电小票
*/ */