yys 3 дней назад
Родитель
Сommit
8d2219249a

+ 65 - 28
fs-user-app/src/main/java/com/fs/app/controller/course/CourseFsUserController.java

@@ -174,9 +174,9 @@ public class CourseFsUserController extends AppBaseController {
         try {
             return courseVideoService.sendRewardByFsUser(param);
         } catch (Exception e) {
-            if (e.getCause() instanceof WxPayException) {
-                WxPayException wxEx = (WxPayException) e.getCause();
-                logger.error("【发放奖励】微信支付转账异常(包装),用户ID:{},错误码:{},错误信息:{}", param.getUserId(), wxEx.getErrCode(), wxEx.getErrCodeDes(), e);
+            WxPayException wxEx = extractWxPayException(e);
+            if (wxEx != null) {
+                logger.error("【发放奖励】微信支付转账异常,用户ID:{},错误码:{},错误信息:{}", param.getUserId(), wxEx.getErrCode(), wxEx.getErrCodeDes(), e);
                 return R.error(resolveWxPayTransferErrorMsg(wxEx));
             }
             logger.error("【发放奖励】奖励发放异常,用户ID:{}", param.getUserId(), e);
@@ -216,9 +216,9 @@ public class CourseFsUserController extends AppBaseController {
         try {
             return R.ok(courseVideoService.withdrawal(param));
         } catch (Exception e) {
-            if (e.getCause() instanceof WxPayException) {
-                WxPayException wxEx = (WxPayException) e.getCause();
-                logger.error("【积分提现】微信支付转账异常(包装),用户ID:{},错误码:{},错误信息:{}", param.getUserId(), wxEx.getErrCode(), wxEx.getErrCodeDes(), e);
+            WxPayException wxEx = extractWxPayException(e);
+            if (wxEx != null) {
+                logger.error("【积分提现】微信支付转账异常,用户ID:{},错误码:{},错误信息:{}", param.getUserId(), wxEx.getErrCode(), wxEx.getErrCodeDes(), e);
                 return R.error(resolveWxPayTransferErrorMsg(wxEx));
             }
             logger.error("【积分提现】提现异常,用户ID:{}", param.getUserId(), e);
@@ -227,17 +227,33 @@ public class CourseFsUserController extends AppBaseController {
     }
 
     /**
-     * 根据微信支付转账接口错误码解析用户可读的错误信息
+     * 递归查找异常链中的WxPayException(处理多层RuntimeException包装的情况)
+     */
+    private WxPayException extractWxPayException(Throwable e) {
+        if (e == null) {
+            return null;
+        }
+        if (e instanceof WxPayException) {
+            return (WxPayException) e;
+        }
+        return extractWxPayException(e.getCause());
+    }
+
+    /**
+     * 根据微信支付转账接口错误码解析用户可读的中文错误信息
      */
     private String resolveWxPayTransferErrorMsg(WxPayException e) {
         String errCode = e.getErrCode();
         String customErrorMsg = e.getCustomErrorMsg();
-        // 优先处理自定义错误信息(如"商户运营账户资金不足")
+        // 优先处理自定义错误信息中的已知中文关键词
         if (customErrorMsg != null && !customErrorMsg.isEmpty()) {
             if (customErrorMsg.contains("资金不足") || customErrorMsg.contains("余额不足")) {
                 return "商户账户余额不足,请联系管理员充值";
             }
-            return customErrorMsg;
+            if (customErrorMsg.contains("没有绑定关系")) {
+                return "商户号与appid未绑定,请联系管理员配置";
+            }
+            // customErrorMsg可能含英文,不再直接透传,走errCode映射
         }
         if (errCode == null || errCode.isEmpty()) {
             return "微信支付服务异常,请稍后重试";
@@ -250,58 +266,79 @@ public class CourseFsUserController extends AppBaseController {
                 return "请求参数不合法,请联系管理员";
             case "PARAM_ERROR":
                 return "请求参数错误,请联系管理员";
+            // 余额不足
             case "NOTENOUGH":
                 return "商户账户余额不足,请联系管理员充值";
+            // 订单相关
             case "ORDERNOTEXIST":
                 return "转账订单不存在";
             case "ORDER_PAID":
                 return "转账订单已支付,请勿重复操作";
+            // 频率/额度限制
             case "FREQUENCY_LIMITED":
                 return "操作过于频繁,请稍后再试";
             case "EXCEED_QTY_LIMIT":
                 return "超过转账数量限制,请稍后再试";
             case "EXCEED_QUOTA_LIMIT":
                 return "超过转账额度限制,请稍后再试";
+            case "TRANSFER_QUOTA_OVER_LIMIT":
+                return "转账金额超限,请联系管理员";
+            // 转账失败
             case "PAY_FAIL":
                 return "转账失败,请稍后重试";
+            // 付款方账户问题
             case "PAYER_ACCOUNT_ERROR":
                 return "付款账户异常,请联系管理员";
+            case "PAYER_USER_INFO_ERROR":
+                return "付款方信息错误,请联系管理员";
+            // 收款方账户问题
             case "PAYEE_ACCOUNT_ERROR":
             case "PAYEE_NOT_EXIST":
                 return "收款账户异常,请重新授权后重试";
+            case "PAYEE_USER_INFO_ERROR":
+                return "收款人信息错误,请重新授权";
+            case "RECV_ACCOUNT_NOT_ALLOWED":
+                return "收款账户不允许,请核实后重试";
+            case "USER_BANNED":
+                return "收款账号被限制,请联系客服";
+            // 风控
             case "TRANSFER_RISK":
                 return "转账存在风险,请稍后重试";
+            // 实名校验
             case "REALNAME_CHECK_ERROR":
                 return "收款人实名信息不匹配,请核实后重试";
+            // openid/appid/商户号关系问题
             case "OPENID_ERROR":
-                return "收款人openid不正确,请重新授权";
+                return "收款人账号不正确,请重新授权";
             case "APPID_OPENID_ERROR":
-                return "appid与openid不匹配,请重新授权";
+                return "应用与用户不匹配,请重新授权";
+            case "APPID_MCHID_NOT_MATCH":
+                return "商户号与应用未绑定,请联系管理员配置";
             case "MCH_NOT_EXISTS":
                 return "商户号不存在,请联系管理员";
+            case "MCH_ERROR":
+                return "商户配置异常,请联系管理员";
+            // 权限问题
             case "NO_AUTH":
-                return "商户无此接口权限,请联系管理员";
             case "NOT_PERMISSION":
                 return "商户无此接口权限,请联系管理员";
-            case "MCH_ERROR":
-                return "商户配置异常,请联系管理员";
+            // 签名错误
             case "SIGN_ERROR":
                 return "签名错误,请联系管理员";
-            case "RECV_ACCOUNT_NOT_ALLOWED":
-                return "收款账户不允许,请核实后重试";
-            case "PAYEE_USER_INFO_ERROR":
-                return "收款人信息错误,请重新授权";
-            case "PAYER_USER_INFO_ERROR":
-                return "付款方信息错误,请联系管理员";
-            case "USER_BANNED":
-                return "收款账号被限制,请联系客服";
-            case "TRANSFER_QUOTA_OVER_LIMIT":
-                return "转账金额超限,请联系管理员";
+            // 场景ID相关
+            case "SCENE_ID_NOT_EXIST":
+                return "转账场景不存在,请联系管理员";
+            case "SCENE_NOT_ALLOWED":
+                return "该场景不允许转账,请联系管理员";
+            // 转账状态
+            case "TRANSFER_ALREADY_EXISTS":
+                return "转账已存在,请勿重复操作";
+            // V3接口特有错误码
+            case "RESOURCE_NOT_EXISTS":
+                return "转账账单不存在";
+            case "REQUEST_BLOCKED":
+                return "请求被拦截,请稍后重试";
             default:
-                String errCodeDes = e.getErrCodeDes();
-                if (errCodeDes != null && !errCodeDes.isEmpty()) {
-                    return "支付失败:" + errCodeDes;
-                }
                 return "微信支付服务异常,请稍后重试";
         }
     }