From c1147646b9ef1d713a202d7ab8cf3ea8d677f142 Mon Sep 17 00:00:00 2001 From: wlzboy <66905212@qq.com> Date: 星期六, 27 九月 2025 21:56:54 +0800 Subject: [PATCH] fix:优化评价 --- ruoyi-common/src/main/java/com/ruoyi/common/utils/WechatUtils.java | 72 ++++++++++++++++++++++++++++-------- 1 files changed, 56 insertions(+), 16 deletions(-) diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/WechatUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/WechatUtils.java index 5b3e6e8..53ff3a3 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/WechatUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/WechatUtils.java @@ -4,7 +4,7 @@ import com.alibaba.fastjson2.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.web.client.RestTemplate; +import com.ruoyi.common.utils.http.HttpUtils; import java.util.HashMap; import java.util.Map; @@ -18,7 +18,8 @@ private static final Logger log = LoggerFactory.getLogger(WechatUtils.class); - private static final String WECHAT_API_BASE_URL = "https://api.weixin.qq.com"; + private static final String WECHAT_API_BASE_URL = "https://open.weixin.qq.com"; + private static final String WECHAT_API_BASE_URL_SERVER = "https://api.weixin.qq.com"; /** * 鑾峰彇寰俊Access Token @@ -29,10 +30,10 @@ */ public static String getAccessToken(String appId, String appSecret) { try { - String url = WECHAT_API_BASE_URL + "/cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret=" + appSecret; + String url = WECHAT_API_BASE_URL_SERVER + "/cgi-bin/token"; + String param = "grant_type=client_credential&appid=" + appId + "&secret=" + appSecret; - RestTemplate restTemplate = new RestTemplate(); - String response = restTemplate.getForObject(url, String.class); + String response = HttpUtils.sendGet(url, param); JSONObject jsonObject = JSON.parseObject(response); if (jsonObject.containsKey("access_token")) { @@ -56,10 +57,10 @@ */ public static JSONObject getWechatUserInfo(String accessToken, String openid) { try { - String url = WECHAT_API_BASE_URL + "/cgi-bin/user/info?access_token=" + accessToken + "&openid=" + openid + "&lang=zh_CN"; + String url = WECHAT_API_BASE_URL_SERVER + "/cgi-bin/user/info"; + String param = "access_token=" + accessToken + "&openid=" + openid + "&lang=zh_CN"; - RestTemplate restTemplate = new RestTemplate(); - String response = restTemplate.getForObject(url, String.class); + String response = HttpUtils.sendGet(url, param); JSONObject jsonObject = JSON.parseObject(response); if (jsonObject.containsKey("openid")) { @@ -84,10 +85,10 @@ */ public static JSONObject getWebAccessToken(String appId, String appSecret, String code) { try { - String url = WECHAT_API_BASE_URL + "/sns/oauth2/access_token?appid=" + appId + "&secret=" + appSecret + "&code=" + code + "&grant_type=authorization_code"; + String url = WECHAT_API_BASE_URL_SERVER + "/sns/oauth2/access_token"; + String param = "appid=" + appId + "&secret=" + appSecret + "&code=" + code + "&grant_type=authorization_code"; - RestTemplate restTemplate = new RestTemplate(); - String response = restTemplate.getForObject(url, String.class); + String response = HttpUtils.sendGet(url, param); JSONObject jsonObject = JSON.parseObject(response); if (jsonObject.containsKey("access_token")) { @@ -111,10 +112,10 @@ */ public static JSONObject getWebUserInfo(String accessToken, String openid) { try { - String url = WECHAT_API_BASE_URL + "/sns/userinfo?access_token=" + accessToken + "&openid=" + openid + "&lang=zh_CN"; + String url = WECHAT_API_BASE_URL_SERVER + "/sns/userinfo"; + String param = "access_token=" + accessToken + "&openid=" + openid + "&lang=zh_CN"; - RestTemplate restTemplate = new RestTemplate(); - String response = restTemplate.getForObject(url, String.class); + String response = HttpUtils.sendGet(url, param); JSONObject jsonObject = JSON.parseObject(response); if (jsonObject.containsKey("openid")) { @@ -140,8 +141,16 @@ */ public static String generateAuthUrl(String appId, String redirectUri, String scope, String state) { try { - String encodedRedirectUri = java.net.URLEncoder.encode(redirectUri, "UTF-8"); - return WECHAT_API_BASE_URL + "/connect/oauth2/authorize?appid=" + appId + "&redirect_uri=" + encodedRedirectUri + "&response_type=code&scope=" + scope + "&state=" + state + "#wechat_redirect"; + // 娓呯悊鍜岄獙璇乺edirectUri + String cleanRedirectUri = cleanRedirectUri(redirectUri); + + // URL缂栫爜 + String encodedRedirectUri = java.net.URLEncoder.encode(cleanRedirectUri, "UTF-8"); + + return WECHAT_API_BASE_URL + "/connect/oauth2/authorize?appid=" + appId + + "&redirect_uri=" + encodedRedirectUri + + "&response_type=code&scope=" + scope + + "&state=" + state + "#wechat_redirect"; } catch (Exception e) { log.error("鐢熸垚寰俊鎺堟潈URL寮傚父: {}", e.getMessage()); return null; @@ -149,6 +158,37 @@ } /** + * 娓呯悊鍜岄獙璇乺edirectUri + * + * @param redirectUri 鍘熷鍥炶皟鍦板潃 + * @return 娓呯悊鍚庣殑鍥炶皟鍦板潃 + */ + private static String cleanRedirectUri(String redirectUri) { + if (StringUtils.isEmpty(redirectUri)) { + return redirectUri; + } + + try { + // 绉婚櫎绔彛鍙凤紙寰俊鎺堟潈涓嶆敮鎸佺鍙e彿锛� + if (redirectUri.contains(":81") || redirectUri.contains(":8080") || redirectUri.contains(":3000")) { + redirectUri = redirectUri.replaceAll(":(81|8080|3000|8081|8082|8083|8084|8085|8086|8087|8088|8089|8090)", ""); + log.warn("妫�娴嬪埌绔彛鍙凤紝宸茶嚜鍔ㄧЩ闄�: {}", redirectUri); + } + + // 纭繚浣跨敤HTTPS锛堢敓浜х幆澧冿級 + if (redirectUri.startsWith("http://") && !redirectUri.contains("localhost") && !redirectUri.contains("127.0.0.1")) { + redirectUri = redirectUri.replace("http://", "https://"); + log.warn("鐢熶骇鐜寤鸿浣跨敤HTTPS锛屽凡鑷姩杞崲: {}", redirectUri); + } + + return redirectUri; + } catch (Exception e) { + log.error("娓呯悊redirectUri寮傚父: {}", e.getMessage()); + return redirectUri; + } + } + + /** * 鍒ゆ柇鏄惁涓哄井淇℃祻瑙堝櫒 * * @param userAgent 鐢ㄦ埛浠g悊瀛楃涓� -- Gitblit v1.9.1