Browse Source

Merge remote-tracking branch 'origin/Payment-Configuration' into Payment-Configuration

xgb 2 tuần trước cách đây
mục cha
commit
828ef1564f

+ 60 - 1
fs-company-app/src/main/java/com/fs/app/controller/FsUserCourseVideoController.java

@@ -27,6 +27,7 @@ import com.fs.course.param.newfs.FsCourseWatchAppParam;
 import com.fs.course.param.newfs.FsUserCourseListParam;
 import com.fs.course.param.newfs.UserCourseVideoPageParam;
 import com.fs.course.service.*;
+import com.fs.course.utils.WechatErrorUtil;
 import com.fs.course.vo.FsCourseWatchLogListVO;
 import com.fs.course.vo.FsUserCourseParticipationRecordVO;
 import com.fs.course.vo.newfs.*;
@@ -42,6 +43,7 @@ import com.github.pagehelper.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.common.error.WxErrorException;
 import org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -309,7 +311,64 @@ public class FsUserCourseVideoController extends AppBaseController {
     @GetMapping("/getGotoWxAppLink")
     @ApiOperation("获取跳转微信小程序的链接地址")
     public ResponseResult<String> getGotoWxAppLink(String linkStr,String appid) {
-        return ResponseResult.ok(courseLinkService.getGotoWxAppLink(linkStr,appid));
+        try {
+            String result = courseLinkService.getGotoWxAppLink(linkStr,appid);
+            // 检查返回结果是否为空或空白
+            if (result == null || result.trim().isEmpty()) {
+                return ResponseResult.fail(500, "生成微信小程序链接失败");
+            }
+            // 检查返回结果是否包含错误信息
+            if (result.contains("错误") || result.contains("失败")) {
+                return ResponseResult.fail(500, result);
+            }
+            return ResponseResult.ok(result);
+        } catch (Exception e) {
+            log.error("获取跳转微信小程序链接失败", e);
+            return handleWechatError(e);
+        }
+    }
+    
+    /**
+     * 统一处理微信错误
+     */
+    private ResponseResult<String> handleWechatError(Exception e) {
+        // 1. 检查是否是WxErrorException(可能在cause中)
+        Throwable cause = e.getCause();
+        if (cause instanceof WxErrorException) {
+            WxErrorException wxError = (WxErrorException) cause;
+            Integer errcode = wxError.getError().getErrorCode();
+            String errmsg = wxError.getError().getErrorMsg();
+            log.error("微信API异常,错误码:{},错误信息:{}", errcode, errmsg);
+            
+            String friendlyMsg = WechatErrorUtil.getFriendlyMessage(errcode);
+            Map<String, Object> extData = new HashMap<>();
+            extData.put("wechatErrorCode", errcode);
+            return new ResponseResult<>(500, friendlyMsg, null, extData);
+        }
+        
+        // 2. 检查是否是微信错误(格式:微信错误:errcode|errmsg)
+        String errorMsg = e.getMessage();
+        if (errorMsg != null && errorMsg.startsWith("微信错误:")) {
+            String errorInfo = errorMsg.substring("微信错误:".length());
+            String[] parts = errorInfo.split("\\|", 2);
+            if (parts.length == 2) {
+                try {
+                    Integer errcode = Integer.parseInt(parts[0]);
+                    String errmsg = parts[1];
+                    log.error("微信返回错误,错误码:{},错误信息:{}", errcode, errmsg);
+                    
+                    String friendlyMsg = WechatErrorUtil.getFriendlyMessage(errcode);
+                    Map<String, Object> extData = new HashMap<>();
+                    extData.put("wechatErrorCode", errcode);
+                    return new ResponseResult<>(500, friendlyMsg, null, extData);
+                } catch (NumberFormatException ex) {
+                    // 格式错误,返回原始错误
+                }
+            }
+        }
+        
+        // 3. 其他错误,返回通用错误信息
+        return ResponseResult.fail(500, "获取微信小程序链接失败:" + errorMsg);
     }
 
     @GetMapping("/getGotoAppLink")

+ 18 - 4
fs-service/src/main/java/com/fs/course/service/impl/FsCourseLinkServiceImpl.java

@@ -824,18 +824,32 @@ public class FsCourseLinkServiceImpl implements IFsCourseLinkService
                 if(null != jsonObject && !jsonObject.isEmpty() && jsonObject.containsKey("url_link")){
                     return jsonObject.getString("url_link");
                 }
+                
+                // 处理微信错误响应
+                if(jsonObject != null && jsonObject.containsKey("errcode")) {
+                    Integer errcode = jsonObject.getInteger("errcode");
+                    String errmsg = jsonObject.getString("errmsg");
+                    log.error("微信小程序生成链接失败,错误码:{},错误信息:{}", errcode, errmsg);
+                    throw new RuntimeException("微信错误:" + errcode + "|" + errmsg);
+                }
+                
+                // 响应格式异常
+                log.error("微信小程序响应格式异常");
+                throw new RuntimeException("微信小程序响应格式异常");
             } else {
                 return "页面链接错误,获取失败";
             }
 
         } catch (WxErrorException e) {
-            throw new RuntimeException(e);
+            log.error("微信API调用异常", e);
+            throw new RuntimeException("微信API异常", e);
         } catch (ClientProtocolException e) {
-            throw new RuntimeException(e);
+            log.error("HTTP协议错误", e);
+            throw new RuntimeException("网络请求失败", e);
         } catch (IOException e) {
-            throw new RuntimeException(e);
+            log.error("IO异常", e);
+            throw new RuntimeException("网络连接失败", e);
         }
