From 04e2ade66915ddf2f2a6152ffa990db426142a85 Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Fri, 13 Jun 2025 14:26:05 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=94=81=E9=81=BF=E5=85=8D?= =?UTF-8?q?=E9=AB=98=E5=B9=B6=E5=8F=91=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/ycwl/basic/utils/WxMpUtil.java | 35 +++++++++++-------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/ycwl/basic/utils/WxMpUtil.java b/src/main/java/com/ycwl/basic/utils/WxMpUtil.java index 703a1cb..4dd7f94 100644 --- a/src/main/java/com/ycwl/basic/utils/WxMpUtil.java +++ b/src/main/java/com/ycwl/basic/utils/WxMpUtil.java @@ -8,6 +8,7 @@ import java.io.InputStream; import java.util.Date; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.locks.ReentrantLock; public class WxMpUtil { private static final String GET_WXA_CODE_URL = "https://api.weixin.qq.com/wxa/getwxacode?access_token=%s"; @@ -16,25 +17,31 @@ public class WxMpUtil { public static final String GET_USER_PHONE_URL = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=%s"; private static final Map tokens = new ConcurrentHashMap<>(); private static final Map expireTimes = new ConcurrentHashMap<>(); + private static final ReentrantLock lock = new ReentrantLock(); private static String getAccessToken(String appId, String appSecret) { - if (expireTimes.containsKey(appId)) { - Date expireTime = expireTimes.get(appId); - if (expireTime.getTime() < System.currentTimeMillis()) { + lock.lock(); + try { + if (expireTimes.containsKey(appId)) { + Date expireTime = expireTimes.get(appId); + if (expireTime.getTime() < System.currentTimeMillis()) { + tokens.remove(appId); + } + } else { tokens.remove(appId); } - } else { - tokens.remove(appId); + return tokens.computeIfAbsent(appId, (k) -> { + String url = String.format(ACCESS_TOKEN_URL, appId, appSecret); + String response = HttpUtil.get(url); + JSONObject jsonObject = JSONObject.parseObject(response); + String token = jsonObject.getString("access_token"); + Date expireTime = new Date(System.currentTimeMillis() + jsonObject.getInteger("expires_in") * 1000 / 2); + expireTimes.put(appId, expireTime); + return token; + }); + } finally { + lock.unlock(); } - return tokens.computeIfAbsent(appId, (k) -> { - String url = String.format(ACCESS_TOKEN_URL, appId, appSecret); - String response = HttpUtil.get(url); - JSONObject jsonObject = JSONObject.parseObject(response); - String token = jsonObject.getString("access_token"); - Date expireTime = new Date(System.currentTimeMillis() + jsonObject.getInteger("expires_in") * 1000 / 2); - expireTimes.put(appId, expireTime); - return token; - }); } public static void generateWXAQRCode(String appId, String appSecret, String envVersion, String path, String filePath) throws Exception {