소스 검색

微信订单状态码工具类

xw 1 주 전
부모
커밋
cb4c67b634

+ 9 - 58
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java

@@ -125,6 +125,7 @@ import com.fs.wx.order.mapper.FsWxExpressTaskMapper;
 import com.fs.wx.order.service.ExpressToWxHolder;
 import com.fs.wx.order.service.ExpressToWxService;
 import com.fs.wx.order.service.ShippingService;
+import com.fs.wx.order.utils.WxShippingErrorHandler;
 import com.fs.ybPay.domain.OrderResult;
 import com.fs.ybPay.domain.RefundResult;
 import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult;
@@ -5461,36 +5462,11 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
 
             // 上传物流信息
             WxMaOrderShippingInfoBaseResponse re = wxService.getWxMaOrderShippingService().upload(request);
-            if(re.getErrCode() != 0){
-                // 微信错误代码10060001表示支付单不存在(老订单未对接微信官方发货)
-                if(re.getErrCode() == 10060001){
-                    log.warn("订单号: {} 在微信支付系统中不存在(错误代码:10060001),跳过微信发货上传,仍更新本地订单状态", dto.getOrderNumber());
-                    return true; // 返回true让订单状态正常更新
-                // 微信错误代码10060003表示支付单已使用重新发货机会
-                } else if(re.getErrCode() == 10060003){
-                    log.warn("订单号: {} 支付单已使用重新发货机会(错误代码:10060003),跳过微信发货上传,仍更新本地订单状态", dto.getOrderNumber());
-                    return true; // 返回true让订单状态正常更新
-                } else {
-                    log.error("上传物流信息到微信失败-{},订单号: {}", re.getErrMsg(), dto.getOrderNumber());
-                    return false;
-                }
-            }
-            return re.getErrCode() == 0;
+            // 使用统一的错误处理工具类
+            return WxShippingErrorHandler.handleError(re.getErrCode(), re.getErrMsg(), dto.getOrderNumber());
         } catch (Exception e) {
-            // 捕获WxErrorException等异常
-            String errorMsg = e.getMessage();
-            // 检查是否是支付单不存在的错误
-            if(errorMsg != null && (errorMsg.contains("10060001") || errorMsg.contains("支付单不存在"))){
-                log.warn("订单号: {} 在微信支付系统中不存在,跳过微信发货上传,仍更新本地订单状态。错误详情: {}", dto.getOrderNumber(), errorMsg);
-                return true; // 返回true让订单状态正常更新
-            }
-            // 检查是否是支付单已使用重新发货机会的错误
-            if(errorMsg != null && (errorMsg.contains("10060003") || errorMsg.contains("支付单已使用重新发货机会"))){
-                log.warn("订单号: {} 支付单已使用重新发货机会,跳过微信发货上传,仍更新本地订单状态。错误详情: {}", dto.getOrderNumber(), errorMsg);
-                return true; // 返回true让订单状态正常更新
-            }
-            log.error("上传物流信息到微信失败,订单号: {}", dto.getOrderNumber(), e);
-            return false;
+            // 使用统一的异常错误处理工具类
+            return WxShippingErrorHandler.handleExceptionError(e.getMessage(), dto.getOrderNumber());
         }
     }
 
@@ -5771,36 +5747,11 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
 
             // 上传物流信息
             WxMaOrderShippingInfoBaseResponse re = wxService.getWxMaOrderShippingService().upload(request);
