|
|
@@ -5751,6 +5751,82 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
|
|
|
return extractWxPayException(e.getCause());
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 提取微信返回的详细错误描述(仅用于 INVALID_REQUEST / PARAM_ERROR 精细提示)
|
|
|
+ */
|
|
|
+ private String extractWxPayDetailMsg(WxPayException e) {
|
|
|
+ if (StringUtils.isNotBlank(e.getErrCodeDes())) {
|
|
|
+ return e.getErrCodeDes().trim();
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotBlank(e.getCustomErrorMsg())) {
|
|
|
+ return e.getCustomErrorMsg().trim();
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotBlank(e.getReturnMsg())) {
|
|
|
+ return e.getReturnMsg().trim();
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 将 INVALID_REQUEST / PARAM_ERROR 的微信明细转成客户能看懂的精确提示
|
|
|
+ */
|
|
|
+ private String resolveInvalidOrParamErrorMsg(String errCode, String detail) {
|
|
|
+ logger.warn("微信支付转账参数类错误: errCode={}, detail={}", errCode, detail);
|
|
|
+ if (StringUtils.isNotBlank(detail)) {
|
|
|
+ if (detail.contains("Openid") || detail.contains("openid") || detail.contains("OPENID")) {
|
|
|
+ return "当前微信账号与应用不匹配,请重新授权后再试";
|
|
|
+ }
|
|
|
+ if (detail.contains("实名") || detail.contains("姓名不一致")) {
|
|
|
+ return "收款人姓名与微信实名不一致,请核实后再试";
|
|
|
+ }
|
|
|
+ if (detail.contains("0.3元以下") && detail.contains("姓名")) {
|
|
|
+ return "小额奖励无需校验姓名,请联系客服处理";
|
|
|
+ }
|
|
|
+ if (detail.contains("单日转账额度") || detail.contains("单笔转账") || detail.contains("上下限")) {
|
|
|
+ return "奖励金额超出可发放范围,请稍后再试或联系客服";
|
|
|
+ }
|
|
|
+ if (detail.contains("API通道未开启")) {
|
|
|
+ return "奖励发放通道未开通,请联系客服";
|
|
|
+ }
|
|
|
+ if (detail.contains("产品权限") || detail.contains("尚未获取该转账场景") || detail.contains("转账场景")
|
|
|
+ || detail.contains("场景报备") || detail.contains("未传入完整")) {
|
|
|
+ return "奖励发放场景未配置完成,请联系客服";
|
|
|
+ }
|
|
|
+ if (detail.contains("收款用户列表")) {
|
|
|
+ return "当前账号不在可收款名单中,请联系客服";
|
|
|
+ }
|
|
|
+ if (detail.contains("用户收款感知") || detail.contains("user_recv_perception")) {
|
|
|
+ return "奖励发放文案配置不正确,请联系客服";
|
|
|
+ }
|
|
|
+ if (detail.contains("IP地址不允许") || detail.contains("此IP地址")) {
|
|
|
+ return "服务网络未授权发放,请联系客服";
|
|
|
+ }
|
|
|
+ if (detail.contains("超出重试期")) {
|
|
|
+ return "发放单已超时,请联系客服重新处理";
|
|
|
+ }
|
|
|
+ if (detail.contains("创建订单冲突")) {
|
|
|
+ return "发放操作冲突,请稍后再试";
|
|
|
+ }
|
|
|
+ if (detail.contains("资金不足") || detail.contains("余额不足")) {
|
|
|
+ return "商户账户余额不足,请联系管理员充值";
|
|
|
+ }
|
|
|
+ if (detail.contains("没有绑定关系") || detail.contains("商户号和AppID")) {
|
|
|
+ return "商户号与应用未绑定,请联系管理员配置";
|
|
|
+ }
|
|
|
+ if (detail.contains("Wechatpay-Serial") || detail.contains("平台证书") || detail.contains("证书")) {
|
|
|
+ return "支付证书配置异常,请联系客服";
|
|
|
+ }
|
|
|
+ // 微信已返回中文说明时,直接给客户看(更精确)
|
|
|
+ if (detail.matches(".*[\\u4e00-\\u9fa5]+.*")) {
|
|
|
+ return detail;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if ("PARAM_ERROR".equals(errCode)) {
|
|
|
+ return "发放信息不完整,请重新授权后再试;如仍失败请联系客服";
|
|
|
+ }
|
|
|
+ return "当前无法完成发放,请稍后重试;如多次失败请联系客服";
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 根据微信支付转账接口错误码解析用户可读的中文错误信息
|
|
|
*/
|
|
|
@@ -5773,9 +5849,8 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
|
|
|
case "SYSTEMERROR":
|
|
|
return "微信支付系统繁忙,请稍后重试";
|
|
|
case "INVALID_REQUEST":
|
|
|
- return "请求参数不合法,请联系管理员";
|
|
|
case "PARAM_ERROR":
|
|
|
- return "请求参数错误,请联系管理员";
|
|
|
+ return resolveInvalidOrParamErrorMsg(errCode, extractWxPayDetailMsg(e));
|
|
|
case "NOTENOUGH":
|
|
|
return "商户账户余额不足,请联系管理员充值";
|
|
|
case "ORDERNOTEXIST":
|