소스 검색

fix: 退款时如缺transaction_id则从微信查询补全

旧订单在部署transaction_id提取逻辑前已收到PAYSCORE.USER_PAID回调,
本地未存储transaction_id。退款时若缺失则调用微信查询接口补全。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
skyline 2 주 전
부모
커밋
fa9a6f14ee

+ 5 - 0
haha-service/src/main/java/com/haha/service/payment/payscore/PayScoreResult.java

@@ -30,6 +30,11 @@ public class PayScoreResult {
      */
     private String packageStr;
     
+    /**
+     * 微信支付订单号(退款用,来自 collection.details[0].transaction_id)
+     */
+    private String transactionId;
+
     /**
      * 总金额(元)
      */

+ 12 - 3
haha-service/src/main/java/com/haha/service/payment/payscore/impl/PayScoreServiceImpl.java

@@ -539,10 +539,19 @@ public class PayScoreServiceImpl implements PayScoreService {
         BigDecimal actualRefundAmount = refundAmount != null ? refundAmount
                 : (order.getPaidAmount() != null ? order.getPaidAmount() : order.getTotalAmount());
 
-        // 校验 transaction_id(退款必须,来自支付回调 PAYSCORE.USER_PAID)
+        // 如果缺少 transaction_id(旧订单回调时未提取),从微信查询补全
         if (order.getTransactionId() == null || order.getTransactionId().isEmpty()) {
-            return PayScoreResult.fail("MISSING_TRANSACTION_ID",
-                    "未收到微信支付回调,缺少 transaction_id,请稍后重试");
+            log.info("[支付分服务] transaction_id缺失,从微信查询补全 - orderId: {}", orderId);
+            PayScoreResult queryResult = payScoreStrategy.queryServiceOrder(order.getPayScoreOrderId());
+            if (queryResult.isSuccess() && queryResult.getTransactionId() != null) {
+                order.setTransactionId(queryResult.getTransactionId());
+                orderService.updateById(order);
+                log.info("[支付分服务] transaction_id补全成功 - orderId: {}, transactionId: {}",
+                        orderId, order.getTransactionId());
+            } else {
+                return PayScoreResult.fail("MISSING_TRANSACTION_ID",
+                        "未收到微信支付回调,缺少 transaction_id,请稍后重试");
+            }
         }
 
         PayScoreRefundRequest request = new PayScoreRefundRequest();

+ 14 - 2
haha-service/src/main/java/com/haha/service/payment/payscore/impl/WxPayScoreStrategy.java

@@ -403,12 +403,24 @@ public class WxPayScoreStrategy implements PayScoreStrategy {
                 result.setTotalAmount(fenToYuan(totalAmountFen));
             }
 
+            // 提取微信支付订单号
+            if (respJson.has("collection")) {
+                JsonNode collection = respJson.get("collection");
+                if (collection.has("details") && collection.get("details").isArray()) {
+                    JsonNode details = collection.get("details");
+                    if (details.size() > 0) {
+                        String transactionId = getJsonString(details.get(0), "transaction_id");
+                        result.setTransactionId(transactionId);
+                    }
+                }
+            }
+
             Map<String, Object> rawData = new HashMap<>();
             rawData.put("response", responseMap);
             result.setRawData(rawData);
 
-            log.info("[微信支付分] 查询订单成功 - 订单号: {}, 状态: {}, 金额: {}元", 
-                    respOutOrderNo, state, result.getTotalAmount());
+            log.info("[微信支付分] 查询订单成功 - 订单号: {}, 状态: {}, 金额: {}元, transactionId: {}",
+                    respOutOrderNo, state, result.getTotalAmount(), result.getTransactionId());
             return result;
 
         } catch (HttpException e) {