-            if(re.getErrCode() != 0){
-                // 微信错误代码10060001表示支付单不存在(老订单未对接微信官方发货)
-                if(re.getErrCode() == 10060001){
-                    log.warn("订单号: {} 在微信支付系统中不存在(错误代码:10060001),跳过微信发货上传,仍更新本地订单状态", dto.getOrderNumber());
-                    return true; // 返回true让订单状态正常更新
-                // 微信错误代码10060003表示支付单已使用重新发货机会
-                } else if(re.getErrCode() == 10060003){
-                    log.warn("订单号: {} 支付单已使用重新发货机会(错误代码:10060003),跳过微信发货上传,仍更新本地订单状态", dto.getOrderNumber());
-                    return true; // 返回true让订单状态正常更新
-                } else {
-                    log.error("上传物流信息到微信失败-{},订单号: {}", re.getErrMsg(), dto.getOrderNumber());
-                    return false;
-                }
-            }
-            return re.getErrCode() == 0;
+            // 使用统一的错误处理工具类
+            return WxShippingErrorHandler.handleError(re.getErrCode(), re.getErrMsg(), dto.getOrderNumber());
         } catch (Exception e) {
-            // 捕获WxErrorException等异常
-            String errorMsg = e.getMessage();
-            // 检查是否是支付单不存在的错误
-            if(errorMsg != null && (errorMsg.contains("10060001") || errorMsg.contains("支付单不存在"))){
-                log.warn("订单号: {} 在微信支付系统中不存在,跳过微信发货上传,仍更新本地订单状态。错误详情: {}", dto.getOrderNumber(), errorMsg);
-                return true; // 返回true让订单状态正常更新
-            }
-            // 检查是否是支付单已使用重新发货机会的错误
-            if(errorMsg != null && (errorMsg.contains("10060003") || errorMsg.contains("支付单已使用重新发货机会"))){
-                log.warn("订单号: {} 支付单已使用重新发货机会,跳过微信发货上传,仍更新本地订单状态。错误详情: {}", dto.getOrderNumber(), errorMsg);
-                return true; // 返回true让订单状态正常更新
-            }
-            log.error("上传物流信息到微信失败,订单号: {}", dto.getOrderNumber(), e);
-            return false;
+            // 使用统一的异常错误处理工具类
+            return WxShippingErrorHandler.handleExceptionError(e.getMessage(), dto.getOrderNumber());
         }
     }
 }

+ 5 - 29
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStorePaymentScrmServiceImpl.java

@@ -71,6 +71,7 @@ import com.fs.system.oss.OSSFactory;
 import com.fs.system.service.ISysConfigService;
 import com.fs.utils.TwelveDigitSnowflake;
 import com.fs.wx.miniapp.config.WxMaProperties;
+import com.fs.wx.order.utils.WxShippingErrorHandler;
 import com.fs.ybPay.domain.CreateWxOrderResult;
 import com.github.binarywang.wxpay.bean.notify.SignatureHeader;
 import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse;
@@ -1315,36 +1316,11 @@ public class FsStorePaymentScrmServiceImpl implements IFsStorePaymentScrmService
             request.setPayer(payerBean);
             // 上传物流信息
             WxMaOrderShippingInfoBaseResponse re = wxService.getWxMaOrderShippingService().upload(request);
-            if(re.getErrCode() != 0){
-                // 微信错误代码10060001表示支付单不存在(老订单未对接微信官方发货)
-                if(re.getErrCode() == 10060001){
-                    log.warn("订单号: {} 在微信支付系统中不存在(错误代码:10060001),跳过微信发货上传,仍更新本地订单状态", dto.getBankTransactionId());
-                    return true; // 返回true让订单状态正常更新
-                // 微信错误代码10060003表示支付单已使用重新发货机会
-                } else if(re.getErrCode() == 10060003){
-                    log.warn("订单号: {} 支付单已使用重新发货机会(错误代码:10060003),跳过微信发货上传,仍更新本地订单状态", dto.getBankTransactionId());
-                    return true; // 返回true让订单状态正常更新
-                } else {
-                    log.error("上传物流信息到微信失败-{},订单号: {}", re.getErrMsg(), dto.getBankTransactionId());
-                    return false;
-                }
-            }
-            return re.getErrCode() == 0;
+            // 使用统一的错误处理工具类
+            return WxShippingErrorHandler.handleError(re.getErrCode(), re.getErrMsg(), dto.getBankTransactionId());
         } catch (Exception e) {
-            // 捕获WxErrorException等异常
-            String errorMsg = e.getMessage();
-            // 检查是否是支付单不存在的错误
-            if(errorMsg != null && (errorMsg.contains("10060001") || errorMsg.contains("支付单不存在"))){
-                log.warn("订单号: {} 在微信支付系统中不存在,跳过微信发货上传,仍更新本地订单状态。错误详情: {}", dto.getBankTransactionId(), errorMsg);
-                return true; // 返回true让订单状态正常更新
-            }
-            // 检查是否是支付单已使用重新发货机会的错误
-            if(errorMsg != null && (errorMsg.contains("10060003") || errorMsg.contains("支付单已使用重新发货机会"))){
-                log.warn("订单号: {} 支付单已使用重新发货机会,跳过微信发货上传,仍更新本地订单状态。错误详情: {}", dto.getBankTransactionId(), errorMsg);
-                return true; // 返回true让订单状态正常更新
-            }
-            log.error("上传物流信息到微信失败,订单号: {}", dto.getBankTransactionId(), e);
-            return false;
+            // 使用统一的异常错误处理工具类
+            return WxShippingErrorHandler.handleExceptionError(e.getMessage(), dto.getBankTransactionId());
         }
     }
 }

