刘俊驰 6 月之前
父节点
当前提交
56a908e736

+ 4 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserPaymentCoreService.java

@@ -4,6 +4,7 @@ import com.microsvc.toolkit.config.jwt.utils.JwtUserInfo;
 import com.microsvc.toolkit.middleware.payment.common.api.entity.PaymentResp;
 import com.microsvc.toolkit.middleware.payment.common.api.entity.RefundResp;
 import com.yonge.cooleshow.biz.dal.wrapper.UserPaymentOrderWrapper;
+import org.springframework.transaction.annotation.Transactional;
 
 /**
  * 用户支付订单服务
@@ -95,4 +96,7 @@ public interface UserPaymentCoreService {
      * @return PaymentResp
      */
     PaymentResp closedPayment( UserPaymentOrderWrapper.UserPaymentOrder paymentOrder);
+
+    @Transactional
+    void paymentStatus(String orderNo);
 }

+ 6 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java

@@ -270,7 +270,13 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
 
     @Override
     public UserOrderVo detailApp(UserOrder param) {
+
         UserOrderVo userOrderVo = baseMapper.detailApp(param);
+
+        if (userOrderVo.getStatus() == OrderStatusEnum.PAYING) {
+            userPaymentCoreService.paymentStatus(userOrderVo.getOrderNo());
+        }
+        userOrderVo = baseMapper.detailApp(param);
         userOrderDetail(userOrderVo);
         return userOrderVo;
     }

+ 65 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserPaymentCoreServiceImpl.java

@@ -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;
@@ -1443,4 +1444,68 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
 
         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.getOrderType().getCode());
+                        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);
+
+    }
 }

+ 1 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/UserPaymentOrderWrapper.java

@@ -340,6 +340,7 @@ public class UserPaymentOrderWrapper {
                     .activityId(getActivityId())
                     .rewardId(getRewardId())
                     .tenantId(getTenantId())
+                .reason(getErrorMsg())
                     .build();
         }