Bladeren bron

fix: 微信返回ORDER_NOT_EXIST时同步清理本地订单状态

之前仅在取消成功时才更新本地状态为REVOKED,微信侧已不存在的订单
每次扫码都会被重复查询并尝试取消,产生大量ORDER_NOT_EXIST错误日志。
现在取消异常或ORDER_NOT_EXIST时也同步更新本地状态,打破死循环。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
skyline 2 weken geleden
bovenliggende
commit
2cd0bae205

+ 24 - 8
haha-service/src/main/java/com/haha/service/payment/payscore/impl/PayScoreServiceImpl.java

@@ -906,16 +906,32 @@ public class PayScoreServiceImpl implements PayScoreService {
 
             if (cancelResult.isSuccess()) {
                 log.info("[支付分服务] 取消成功 - outOrderNo: {}", outOrderNo);
-                if (localOrderId != null) {
-                    Order order = orderService.getById(localOrderId);
-                    if (order != null) {
-                        order.setPayScoreState(PayScoreState.REVOKED.getCode());
-                        orderService.updateById(order);
-                    }
-                }
+                markOrderRevoked(localOrderId);
+            } else if (cancelResult.getErrorMsg() != null
+                    && cancelResult.getErrorMsg().contains("ORDER_NOT_EXIST")) {
+                // 微信侧已不存在,同步清理本地状态,避免反复尝试
+                log.debug("[支付分服务] 微信侧已不存在,清理本地记录 - outOrderNo: {}", outOrderNo);
+                markOrderRevoked(localOrderId);
+            }
+        } catch (Exception e) {
+            // 网络异常等,微信侧可能已取消成功,保守清理本地状态
+            log.debug("[支付分服务] 取消异常,清理本地记录 - outOrderNo: {}", outOrderNo);
+            markOrderRevoked(localOrderId);
+        }
+    }
+
+    private void markOrderRevoked(Long localOrderId) {
+        if (localOrderId == null) {
+            return;
+        }
+        try {
+            Order order = orderService.getById(localOrderId);
+            if (order != null && !PayScoreState.isFinished(order.getPayScoreState())) {
+                order.setPayScoreState(PayScoreState.REVOKED.getCode());
+                orderService.updateById(order);
             }
         } catch (Exception e) {
-            log.debug("[支付分服务] 取消订单异常(可能微信侧已不存在) - outOrderNo: {}", outOrderNo);
+            log.warn("[支付分服务] 更新本地订单状态失败 - orderId: {}", localOrderId, e);
         }
     }