|
|
@@ -284,13 +284,13 @@ public class ThirdPartyTokenServiceImpl implements ThirdPartyTokenService {
|
|
|
String phone = userInfoRequest.getPhone();
|
|
|
|
|
|
// 6. 根据手机号查询用户信息
|
|
|
- UserInfo userInfo = userInfoService.getUserInfoByPhone(phone);
|
|
|
+ UserInfo userInfo = userInfoService.getUserInfoByPhoneAndOperatorId(phone, thirdPartyInfo.getId());
|
|
|
|
|
|
Integer isNewUser = 0;
|
|
|
if (userInfo == null) {
|
|
|
// 用户不存在,注册新用户
|
|
|
log.info("用户不存在,注册新用户, phone: {}", phone);
|
|
|
- userInfo = userInfoService.registerOrUpdateUserByPhone(phone, null);
|
|
|
+ userInfo = userInfoService.registerThirdPartyUserByPhone(phone, thirdPartyInfo.getId());
|
|
|
if (userInfo == null) {
|
|
|
log.error("注册用户失败, phone: {}", phone);
|
|
|
return buildErrorResponse(500, "注册用户失败", thirdPartyInfo);
|
|
|
@@ -960,7 +960,7 @@ public class ThirdPartyTokenServiceImpl implements ThirdPartyTokenService {
|
|
|
log.info("解密后的请求数据: {}", decryptedData);
|
|
|
|
|
|
ChargeDeviceDetailRequestData detailRequest = objectMapper.readValue(decryptedData, ChargeDeviceDetailRequestData.class);
|
|
|
- if (detailRequest == null || detailRequest.getConnectorId() == null ) {
|
|
|
+ if (detailRequest == null || detailRequest.getConnectorCode() == null ) {
|
|
|
return buildErrorResponse(4003, "请求的业务参数不合法", thirdPartyInfo);
|
|
|
}
|
|
|
|
|
|
@@ -969,13 +969,19 @@ public class ThirdPartyTokenServiceImpl implements ThirdPartyTokenService {
|
|
|
String currentTime = LocalTime.now().format(TIME_FORMATTER);
|
|
|
|
|
|
AppletConnectorDetailVO result = thirdPartyConnectorInfoMapper.selectConnectorDetailById(
|
|
|
- detailRequest.getConnectorId(), null, currentTime, null, null
|
|
|
+ detailRequest.getConnectorCode(), null, currentTime, null, null
|
|
|
);
|
|
|
|
|
|
+ // 7. 判空校验
|
|
|
+ if (result == null) {
|
|
|
+ log.warn("充电终端不存在, connectorCode: {}", detailRequest.getConnectorCode());
|
|
|
+ return buildErrorResponse(4004, "充电终端不存在", thirdPartyInfo);
|
|
|
+ }
|
|
|
+
|
|
|
// 8. 转换为响应数据
|
|
|
ChargeDeviceDetailResponseData responseData = convertToDeviceDetail(result);
|
|
|
|
|
|
- log.info("查询充电终端详情成功, operatorId: {}, equipmentId: {}", request.getOperatorId(), result.getConnectorId());
|
|
|
+ log.info("查询充电终端详情成功, operatorId: {}, connectorCode: {}", request.getOperatorId(), result.getConnectorCode());
|
|
|
return buildSuccessResponse(responseData, thirdPartyInfo);
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
@@ -1557,6 +1563,105 @@ public class ThirdPartyTokenServiceImpl implements ThirdPartyTokenService {
|
|
|
return buildErrorResponse(500, "系统错误: " + e.getMessage(), null);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ThirdPartyResponse clearAccountBalance(ThirdPartyRequest request, String authorization) {
|
|
|
+ try {
|
|
|
+ // 1. 参数校验
|
|
|
+ if (!validateRequestParams(request)) {
|
|
|
+ return buildErrorResponse(4003, "参数不合法,缺少必需的参数", null);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 2. 通过operatorId查询第三方配置信息
|
|
|
+ ThirdPartyInfo thirdPartyInfo = getThirdPartyInfoByOperatorId(request.getOperatorId());
|
|
|
+ if (thirdPartyInfo == null) {
|
|
|
+ log.warn("运营商不存在, operatorId: {}", request.getOperatorId());
|
|
|
+ return buildErrorResponse(4004, "运营商不存在", null);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 3. 验证签名
|
|
|
+ String signContent = request.getOperatorId() + request.getData() + request.getTimeStamp() + request.getSeq();
|
|
|
+ if (!HmacMD5Util.verify(signContent, thirdPartyInfo.getSigSecret(), request.getSig())) {
|
|
|
+ log.warn("签名验证失败, operatorId: {}", request.getOperatorId());
|
|
|
+ return buildErrorResponse(4001, "签名错误", thirdPartyInfo);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 4. 从Header中解析并验证Token
|
|
|
+ String accessToken = parseAccessToken(authorization);
|
|
|
+ if (StrUtil.isBlank(accessToken)) {
|
|
|
+ log.warn("Token为空或格式错误, operatorId: {}", request.getOperatorId());
|
|
|
+ return buildErrorResponse(4002, "token错误", thirdPartyInfo);
|
|
|
+ }
|
|
|
+ if (!validateAccessToken(accessToken, request.getOperatorId())) {
|
|
|
+ log.warn("Token验证失败, operatorId: {}", request.getOperatorId());
|
|
|
+ return buildErrorResponse(4002, "token错误", thirdPartyInfo);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 5. 解密并解析业务参数
|
|
|
+ String decryptedData = AESCryptoUtils.decrypt(
|
|
|
+ request.getData(),
|
|
|
+ thirdPartyInfo.getDataSecret(),
|
|
|
+ thirdPartyInfo.getDataSecretIV()
|
|
|
+ );
|
|
|
+ log.info("清除账户余额-解密后的请求数据: {}", decryptedData);
|
|
|
+
|
|
|
+ ClearBalanceRequestData clearRequest = objectMapper.readValue(decryptedData, ClearBalanceRequestData.class);
|
|
|
+ if (clearRequest == null || clearRequest.getUserId() == null) {
|
|
|
+ return buildErrorResponse(4003, "请求的业务参数不合法,userId不能为空", thirdPartyInfo);
|
|
|
+ }
|
|
|
+
|
|
|
+ Long userId = clearRequest.getUserId();
|
|
|
+
|
|
|
+ // 6. 校验用户是否存在
|
|
|
+ UserInfo userInfo = userInfoService.getOne(Wrappers.lambdaQuery(UserInfo.class).eq(UserInfo::getId, userId).eq(UserInfo::getThirdPartId
|
|
|
+ , thirdPartyInfo.getId()));
|
|
|
+ if (userInfo == null) {
|
|
|
+ log.warn("用户不存在, userId: {}", userId);
|
|
|
+ ClearBalanceResponseData failData = ClearBalanceResponseData.fail("用户不存在");
|
|
|
+ return buildSuccessResponse(failData, thirdPartyInfo);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 7. 查询用户账户
|
|
|
+ UserAccount userAccount = userAccountService.getOne(
|
|
|
+ Wrappers.lambdaQuery(UserAccount.class)
|
|
|
+ .eq(UserAccount::getUserId, userId)
|
|
|
+ .eq(UserAccount::getIsDeleted, 0)
|
|
|
+ .last("LIMIT 1")
|
|
|
+ );
|
|
|
+
|
|
|
+ if (userAccount == null) {
|
|
|
+ log.warn("用户账户不存在, userId: {}", userId);
|
|
|
+ ClearBalanceResponseData failData = ClearBalanceResponseData.fail("用户账户不存在");
|
|
|
+ return buildSuccessResponse(failData, thirdPartyInfo);
|
|
|
+ }
|
|
|
+
|
|
|
+ BigDecimal balanceBefore = userAccount.getBalance() != null ? userAccount.getBalance() : BigDecimal.ZERO;
|
|
|
+
|
|
|
+ // 8. 余额为0无需清除
|
|
|
+ if (balanceBefore.compareTo(BigDecimal.ZERO) == 0) {
|
|
|
+ log.info("用户余额已为0, userId: {}", userId);
|
|
|
+ ClearBalanceResponseData responseData = ClearBalanceResponseData.success(userId, BigDecimal.ZERO, BigDecimal.ZERO);
|
|
|
+ return buildSuccessResponse(responseData, thirdPartyInfo);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 9. 清除余额并记录动账日志
|
|
|
+ userAccountService.updateAccountBalanceAndLog(
|
|
|
+ userId,
|
|
|
+ balanceBefore.negate(),
|
|
|
+ SystemConstants.CHANGE_TYPE_REDUCE,
|
|
|
+ SystemConstants.ACCOUNT_LOG_THIRD_PARTY_CLEAR_NOTE + "-" + request.getOperatorId(),
|
|
|
+ null
|
|
|
+ );
|
|
|
+
|
|
|
+ log.info("清除账户余额成功, operatorId: {}, userId: {}, balanceBefore: {}", request.getOperatorId(), userId, balanceBefore);
|
|
|
+ ClearBalanceResponseData responseData = ClearBalanceResponseData.success(userId, balanceBefore, BigDecimal.ZERO);
|
|
|
+ return buildSuccessResponse(responseData, thirdPartyInfo);
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("处理clear_account_balance请求异常", e);
|
|
|
+ return buildErrorResponse(500, "系统错误: " + e.getMessage(), null);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
|