Ver código fonte

fix: 支付分退款增加重试机制,应对/pay后支付资源延迟

/pay接口创建支付资源后可能需短暂时间才能被/pay/refund识别,
404空body时等待1秒重试,最多3次。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
skyline 2 semanas atrás
pai
commit
2d7b1e785e

+ 21 - 2
haha-service/src/main/java/com/haha/service/payment/payscore/impl/PayScoreServiceImpl.java

@@ -540,7 +540,6 @@ public class PayScoreServiceImpl implements PayScoreService {
         log.info("[支付分服务] 退款前先确保支付已发起 - orderId: {}", orderId);
         PayScoreResult payResult = payScoreStrategy.payServiceOrder(order.getPayScoreOrderId());
         if (!payResult.isSuccess()) {
-            // /pay 失败可能是已经扣款成功,记录日志后继续尝试退款
             log.warn("[支付分服务] /pay 调用未成功(可能已自动扣款),继续尝试退款: code={}, msg={}",
                     payResult.getErrorCode(), payResult.getErrorMsg());
         }
@@ -550,7 +549,27 @@ public class PayScoreServiceImpl implements PayScoreService {
         request.setRefundAmount(actualRefundAmount);
         request.setReason(reason != null ? reason : "用户申请退款");
 
-        PayScoreResult result = payScoreStrategy.refundServiceOrder(request);
+        // 重试退款:/pay 后支付资源创建可能有延迟,重试最多3次
+        PayScoreResult result = null;
+        for (int i = 0; i < 3; i++) {
+            if (i > 0) {
+                try {
+                    Thread.sleep(1000);
+                } catch (InterruptedException ignored) {
+                }
+                log.info("[支付分服务] 退款重试 {}/3 - orderId: {}", i + 1, orderId);
+            }
+            result = payScoreStrategy.refundServiceOrder(request);
+            if (result.isSuccess()) {
+                break;
+            }
+            // 404 空body说明支付资源尚未就绪,继续重试
+            if (result.getErrorCode() == null && result.getErrorMsg() == null) {
+                log.warn("[支付分服务] 退款返回空错误(可能支付资源未就绪),准备重试");
+                continue;
+            }
+            break;
+        }
 
         if (result.isSuccess()) {
             order.setRefundStatus("REFUNDED");