+ 160 - 0
fs-service/src/main/java/com/fs/wx/order/utils/WxShippingErrorHandler.java

@@ -0,0 +1,160 @@
+package com.fs.wx.order.utils;
+
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 微信发货错误码处理工具类
+ * 统一管理微信发货接口的错误码及处理逻辑
+ *
+ * @author 夏伟
+ * @date 2025-12-31
+ */
+@Slf4j
+public class WxShippingErrorHandler {
+
+    /**
+     * 允许本地订单状态正常更新的错误码集合(返回true,跳过微信发货但更新本地数据库)
+     * 这些错误通常表示:老订单、重复操作、微信侧数据不存在等非阻塞性错误
+     */
+    private static final Map<Integer, String> ALLOW_UPDATE_ERRORS = new HashMap<>();
+
+    /**
+     * 阻止订单状态更新的错误码集合(返回false,阻止更新并提示用户)
+     * 这些错误通常表示:参数错误、物流信息错误、系统异常等需要人工介入的错误
+     */
+    private static final Map<Integer, String> BLOCK_UPDATE_ERRORS = new HashMap<>();
+
+    static {
+        // 初始化允许更新的错误码
+        ALLOW_UPDATE_ERRORS.put(10060001, "支付单不存在(老订单未对接微信官方发货)");
+        ALLOW_UPDATE_ERRORS.put(10060002, "订单不存在(微信侧无此订单记录)");
+        ALLOW_UPDATE_ERRORS.put(10060003, "运单号不存在(可能是重复发货或已使用重新发货机会)");
+        ALLOW_UPDATE_ERRORS.put(10060007, "订单已发货(重复发货操作)");
+        ALLOW_UPDATE_ERRORS.put(10060008, "订单已完成(订单已完成无需再次发货)");
+        ALLOW_UPDATE_ERRORS.put(10060023, "发货信息未更新(发货信息与上次相同)");
+
+        // 初始化阻止更新的错误码
+        BLOCK_UPDATE_ERRORS.put(10060004, "发货失败");
+        BLOCK_UPDATE_ERRORS.put(10060005, "取消发货失败");
+        BLOCK_UPDATE_ERRORS.put(10060006, "订单状态不允许发货");
+        BLOCK_UPDATE_ERRORS.put(10060009, "订单已取消");
+        BLOCK_UPDATE_ERRORS.put(10060010, "订单已关闭");
+        BLOCK_UPDATE_ERRORS.put(10060011, "订单已退款");
+        BLOCK_UPDATE_ERRORS.put(10060012, "物流公司不存在");
+        BLOCK_UPDATE_ERRORS.put(10060013, "物流公司不支持");
+        BLOCK_UPDATE_ERRORS.put(10060014, "物流公司编码错误");
+        BLOCK_UPDATE_ERRORS.put(10060015, "物流公司服务异常");
+    }
+
+    /**
+     * 判断错误码是否允许本地订单状态更新
+     *
+     * @param errCode 微信返回的错误码
+     * @return true-允许更新本地订单状态,false-阻止更新
+     */
+    public static boolean shouldAllowUpdate(Integer errCode) {
+        return ALLOW_UPDATE_ERRORS.containsKey(errCode);
+    }
+
+    /**
+     * 判断错误码是否阻止本地订单状态更新
+     *
+     * @param errCode 微信返回的错误码
+     * @return true-阻止更新,false-允许更新
+     */
+    public static boolean shouldBlockUpdate(Integer errCode) {
+        return BLOCK_UPDATE_ERRORS.containsKey(errCode);
+    }
+
+    /**
+     * 获取错误码的描述信息
+     *
+     * @param errCode 微信返回的错误码
+     * @return 错误码描述
+     */
+    public static String getErrorDesc(Integer errCode) {
+        if (ALLOW_UPDATE_ERRORS.containsKey(errCode)) {
+            return ALLOW_UPDATE_ERRORS.get(errCode);
+        }
+        if (BLOCK_UPDATE_ERRORS.containsKey(errCode)) {
+            return BLOCK_UPDATE_ERRORS.get(errCode);
+        }
+        return "未知错误";
+    }
+
+    /**
+     * 处理微信发货接口返回的错误码
+     * 统一的错误处理逻辑,根据错误码决定是否允许本地订单状态更新
+     *
+     * @param errCode 微信返回的错误码
+     * @param errMsg 微信返回的错误信息
+     * @param orderNumber 订单号(用于日志记录)
+     * @return true-允许更新本地订单状态,false-阻止更新
+     */
+    public static boolean handleError(Integer errCode, String errMsg, String orderNumber) {
+        if (errCode == null || errCode == 0) {
+            return true; // 成功,允许更新
+        }
+
+        String errorDesc = getErrorDesc(errCode);
+
+        // 允许更新的错误码
+        if (shouldAllowUpdate(errCode)) {
+            log.warn("订单号: {} 微信发货接口返回错误码: {}, 错误描述: {}, 微信返回信息: {}。跳过微信发货上传,仍更新本地订单状态",
+                    orderNumber, errCode, errorDesc, errMsg);
+            return true;
+        }
+
+        // 阻止更新的错误码
+        if (shouldBlockUpdate(errCode)) {
+            log.error("订单号: {} 微信发货接口返回错误码: {}, 错误描述: {}, 微信返回信息: {}。阻止本地订单状态更新",
+                    orderNumber, errCode, errorDesc, errMsg);
+            return false;
+        }
+
+        // 未知错误码,默认阻止更新
+        log.error("订单号: {} 微信发货接口返回未知错误码: {}, 微信返回信息: {}。阻止本地订单状态更新",
+                orderNumber, errCode, errMsg);
+        return false;
+    }
+
+    /**
+     * 处理异常中的错误码(从异常消息中提取错误码)
+     * 用于处理 WxErrorException 等异常情况
+     *
+     * @param errorMsg 异常消息
+     * @param orderNumber 订单号(用于日志记录)
+     * @return true-允许更新本地订单状态,false-阻止更新
+     */
+    public static boolean handleExceptionError(String errorMsg, String orderNumber) {
+        if (errorMsg == null || errorMsg.isEmpty()) {
+            log.error("订单号: {} 上传物流信息到微信失败,错误信息为空", orderNumber);
+            return false;
+        }
+
+        // 尝试从错误消息中提取错误码
+        for (Integer errCode : ALLOW_UPDATE_ERRORS.keySet()) {
+            if (errorMsg.contains(String.valueOf(errCode)) || errorMsg.contains(ALLOW_UPDATE_ERRORS.get(errCode))) {
+                log.warn("订单号: {} 微信发货异常,错误码: {}, 错误描述: {}。跳过微信发货上传,仍更新本地订单状态。异常详情: {}",
+                        orderNumber, errCode, ALLOW_UPDATE_ERRORS.get(errCode), errorMsg);
+                return true;
+            }
+        }
+
+        // 检查是否是阻止更新的错误
+        for (Integer errCode : BLOCK_UPDATE_ERRORS.keySet()) {
+            if (errorMsg.contains(String.valueOf(errCode)) || errorMsg.contains(BLOCK_UPDATE_ERRORS.get(errCode))) {
+                log.error("订单号: {} 微信发货异常,错误码: {}, 错误描述: {}。阻止本地订单状态更新。异常详情: {}",
+                        orderNumber, errCode, BLOCK_UPDATE_ERRORS.get(errCode), errorMsg);
+                return false;
+            }
+        }
+
+        // 未知错误,默认阻止更新
+        log.error("订单号: {} 上传物流信息到微信失败,未识别的错误。异常详情: {}", orderNumber, errorMsg);
+        return false;
+    }
+}