فهرست منبع

fix: 创建支付分订单前自动取消用户旧的进行中订单

避免因历史订单未完结导致微信返回"同一实名身份下进行中的订单过多"。
在 preCreatePayScoreOrder 中增加清理逻辑,查询用户所有未完结的支付分
订单并通过微信API逐个取消。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
skyline 2 هفته پیش
والد
کامیت
d6f9cb9a42
1فایلهای تغییر یافته به همراه48 افزوده شده و 0 حذف شده
  1. 48 0
      haha-service/src/main/java/com/haha/service/payment/payscore/impl/PayScoreServiceImpl.java

+ 48 - 0
haha-service/src/main/java/com/haha/service/payment/payscore/impl/PayScoreServiceImpl.java

@@ -743,6 +743,9 @@ public class PayScoreServiceImpl implements PayScoreService {
             return errorData;
         }
 
+        // 清理用户旧的进行中支付分订单,避免微信返回"进行中订单过多"
+        cancelUserInProgressPayScoreOrders(userId);
+
         // 如果没有传 openId,从用户表中获取
         if (openId == null || openId.isEmpty()) {
             User user = userService.getById(userId);
@@ -839,4 +842,49 @@ public class PayScoreServiceImpl implements PayScoreService {
             log.error("[支付分服务] 关联预授权信息失败 - orderId: {}", order.getId(), e);
         }
     }
+
+    /**
+     * 取消用户所有进行中的支付分订单
+     * 在创建新支付分订单前调用,避免微信返回"同一实名身份下进行中的订单过多"
+     */
+    private void cancelUserInProgressPayScoreOrders(Long userId) {
+        try {
+            List<Order> inProgressOrders = orderService.lambdaQuery()
+                    .eq(Order::getUserId, userId)
+                    .eq(Order::getPayChannel, PaymentChannel.WECHAT_PAYSCORE.getCode())
+                    .notIn(Order::getPayScoreState, PayScoreState.DONE.getCode(),
+                            PayScoreState.REVOKED.getCode(), PayScoreState.EXPIRED.getCode())
+                    .isNotNull(Order::getPayScoreOrderId)
+                    .list();
+
+            if (inProgressOrders == null || inProgressOrders.isEmpty()) {
+                return;
+            }
+
+            log.info("[支付分服务] 发现用户 {} 有 {} 笔进行中的支付分订单,开始清理",
+                    userId, inProgressOrders.size());
+
+            int cancelledCount = 0;
+            for (Order order : inProgressOrders) {
+                try {
+                    PayScoreResult cancelResult = cancelPayScoreOrder(order.getId(),
+                            "自动取消:创建新订单前清理旧订单");
+                    if (cancelResult.isSuccess()) {
+                        cancelledCount++;
+                    } else {
+                        log.warn("[支付分服务] 取消旧订单失败 - orderId: {}, payScoreOrderId: {}, error: {}",
+                                order.getId(), order.getPayScoreOrderId(), cancelResult.getErrorMsg());
+                    }
+                } catch (Exception e) {
+                    log.error("[支付分服务] 取消旧订单异常 - orderId: {}, payScoreOrderId: {}",
+                            order.getId(), order.getPayScoreOrderId(), e);
+                }
+            }
+
+            log.info("[支付分服务] 用户 {} 旧订单清理完成 - 成功: {}/{}", userId, cancelledCount, inProgressOrders.size());
+
+        } catch (Exception e) {
+            log.error("[支付分服务] 清理用户 {} 进行中订单失败", userId, e);
+        }
+    }
 }