|
|
@@ -89,6 +89,7 @@ import com.fs.system.mapper.SysDictDataMapper;
|
|
|
import com.fs.system.service.ISysConfigService;
|
|
|
import com.fs.voice.utils.StringUtil;
|
|
|
import com.github.binarywang.wxpay.bean.transfer.TransferBillsResult;
|
|
|
+import com.github.binarywang.wxpay.exception.WxPayException;
|
|
|
import com.volcengine.service.vod.IVodService;
|
|
|
import com.volcengine.service.vod.model.business.VodUrlUploadURLSet;
|
|
|
import com.volcengine.service.vod.model.request.*;
|
|
|
@@ -1873,6 +1874,10 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
|
|
|
// 异常时回滚余额
|
|
|
|
|
|
rollbackBalance(balanceRollbackError);
|
|
|
+ WxPayException wxEx = extractWxPayException(e);
|
|
|
+ if (wxEx != null) {
|
|
|
+ return R.error(resolveWxPayTransferErrorMsg(wxEx));
|
|
|
+ }
|
|
|
return R.error("奖励发送失败,请联系客服");
|
|
|
}
|
|
|
|
|
|
@@ -2126,6 +2131,10 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
|
|
|
// 异常时回滚余额
|
|
|
|
|
|
rollbackBalance(balanceRollbackError);
|
|
|
+ WxPayException wxEx = extractWxPayException(e);
|
|
|
+ if (wxEx != null) {
|
|
|
+ return R.error(resolveWxPayTransferErrorMsg(wxEx));
|
|
|
+ }
|
|
|
return R.error("奖励发送失败,请联系客服");
|
|
|
}
|
|
|
|
|
|
@@ -2231,7 +2240,11 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
|
|
|
return R.error("奖励发送失败,请联系客服");
|
|
|
}
|
|
|
}catch (Exception e){
|
|
|
- return R.error(e.getMessage());
|
|
|
+ WxPayException wxEx = extractWxPayException(e);
|
|
|
+ if (wxEx != null) {
|
|
|
+ return R.error(resolveWxPayTransferErrorMsg(wxEx));
|
|
|
+ }
|
|
|
+ return R.error("奖励发送失败,请联系客服");
|
|
|
}
|
|
|
|
|
|
}
|
|
|
@@ -5411,6 +5424,10 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
|
|
|
// 异常时回滚余额
|
|
|
|
|
|
rollbackBalance(balanceRollbackError);
|
|
|
+ WxPayException wxEx = extractWxPayException(e);
|
|
|
+ if (wxEx != null) {
|
|
|
+ return R.error(resolveWxPayTransferErrorMsg(wxEx));
|
|
|
+ }
|
|
|
return R.error("奖励发送失败,请联系客服");
|
|
|
}
|
|
|
|
|
|
@@ -5517,7 +5534,11 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
|
|
|
return R.error("奖励发送失败,请联系客服");
|
|
|
}
|
|
|
}catch (Exception e){
|
|
|
- return R.error(e.getMessage());
|
|
|
+ WxPayException wxEx = extractWxPayException(e);
|
|
|
+ if (wxEx != null) {
|
|
|
+ return R.error(resolveWxPayTransferErrorMsg(wxEx));
|
|
|
+ }
|
|
|
+ return R.error("奖励发送失败,请联系客服");
|
|
|
}
|
|
|
|
|
|
}
|
|
|
@@ -5573,5 +5594,106 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
|
|
|
|
|
|
return user.getMpOpenId();
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 递归查找异常链中的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 "商户账户余额不足,请联系管理员充值";
|
|
|
+ }
|
|
|
+ if (customErrorMsg.contains("没有绑定关系")) {
|
|
|
+ return "商户号与appid未绑定,请联系管理员配置";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (errCode == null || errCode.isEmpty()) {
|
|
|
+ return "微信支付服务异常,请稍后重试";
|
|
|
+ }
|
|
|
+ switch (errCode) {
|
|
|
+ case "SYSTEMERROR":
|
|
|
+ return "微信支付系统繁忙,请稍后重试";
|
|
|
+ case "INVALID_REQUEST":
|
|
|
+ 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 "收款人实名信息不匹配,请核实后重试";
|
|
|
+ case "OPENID_ERROR":
|
|
|
+ return "收款人账号不正确,请重新授权";
|
|
|
+ case "APPID_OPENID_ERROR":
|
|
|
+ return "应用与用户不匹配,请重新授权";
|
|
|
+ case "APPID_MCHID_NOT_MATCH":
|
|
|
+ return "商户号与应用未绑定,请联系管理员配置";
|
|
|
+ case "MCH_NOT_EXISTS":
|
|
|
+ return "商户号不存在,请联系管理员";
|
|
|
+ case "MCH_ERROR":
|
|
|
+ return "商户配置异常,请联系管理员";
|
|
|
+ case "NO_AUTH":
|
|
|
+ case "NOT_PERMISSION":
|
|
|
+ return "商户无此接口权限,请联系管理员";
|
|
|
+ case "SIGN_ERROR":
|
|
|
+ return "签名错误,请联系管理员";
|
|
|
+ case "SCENE_ID_NOT_EXIST":
|
|
|
+ return "发放场景不存在,请联系管理员";
|
|
|
+ case "SCENE_NOT_ALLOWED":
|
|
|
+ return "该场景不允许发放,请联系管理员";
|
|
|
+ case "TRANSFER_ALREADY_EXISTS":
|
|
|
+ return "发放已存在,请勿重复操作";
|
|
|
+ case "RESOURCE_NOT_EXISTS":
|
|
|
+ return "发放账单不存在";
|
|
|
+ case "REQUEST_BLOCKED":
|
|
|
+ return "请求被拦截,请稍后重试";
|
|
|
+ default:
|
|
|
+ return "微信支付服务异常,请稍后重试";
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|