|
|
@@ -10,11 +10,12 @@ import com.kym.common.constant.ResponseEnum;
|
|
|
import com.kym.common.enums.EnPlusApi;
|
|
|
import com.kym.common.exception.BusinessException;
|
|
|
import com.kym.common.exception.EnPushException;
|
|
|
-import com.kym.common.utils.AESUtil;
|
|
|
import com.kym.common.utils.CommUtil;
|
|
|
+import com.kym.common.utils.PlatformAesUtil;
|
|
|
import com.kym.entity.common.RedisKeys;
|
|
|
import com.kym.entity.enplus.EnRespQueryToken;
|
|
|
import com.kym.entity.enplus.response.EnResponse;
|
|
|
+import com.kym.service.cache.PlatformCache;
|
|
|
import com.kym.service.enplus.EnPlusService;
|
|
|
import okhttp3.*;
|
|
|
import org.slf4j.Logger;
|
|
|
@@ -63,17 +64,19 @@ public class EnPlusServiceImpl implements EnPlusService {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+
|
|
|
/**
|
|
|
- * EN+ POST请求专属方法
|
|
|
+ * 互联互通POST请求专属方法
|
|
|
*
|
|
|
+ * @param platformName
|
|
|
* @param url
|
|
|
* @param params
|
|
|
* @return
|
|
|
*/
|
|
|
@Override
|
|
|
- public EnResponse enPlusPost(String url, String params) {
|
|
|
+ public EnResponse platformPost(String platformName, String url, String params) {
|
|
|
// token获取
|
|
|
- var token = queryToken();
|
|
|
+ var token = queryPlatformToken(platformName);
|
|
|
Headers headers = Headers.of("Authorization", "Bearer ".concat(token));
|
|
|
RequestBody requestBody = RequestBody.create(params, JSON);
|
|
|
Request request = new Request.Builder()
|
|
|
@@ -87,7 +90,7 @@ public class EnPlusServiceImpl implements EnPlusService {
|
|
|
return response;
|
|
|
} else {
|
|
|
LOGGER.error(":url:{}\n params:{}\ntoken:{}\n返回信息:{}", url, params, token, response);
|
|
|
- if(4002 == response.getRet() ){
|
|
|
+ if (4002 == response.getRet()) {
|
|
|
// 如果返回Ret=4002,token错误的情况下,删除redis中的token,如果是预约订单则将此订单设置为延迟启动
|
|
|
redisTemplate.delete(RedisKeys.EN_PLUS_TOKEN);
|
|
|
throw new BusinessException(ResponseEnum.EN_PLUS_TOKEN_EXCEPTION);
|
|
|
@@ -96,17 +99,19 @@ public class EnPlusServiceImpl implements EnPlusService {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+
|
|
|
/**
|
|
|
- * 获取en+ AccessToken
|
|
|
- * HMAC-MD5
|
|
|
- * 签名密钥对整个消息体加密,MD5摘要,参数签名要求大写
|
|
|
- * 签名消息体拼接顺序:OperatorID、Data、TimeStamp、Seq
|
|
|
+ * 查询平台互联互通token
|
|
|
+ *
|
|
|
+ * @param platformName
|
|
|
+ * @return
|
|
|
*/
|
|
|
@Override
|
|
|
- public String queryToken() {
|
|
|
- LOGGER.debug("查询token");
|
|
|
+ public String queryPlatformToken(String platformName) {
|
|
|
+ LOGGER.info("查询互联互通平台token:{}", platformName);
|
|
|
var token = redisTemplate.opsForValue().get(RedisKeys.EN_PLUS_TOKEN);
|
|
|
if (CommUtil.isNotEmptyAndNull(token)) {
|
|
|
+ // todo 不同平台不同key
|
|
|
LOGGER.debug("从缓存中查询到token:{},ttl:{}", token, redisTemplate.getExpire(RedisKeys.EN_PLUS_TOKEN));
|
|
|
return token;
|
|
|
}
|
|
|
@@ -117,20 +122,21 @@ public class EnPlusServiceImpl implements EnPlusService {
|
|
|
}
|
|
|
""".formatted(OperatorId, OperatorSecret);
|
|
|
|
|
|
- var requestParams = buildParams(data);
|
|
|
+ var requestParams = buildParams(platformName, data);
|
|
|
|
|
|
- var enResponse = enGetToken(EnPlusApi.EN_PLUS_QUERY_TOKEN.getApi(), requestParams);
|
|
|
+ var response = enGetToken(EnPlusApi.EN_PLUS_QUERY_TOKEN.getApi(), requestParams);
|
|
|
|
|
|
- if (enResponse != null && 0 == enResponse.getRet()) {
|
|
|
+ if (response != null && 0 == response.getRet()) {
|
|
|
// 解密Data获取token
|
|
|
- var enRespQueryToken = JSONObject.parseObject(AESUtil.decrypt(enResponse.getData()), EnRespQueryToken.class);
|
|
|
- LOGGER.debug("EN+接口AccessToken:{}", enRespQueryToken.toString());
|
|
|
+ var platformRespQueryToken = JSONObject.parseObject(new PlatformAesUtil(PlatformCache.INSTANCE.getPlatformByName(platformName)).decrypt(response.getData()), EnRespQueryToken.class);
|
|
|
+ LOGGER.debug("{}接口AccessToken:{}", platformName, platformRespQueryToken.toString());
|
|
|
// 缓存token,有效期7天(我们这里每次请求en+获取token的有效期并不是从7天开始,有效期是在en+的剩余有效时间)
|
|
|
- redisTemplate.opsForValue().set(RedisKeys.EN_PLUS_TOKEN, enRespQueryToken.getAccessToken(), enRespQueryToken.getTokenAvailableTime(), TimeUnit.SECONDS);
|
|
|
- return enRespQueryToken.getAccessToken();
|
|
|
+ // todo 不同平台不同key
|
|
|
+ redisTemplate.opsForValue().set(RedisKeys.EN_PLUS_TOKEN, platformRespQueryToken.getAccessToken(), platformRespQueryToken.getTokenAvailableTime(), TimeUnit.SECONDS);
|
|
|
+ return platformRespQueryToken.getAccessToken();
|
|
|
} else {
|
|
|
// 记录错误码,返回错误信息
|
|
|
- LOGGER.error("EN+接口错误:接口名{}:返回信息:{}", "query_token", enResponse);
|
|
|
+ LOGGER.error("{}接口错误:接口名{}:返回信息:{}", platformName, "query_token", response);
|
|
|
throw new BusinessException(ResponseEnum.EN_PLUS_QUERY_TOKEN_ERROR);
|
|
|
}
|
|
|
}
|
|
|
@@ -154,15 +160,16 @@ public class EnPlusServiceImpl implements EnPlusService {
|
|
|
|
|
|
|
|
|
/**
|
|
|
- * 加密数据、签名、组装请求消息体
|
|
|
+ * 根据平台分别加密数据、签名、组装请求消息体
|
|
|
*
|
|
|
+ * @param platformName
|
|
|
* @param params
|
|
|
* @return
|
|
|
*/
|
|
|
@Override
|
|
|
- public String buildParams(String params) {
|
|
|
+ public String buildParams(String platformName, String params) {
|
|
|
// 使用DataSecret对data加密
|
|
|
- var dataStr = AESUtil.encrypt(params);
|
|
|
+ var dataStr = new PlatformAesUtil(PlatformCache.INSTANCE.getPlatformByName(platformName)).encrypt(params);
|
|
|
// 时间戳
|
|
|
var timeStamp = LocalDateTimeUtil.format(LocalDateTime.now(), DatePattern.PURE_DATETIME_PATTERN);
|
|
|
// 自增序列
|
|
|
@@ -186,11 +193,12 @@ public class EnPlusServiceImpl implements EnPlusService {
|
|
|
/**
|
|
|
* 验签、解密推送消息
|
|
|
*
|
|
|
+ * @param platformName
|
|
|
* @param json
|
|
|
* @return
|
|
|
*/
|
|
|
@Override
|
|
|
- public String signValidation(JSONObject json) {
|
|
|
+ public String signValidation(String platformName, JSONObject json) {
|
|
|
// 验签 解密数据
|
|
|
var OperatorID = json.getString("OperatorID");
|
|
|
var Data = json.getString("Data");
|
|
|
@@ -203,7 +211,7 @@ public class EnPlusServiceImpl implements EnPlusService {
|
|
|
var sign = mac.digestHex(signString).toUpperCase();
|
|
|
if (sign.equals(Sig)) {
|
|
|
// 解密数据
|
|
|
- return AESUtil.decrypt(Data);
|
|
|
+ return new PlatformAesUtil(PlatformCache.INSTANCE.getPlatformByName(platformName)).decrypt(Data);
|
|
|
} else {
|
|
|
// 验签失败
|
|
|
EnResponse enResponse = new EnResponse();
|
|
|
@@ -219,47 +227,50 @@ public class EnPlusServiceImpl implements EnPlusService {
|
|
|
/**
|
|
|
* 请求设备认证
|
|
|
*
|
|
|
+ * @param platformName 互联互通平台名称
|
|
|
* @param connectorId 充电设备接口编码
|
|
|
* @param equipAuthSeq 格式:运营商ID+唯一编码 27字符
|
|
|
* @return
|
|
|
*/
|
|
|
@Override
|
|
|
- public JSONObject queryEquipAuth(String connectorId, String equipAuthSeq) {
|
|
|
+ public JSONObject queryEquipAuth(String platformName, String connectorId, String equipAuthSeq) {
|
|
|
var param = """
|
|
|
{
|
|
|
"EquipAuthSeq":"%s",
|
|
|
"ConnectorID":"%s"
|
|
|
}
|
|
|
""".formatted(equipAuthSeq, connectorId);
|
|
|
- var response = enPlusPost(EnPlusApi.EN_PLUS_QUERY_EQUIP_AUTH.getApi(), buildParams(param));
|
|
|
+ var response = platformPost(platformName,EnPlusApi.EN_PLUS_QUERY_EQUIP_AUTH.getApi(), buildParams(platformName,param));
|
|
|
|
|
|
- return JSONObject.parseObject(AESUtil.decrypt(response.getData()));
|
|
|
+ return JSONObject.parseObject(new PlatformAesUtil(PlatformCache.INSTANCE.getPlatformByName(platformName)).decrypt(response.getData()));
|
|
|
}
|
|
|
|
|
|
|
|
|
/**
|
|
|
* 查询业务策略信息
|
|
|
*
|
|
|
- * @param equipBizSeq 业务策略查询流水号 格式:运营商ID+唯一编码 27字符
|
|
|
- * @param connectorId 充电设备接口编码
|
|
|
+ * @param platformName 互联互通平台名称
|
|
|
+ * @param equipBizSeq 业务策略查询流水号 格式:运营商ID+唯一编码 27字符
|
|
|
+ * @param connectorId 充电设备接口编码
|
|
|
* @return
|
|
|
*/
|
|
|
@Override
|
|
|
@DynamicCache(spel = "#connectorId")
|
|
|
- public JSONObject queryEquipBusinessPolicy(String equipBizSeq, String connectorId) {
|
|
|
+ public JSONObject queryEquipBusinessPolicy(String platformName, String equipBizSeq, String connectorId) {
|
|
|
var param = """
|
|
|
{
|
|
|
"EquipBizSeq":"%s",
|
|
|
"ConnectorID":"%s"
|
|
|
}
|
|
|
""".formatted(equipBizSeq, connectorId);
|
|
|
- var response = enPlusPost(EnPlusApi.EN_PLUS_QUERY_EQUIP_BUSINESS_POLICY.getApi(), buildParams(param));
|
|
|
- return JSONObject.parseObject(AESUtil.decrypt(response.getData()));
|
|
|
+ var response = platformPost(platformName,EnPlusApi.EN_PLUS_QUERY_EQUIP_BUSINESS_POLICY.getApi(), buildParams(platformName,param));
|
|
|
+ return JSONObject.parseObject(new PlatformAesUtil(PlatformCache.INSTANCE.getPlatformByName(platformName)).decrypt(response.getData()));
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 请求EN+启动充电
|
|
|
*
|
|
|
+ * @param platformName
|
|
|
* @param startChargeSeq
|
|
|
* @param connectorId
|
|
|
* @param qrCode
|
|
|
@@ -267,7 +278,7 @@ public class EnPlusServiceImpl implements EnPlusService {
|
|
|
* @return
|
|
|
*/
|
|
|
@Override
|
|
|
- public JSONObject queryStartCharge(String startChargeSeq, String connectorId, String qrCode, Integer amount) {
|
|
|
+ public JSONObject queryStartCharge(String platformName, String startChargeSeq, String connectorId, String qrCode, Integer amount) {
|
|
|
var param = """
|
|
|
{
|
|
|
"StartChargeSeq":"%s",
|
|
|
@@ -276,63 +287,66 @@ public class EnPlusServiceImpl implements EnPlusService {
|
|
|
"amount":"%d"
|
|
|
}
|
|
|
""".formatted(startChargeSeq, connectorId, qrCode, amount);
|
|
|
- var response = enPlusPost(EnPlusApi.EN_PLUS_QUERY_START_CHARGE.getApi(), buildParams(param));
|
|
|
- return JSONObject.parseObject(AESUtil.decrypt(response.getData()));
|
|
|
+ var response = platformPost(platformName,EnPlusApi.EN_PLUS_QUERY_START_CHARGE.getApi(), buildParams(platformName,param));
|
|
|
+ return JSONObject.parseObject(new PlatformAesUtil(PlatformCache.INSTANCE.getPlatformByName(platformName)).decrypt(response.getData()));
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 查询充电状态
|
|
|
*
|
|
|
+ * @param platformName
|
|
|
* @param startChargeSeq
|
|
|
* @return
|
|
|
*/
|
|
|
@Override
|
|
|
- public JSONObject queryEquipChargeStatus(String startChargeSeq) {
|
|
|
+ public JSONObject queryEquipChargeStatus(String platformName, String startChargeSeq) {
|
|
|
var param = """
|
|
|
{
|
|
|
"StartChargeSeq":"%s"
|
|
|
}
|
|
|
""".formatted(startChargeSeq);
|
|
|
- var response = enPlusPost(EnPlusApi.EN_PLUS_QUERY_EQUIP_CHARGE_STATUS.getApi(), buildParams(param));
|
|
|
- return JSONObject.parseObject(AESUtil.decrypt(response.getData()));
|
|
|
+ var response = platformPost(platformName,EnPlusApi.EN_PLUS_QUERY_EQUIP_CHARGE_STATUS.getApi(), buildParams(platformName,param));
|
|
|
+ return JSONObject.parseObject(new PlatformAesUtil(PlatformCache.INSTANCE.getPlatformByName(platformName)).decrypt(response.getData()));
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 与en+开发约定使用该接口更新正在充电中的订单的金额信息,解决充电过程中用户充值续充场景
|
|
|
*
|
|
|
+ * @param platformName
|
|
|
* @param startChargeSeq
|
|
|
- * @param amount
|
|
|
+ * @param amount 【EN+互联互通扩展参数】
|
|
|
* @return
|
|
|
*/
|
|
|
@Override
|
|
|
- public JSONObject updateBalanceByQueryEquipChargeStatus(String startChargeSeq, int amount) {
|
|
|
+ public JSONObject updateBalanceByQueryEquipChargeStatus(String platformName, String startChargeSeq, int amount) {
|
|
|
var param = """
|
|
|
{
|
|
|
"StartChargeSeq":"%s",
|
|
|
"amount":%d
|
|
|
}
|
|
|
""".formatted(startChargeSeq, amount);
|
|
|
- var response = enPlusPost(EnPlusApi.EN_PLUS_QUERY_EQUIP_CHARGE_STATUS.getApi(), buildParams(param));
|
|
|
- return JSONObject.parseObject(AESUtil.decrypt(response.getData()));
|
|
|
+ var response = platformPost(platformName,EnPlusApi.EN_PLUS_QUERY_EQUIP_CHARGE_STATUS.getApi(), buildParams(platformName,param));
|
|
|
+ return JSONObject.parseObject(new PlatformAesUtil(PlatformCache.INSTANCE.getPlatformByName(platformName)).decrypt(response.getData()));
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 请求停止充电
|
|
|
*
|
|
|
+ * @param platformName
|
|
|
* @param startChargeSeq
|
|
|
* @param connectorId
|
|
|
* @return
|
|
|
*/
|
|
|
@Override
|
|
|
- public JSONObject queryStopCharge(String startChargeSeq, String connectorId) {
|
|
|
+ public JSONObject queryStopCharge(String platformName, String startChargeSeq, String connectorId) {
|
|
|
var param = """
|
|
|
{
|
|
|
"StartChargeSeq":"%s",
|
|
|
"ConnectorID":"%s"
|
|
|
}
|
|
|
""".formatted(startChargeSeq, connectorId);
|
|
|
- var response = enPlusPost(EnPlusApi.EN_PLUS_QUERY_STOP_CHARGE.getApi(), buildParams(param));
|
|
|
- return JSONObject.parseObject(AESUtil.decrypt(response.getData()));
|
|
|
+ var response = platformPost(platformName,EnPlusApi.EN_PLUS_QUERY_STOP_CHARGE.getApi(), buildParams(platformName,param));
|
|
|
+ return JSONObject.parseObject(new PlatformAesUtil(PlatformCache.INSTANCE.getPlatformByName(platformName)).decrypt(response.getData()));
|
|
|
}
|
|
|
|
|
|
}
|