|
|
@@ -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;
|
|
|
+ }
|
|
|
+}
|