|
@@ -14,6 +14,7 @@ import com.microsvc.toolkit.middleware.payment.common.api.PaymentServiceContext;
|
|
|
import com.microsvc.toolkit.middleware.payment.common.api.entity.*;
|
|
|
import com.microsvc.toolkit.middleware.payment.common.api.enums.DivideBackStatus;
|
|
|
import com.microsvc.toolkit.middleware.payment.common.api.enums.PaymentStatus;
|
|
|
+import com.microsvc.toolkit.middleware.payment.enums.EPaymentVendor;
|
|
|
import com.yonge.cooleshow.biz.dal.entity.*;
|
|
|
import com.yonge.cooleshow.biz.dal.enums.*;
|
|
|
import com.yonge.cooleshow.biz.dal.enums.coupon.CouponCategoryEnum;
|
|
@@ -233,31 +234,8 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
|
|
|
throw new BizException("无效的支付订单");
|
|
|
}
|
|
|
|
|
|
- // 订单已关闭返回异常信息,更新订单状态为已支付,后续流程不处理,允许用户进行退款操作
|
|
|
- if (EPaymentStatus.CLOSED == paymentOrder.getStatus() && StringUtils.isNotBlank(paymentOrder.getErrorMsg())) {
|
|
|
-
|
|
|
- // 支付成功
|
|
|
- if (PaymentStatus.SUCCESSED == paymentResp.getPaymentStatus()) {
|
|
|
-
|
|
|
-
|
|
|
- // 根据支付回调消息,更新订单状态
|
|
|
- executePaymentSuccess(UserPaymentOrderWrapper.UserPaymentOrder.from(JSON.toJSONString(paymentOrder)), paymentResp);
|
|
|
-
|
|
|
-// UserPaymentOrderWrapper.UserPaymentOrder order = UserPaymentOrderWrapper.UserPaymentOrder
|
|
|
-// .builder()
|
|
|
-// .transNo(paymentResp.getTransNo())
|
|
|
-// .id(paymentOrder.getId())
|
|
|
-// .status(PAID)
|
|
|
-// .updateTime(DateTime.now().toDate())
|
|
|
-// .build();
|
|
|
-// userPaymentOrderService.updateById(order);
|
|
|
-
|
|
|
- log.error("executePaymentCallback 关单异常,更新订单状态为已支付, error={}, status={}, paymentResp={}", paymentOrder.getErrorMsg(),
|
|
|
- paymentOrder.getStatus(), JSON.toJSONString(paymentResp));
|
|
|
- }
|
|
|
- } else
|
|
|
// 订单状态为待支付、支付中时,更新订单状态;
|
|
|
- if (EPaymentStatus.WAIT_PAY == paymentOrder.getStatus() || EPaymentStatus.PAYING == paymentOrder.getStatus()) {
|
|
|
+ if (EPaymentStatus.WAIT_PAY == paymentOrder.getStatus() || EPaymentStatus.PAYING == paymentOrder.getStatus() || PAID == paymentOrder.getStatus()) {
|
|
|
|
|
|
// 支付成功
|
|
|
if (PaymentStatus.SUCCESSED == paymentResp.getPaymentStatus()) {
|
|
@@ -266,14 +244,14 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
|
|
|
}
|
|
|
|
|
|
// 支付失败
|
|
|
- if (PaymentStatus.FAILED == paymentResp.getPaymentStatus()) {
|
|
|
+ if (PaymentStatus.FAILED == paymentResp.getPaymentStatus() || PaymentStatus.CLOSED == paymentResp.getPaymentStatus()) {
|
|
|
|
|
|
// 支付失败,取消订单且更新订单状态
|
|
|
UserPaymentOrderWrapper.UserPaymentOrder order = UserPaymentOrderWrapper.UserPaymentOrder
|
|
|
.builder()
|
|
|
.transNo(paymentResp.getTransNo())
|
|
|
.id(paymentOrder.getId())
|
|
|
- .status(EPaymentStatus.FAIL)
|
|
|
+ .status(PaymentStatus.FAILED == paymentResp.getPaymentStatus() ? EPaymentStatus.FAIL: EPaymentStatus.CLOSED)
|
|
|
.updateTime(DateTime.now().toDate())
|
|
|
.build();
|
|
|
userPaymentOrderService.updateById(order);
|
|
@@ -284,6 +262,13 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
|
|
|
|
|
|
log.info("executePaymentCallback WAIT_PAY, status={}, paymentResp={}", paymentOrder.getStatus(),
|
|
|
JSON.toJSONString(paymentResp));
|
|
|
+ } else {
|
|
|
+
|
|
|
+ // 支付成功
|
|
|
+ if (PaymentStatus.SUCCESSED == paymentResp.getPaymentStatus()) {
|
|
|
+ // 根据支付回调消息,更新订单状态
|
|
|
+ refundOnly("订单已超时,金额原路退回", paymentOrder.getOrderNo());
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
}, 60L, TimeUnit.SECONDS);
|
|
@@ -413,7 +398,15 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
|
|
|
|
|
|
// 提示订单支付已完成
|
|
|
throw new BizException("订单支付已完成");
|
|
|
- }
|
|
|
+ } else
|
|
|
+
|
|
|
+ // 三方订单关闭
|
|
|
+ if ((PaymentStatus.CLOSED == paymentResp.getPaymentStatus() || PaymentStatus.FAILED == paymentResp.getPaymentStatus())
|
|
|
+ && EPaymentStatus.CLOSED != paymentOrder.getStatus()) {
|
|
|
+
|
|
|
+ // 更新订单状态为已关闭
|
|
|
+ closeWaitOrder(paymentOrder);
|
|
|
+ } else
|
|
|
|
|
|
// 订单未支付,后续直接更新订单状态为已关闭
|
|
|
if (PaymentStatus.PENDDING == paymentResp.getPaymentStatus()) {
|
|
@@ -446,8 +439,6 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
|
|
|
// 更新订单退款异常信息
|
|
|
userPaymentOrderService.updateById(order);
|
|
|
|
|
|
- // 订单关闭后的数据处理流程
|
|
|
- userOrderService.payCancel(userOrderService.detail(order.getId()));
|
|
|
});
|
|
|
throw new BizException("查询交易中,请耐心等待!");
|
|
|
}
|
|
@@ -711,15 +702,15 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
|
|
|
if (EPaymentStatus.WAIT_PAY == userPaymentOrder.getStatus() || EPaymentStatus.PAYING == userPaymentOrder.getStatus()) {
|
|
|
|
|
|
// 订单完成后续流程
|
|
|
- SpringContextHolder.getBean(UserPaymentCoreService.class)
|
|
|
+ applicationContext.getBean(UserPaymentCoreService.class)
|
|
|
.executePaymentSuccess(UserPaymentOrderWrapper.UserPaymentOrder.from(JSON.toJSONString(userPaymentOrder)), paymentResp);
|
|
|
}
|
|
|
|
|
|
// 删除支付配置
|
|
|
- redisCacheService.deleteUserPaymentConfig(userId, userPaymentOrder.getOrderType().getCode());
|
|
|
+ redisCacheService.deleteUserPaymentConfig(userId, userPaymentOrder.getOrderNo());
|
|
|
|
|
|
// 删除下单配置
|
|
|
- redisCacheService.deleteUserOrderConfig(userId, userPaymentOrder.getOrderType().getCode());
|
|
|
+ redisCacheService.deleteUserOrderConfig(userId, userPaymentOrder.getOrderNo());
|
|
|
}
|
|
|
|
|
|
// 三方支付失败
|
|
@@ -734,11 +725,26 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
|
|
|
userPaymentOrderService.updateById(update);
|
|
|
|
|
|
// 订单关闭流程
|
|
|
- SpringContextHolder.getBean(UserPaymentCoreService.class)
|
|
|
+ applicationContext.getBean(UserPaymentCoreService.class)
|
|
|
.cancelPayment(UserPaymentOrderWrapper.UserPaymentOrder.from(JSON.toJSONString(userPaymentOrder)), paymentResp);
|
|
|
|
|
|
// 删除本地缓存
|
|
|
- redisCacheService.deleteUserPaymentConfig(userId, userPaymentOrder.getOrderType().getCode());
|
|
|
+ redisCacheService.deleteUserPaymentConfig(userId, userPaymentOrder.getOrderNo());
|
|
|
+ }
|
|
|
+
|
|
|
+ // 三方订单关闭状态
|
|
|
+ if (PaymentStatus.CLOSED == paymentResp.getPaymentStatus() && EPaymentStatus.CLOSED != userPaymentOrder.getStatus()) {
|
|
|
+
|
|
|
+ // 订单关闭流程
|
|
|
+ applicationContext.getBean(UserPaymentCoreService.class)
|
|
|
+ .cancelPayment(UserPaymentOrderWrapper.UserPaymentOrder.from(JSON.toJSONString(userPaymentOrder)), paymentResp);
|
|
|
+
|
|
|
+ // 删除本地缓存
|
|
|
+ redisCacheService.deleteUserPaymentConfig(userId, userPaymentOrder.getOrderNo());
|
|
|
+
|
|
|
+ // 删除下单配置
|
|
|
+ redisCacheService.deleteUserOrderConfig(userId, userPaymentOrder.getOrderNo());
|
|
|
+
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -923,17 +929,7 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
|
|
|
if (StringUtils.isEmpty(paymentOrder.getTransNo())
|
|
|
&& (EPaymentStatus.WAIT_PAY == paymentOrder.getStatus()||EPaymentStatus.PAYING == paymentOrder.getStatus())) {
|
|
|
|
|
|
- // 直接关闭订单
|
|
|
- UserPaymentOrderWrapper.UserPaymentOrder order = UserPaymentOrderWrapper.UserPaymentOrder
|
|
|
- .builder()
|
|
|
- .id(paymentOrder.getId())
|
|
|
- .status(EPaymentStatus.CLOSED)
|
|
|
- .updateTime(DateTime.now().toDate())
|
|
|
- .build();
|
|
|
- userPaymentOrderService.updateById(order);
|
|
|
-
|
|
|
- // 订单关闭后的数据处理流程
|
|
|
- userOrderService.payCancel(userOrderService.detail(order.getId()));
|
|
|
+ closeWaitOrder(paymentOrder);
|
|
|
|
|
|
} else {
|
|
|
// 获取三方支付订单信息,根据订单状处理
|
|
@@ -953,6 +949,20 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ private void closeWaitOrder(UserPaymentOrderWrapper.UserPaymentOrder paymentOrder) {
|
|
|
+ // 直接关闭订单
|
|
|
+ UserPaymentOrderWrapper.UserPaymentOrder order = UserPaymentOrderWrapper.UserPaymentOrder
|
|
|
+ .builder()
|
|
|
+ .id(paymentOrder.getId())
|
|
|
+ .status(EPaymentStatus.CLOSED)
|
|
|
+ .updateTime(DateTime.now().toDate())
|
|
|
+ .build();
|
|
|
+ userPaymentOrderService.updateById(order);
|
|
|
+
|
|
|
+ // 订单关闭后的数据处理流程
|
|
|
+ userOrderService.payCancel(userOrderService.detail(order.getId()));
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
/**
|
|
|
* 扫描支付超时定时
|
|
@@ -978,7 +988,7 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
|
|
|
UserPaymentOrderWrapper.UserPaymentOrderQuery payingQuery = UserPaymentOrderWrapper.UserPaymentOrderQuery
|
|
|
.builder()
|
|
|
.paymentStatus(Lists.newArrayList(OrderStatusEnum.parse(EPaymentStatus.PAYING)))
|
|
|
- .endTime(DateTime.now().plusMinutes(120).toDate())
|
|
|
+// .endTime(DateTime.now().plusMinutes(120).toDate())
|
|
|
.build();
|
|
|
// 查询支付中订单数
|
|
|
userPaymentOrderService.selectPage(page, payingQuery);
|
|
@@ -1222,7 +1232,7 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
|
|
|
// 支付成功
|
|
|
if (PaymentStatus.SUCCESSED == paymentResp.getPaymentStatus()) {
|
|
|
// 根据支付回调消息,更新订单状态
|
|
|
- SpringContextHolder.getBean(UserPaymentCoreService.class)
|
|
|
+ applicationContext.getBean(UserPaymentCoreService.class)
|
|
|
.executePaymentSuccess(UserPaymentOrderWrapper.UserPaymentOrder.from(JSON.toJSONString(item)), paymentResp);
|
|
|
}
|
|
|
|
|
@@ -1316,9 +1326,6 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
|
|
|
if (Objects.isNull(paymentOrder)) {
|
|
|
throw new BizException("订单信息不存在");
|
|
|
}
|
|
|
- if (!OrderStatusEnum.PAID.getCode().equals(paymentOrder.getStatus().getCode())) {
|
|
|
- throw new BizException("订单状态异常");
|
|
|
- }
|
|
|
UserOrderVo detail = userOrderService.detail(paymentOrder.getId());
|
|
|
if (Objects.isNull(detail)) {
|
|
|
throw new BizException("订单信息不存在");
|
|
@@ -1425,4 +1432,95 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
|
|
|
return refundFlag;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 关闭订单
|
|
|
+ *
|
|
|
+ * @param userInfo JwtUserInfo
|
|
|
+ * @param paymentOrder UserPaymentOrder
|
|
|
+ * @return PaymentResp
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public PaymentResp closedPayment( UserPaymentOrderWrapper.UserPaymentOrder paymentOrder) {
|
|
|
+
|
|
|
+ // 开启调试模式允许关闭订单
|
|
|
+ if (Optional.ofNullable(paymentServiceContext.getProperties().getDebug()).orElse(false)) {
|
|
|
+ // 关闭支付订单
|
|
|
+ PaymentClose paymentClose = paymentServiceContext.getPaymentService(paymentOrder.getPaymentVendor())
|
|
|
+ .close(paymentOrder.getTransNo(), "订单超时", paymentOrder.getOrderNo());
|
|
|
+ log.info("closedPayment VENDOR: {}, CHANNEL: {} paymentClose={}", paymentOrder.getPaymentVendor(),
|
|
|
+ paymentOrder.getPaymentChannel(), JSON.toJSONString(paymentClose));
|
|
|
+ }
|
|
|
+
|
|
|
+ // 查询订单信息
|
|
|
+ PaymentResp paymentResp = paymentServiceContext.getPaymentService(paymentOrder.getPaymentVendor())
|
|
|
+ .query(paymentOrder.getTransNo(), paymentOrder.getOrderNo());
|
|
|
+ log.info("closedPayment VENDOR: {}, CHANNEL: {} paymentResp={}", paymentOrder.getPaymentVendor(),
|
|
|
+ paymentOrder.getPaymentChannel(), JSON.toJSONString(paymentResp));
|
|
|
+
|
|
|
+ return paymentResp;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ @Transactional
|
|
|
+ @Override
|
|
|
+ public void paymentStatus(String orderNo) {
|
|
|
+
|
|
|
+ // 订单编号查询
|
|
|
+ UserPaymentOrderWrapper.UserPaymentOrder paymentOrder = userPaymentOrderService.getUserPaymentOrderByOrderNo( orderNo);
|
|
|
+ if (Objects.isNull(paymentOrder)) {
|
|
|
+ throw new BizException("订单不存在");
|
|
|
+ }
|
|
|
+
|
|
|
+ UserPaymentOrderWrapper.PaymentOrderReqConfig reqConfig = UserPaymentOrderWrapper.PaymentOrderReqConfig
|
|
|
+ .builder()
|
|
|
+ .userId(String.valueOf(paymentOrder.getUserId()))
|
|
|
+ .merOrderNo(orderNo)
|
|
|
+ .build();
|
|
|
+
|
|
|
+ // 用户下单请求锁
|
|
|
+ String lockName = redisCacheService.getPaymentCacheKey(orderNo);
|
|
|
+ DistributedLock.of(redissonClient).runIfLockCanGet(lockName, () -> {
|
|
|
+
|
|
|
+ // 已产生三方交易流水号,先判断三方订单支付状态若在支付中,则重复返回相同支付配置参数;避免用户重复支付
|
|
|
+ // 原生支付(微信,支付宝)流水号后产品,需要查询三方支付订单状态
|
|
|
+ if (StringUtils.isNotBlank(paymentOrder.getTransNo())
|
|
|
+ || EPaymentVendor.ORIGINAL.name().equalsIgnoreCase(paymentOrder.getPaymentVendor())
|
|
|
+ || EPaymentVendor.WXPAY.name().equalsIgnoreCase(paymentOrder.getPaymentVendor())
|
|
|
+ || EPaymentVendor.ALIPAY.name().equalsIgnoreCase(paymentOrder.getPaymentVendor())) {
|
|
|
+
|
|
|
+ // 获取三方支付订单信息,根据订单状处理
|
|
|
+ PaymentResp paymentResp = paymentServiceContext.getPaymentService(paymentOrder.getPaymentVendor())
|
|
|
+ .query(paymentOrder.getTransNo(), paymentOrder.getOrderNo());
|
|
|
+ if (Objects.nonNull(paymentResp)) {
|
|
|
+ if (PaymentStatus.PENDDING == paymentResp.getPaymentStatus()) {
|
|
|
+
|
|
|
+ // 获取缓存配置信息
|
|
|
+ String paymentConfig = redisCacheService.getUserPaymentConfig(reqConfig.getUserId(), paymentOrder.getOrderNo());
|
|
|
+ if (StringUtils.isBlank(paymentConfig) && EPaymentStatus.CLOSED != paymentOrder.getStatus()) {
|
|
|
+ // 支付配置已失效,待支付订单状态调整为已关闭,提醒用户重新购买
|
|
|
+ PaymentClose paymentClose = paymentServiceContext.getPaymentService(paymentOrder.getPaymentVendor())
|
|
|
+ .close(paymentOrder.getTransNo(), "支付超时", paymentOrder.getOrderNo());
|
|
|
+
|
|
|
+ // 更新订单状态为已超时
|
|
|
+ UserPaymentOrderWrapper.UserPaymentOrder update = UserPaymentOrderWrapper.UserPaymentOrder
|
|
|
+ .builder()
|
|
|
+ .id(paymentOrder.getId())
|
|
|
+ .status(EPaymentStatus.CLOSED)
|
|
|
+ .errorMsg(paymentClose.getMsg())
|
|
|
+ .build();
|
|
|
+ userPaymentOrderService.updateById(JSON.parseObject(update.jsonString(), UserPaymentOrderWrapper.UserPaymentOrder.class));
|
|
|
+
|
|
|
+ // 订单关闭流程
|
|
|
+ cancelPayment(UserPaymentOrderWrapper.UserPaymentOrder.from(JSON.toJSONString(paymentOrder)), paymentResp);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ // 更新用户支付订单状态
|
|
|
+ updateUserPaymentOrderStatus(reqConfig.getUserId(), paymentOrder, paymentResp);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },10L,TimeUnit.SECONDS);
|
|
|
+
|
|
|
+ }
|
|
|
}
|