-        return "";
     }
 
     @Override

+ 125 - 0
fs-service/src/main/java/com/fs/course/utils/WechatErrorUtil.java

@@ -0,0 +1,125 @@
+package com.fs.course.utils;
+
+import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.common.error.WxErrorException;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 微信错误处理工具类
+ * 
+ * @author system
+ */
+@Slf4j
+public class WechatErrorUtil {
+
+    /**
+     * 格式化错误信息(格式:错误码|错误信息)
+     */
+    public static String formatError(Integer errcode, String msg) {
+        return errcode + "|" + msg;
+    }
+
+    /**
+     * 根据微信错误码返回友好的错误提示
+     */
+    public static String getFriendlyMessage(Integer errcode) {
+        if (errcode == null) {
+            return "微信接口调用失败";
+        }
+        
+        switch (errcode) {
+            case 40001:
+                return "微信access_token无效或已过期";
+            case 40002:
+                return "微信access_token为空";
+            case 40013:
+                return "微信小程序AppID无效";
+            case 40165:
+                return "微信小程序页面路径不存在";
+            case 45009:
+                return "微信小程序接口调用频率超限,请稍后重试";
+            case 47003:
+                return "微信小程序模板消息参数错误";
+            case 50002:
+                return "该小程序已被封禁或暂停服务";
+            case 50003:
+                return "微信小程序未发布,无法生成链接";
+            case 85079:
+                return "微信小程序程序代码已发布,不能重新发布";
+            case 85301:
+                return "微信小程序审核未通过";
+            case 89449:
+                return "微信小程序流量主开通失败";
+            default:
+                return "微信接口调用失败";
+        }
+    }
+
+    /**
+     * 处理WxErrorException异常
+     * 
+     * @param e WxErrorException异常
+     * @param defaultMessage 默认错误信息
+     * @return 格式化后的错误信息(错误码|错误信息)
+     */
+    public static String handleWxErrorException(WxErrorException e, String defaultMessage) {
+        log.error("微信API调用异常", e);
+        
+        // WxErrorException 包含微信返回的错误信息
+        Integer errcode = e.getError().getErrorCode();
+        String errmsg = e.getError().getErrorMsg();
+        
+        // 如果有微信错误码,使用微信的错误处理逻辑
+        if (errcode != null) {
+            String friendlyMsg = getFriendlyMessage(errcode);
+            log.error("微信返回错误,错误码:{},原始信息:{},友好提示:{}", errcode, errmsg, friendlyMsg);
+            return formatError(errcode, friendlyMsg);
+        }
+        
+        // 否则返回默认错误
+        return formatError(-2, defaultMessage);
+    }
+
+    /**
+     * 解析错误信息,返回包含错误码和错误信息的Map
+     * 
+     * @param errorMsg 错误信息(格式:错误码|错误信息)
+     * @return Map包含errcode和msg,如果格式不正确返回null
+     */
+    public static Map<String, Object> parseError(String errorMsg) {
+        if (errorMsg == null || !errorMsg.contains("|")) {
+            return null;
+        }
+        
+        String[] parts = errorMsg.split("\\|", 2);
+        if (parts.length != 2) {
+            return null;
+        }
+        
+        try {
+            Integer errcode = Integer.parseInt(parts[0]);
+            Map<String, Object> result = new HashMap<>();
+            result.put("errcode", errcode);
+            result.put("msg", parts[1]);
+            return result;
+        } catch (NumberFormatException e) {
+            return null;
+        }
+    }
+
+    /**
+     * 系统错误码定义
+     */
+    public static class SystemErrorCode {
+        /** 响应格式异常 */
+        public static final int RESPONSE_FORMAT_ERROR = -1;
+        /** access_token获取失败 */
+        public static final int ACCESS_TOKEN_ERROR = -2;
+        /** 网络请求失败 */
+        public static final int NETWORK_REQUEST_ERROR = -3;
+        /** 网络连接失败 */
+        public static final int NETWORK_CONNECTION_ERROR = -4;
+    }
+}