diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceImpl.java index 87903ea8..06533243 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceImpl.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceImpl.java @@ -288,7 +288,17 @@ public class WxMaServiceImpl implements WxMaService, RequestHttp implements WxMpService, RequestH */ if (error.getErrorCode() == 42001 || error.getErrorCode() == 40001 || error.getErrorCode() == 40014) { // 强制设置wxMpConfigStorage它的access token过期了,这样在下一次请求里就会刷新access token - this.getWxMpConfigStorage().expireAccessToken(); + Lock lock = this.getWxMpConfigStorage().getAccessTokenLock(); + lock.lock(); + try{ + if(StringUtils.equals(this.getWxMpConfigStorage().getAccessToken(), accessToken)){ + this.getWxMpConfigStorage().expireAccessToken(); + } + } catch (Exception ex){ + this.getWxMpConfigStorage().expireAccessToken(); + } finally { + lock.unlock(); + } if (this.getWxMpConfigStorage().autoRefreshToken()) { return this.execute(executor, uri, data); } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/config/impl/WxMpRedisConfigImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/config/impl/WxMpRedisConfigImpl.java index 4d2d1783..8c61c9b2 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/config/impl/WxMpRedisConfigImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/config/impl/WxMpRedisConfigImpl.java @@ -1,9 +1,13 @@ package me.chanjar.weixin.mp.config.impl; +import me.chanjar.weixin.common.util.locks.JedisDistributedLock; import me.chanjar.weixin.mp.enums.TicketType; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + /** * 基于Redis的微信配置provider. * @@ -17,6 +21,7 @@ import redis.clients.jedis.JedisPool; @SuppressWarnings("hiding") public class WxMpRedisConfigImpl extends WxMpDefaultConfigImpl { private static final String ACCESS_TOKEN_KEY = "wx:access_token:"; + private static final String LOCK_KEY = "wx:lock:"; /** * 使用连接池保证线程安全. @@ -24,6 +29,7 @@ public class WxMpRedisConfigImpl extends WxMpDefaultConfigImpl { private final JedisPool jedisPool; private String accessTokenKey; + private String lockKey; public WxMpRedisConfigImpl(JedisPool jedisPool) { this.jedisPool = jedisPool; @@ -36,6 +42,11 @@ public class WxMpRedisConfigImpl extends WxMpDefaultConfigImpl { public void setAppId(String appId) { super.setAppId(appId); this.accessTokenKey = ACCESS_TOKEN_KEY.concat(appId); + this.lockKey = ACCESS_TOKEN_KEY.concat(appId).concat(":"); + accessTokenLock = new JedisDistributedLock(jedisPool, lockKey.concat("accessTokenLock")); + jsapiTicketLock = new JedisDistributedLock(jedisPool, lockKey.concat("jsapiTicketLock")); + sdkTicketLock = new JedisDistributedLock(jedisPool, lockKey.concat("sdkTicketLock")); + cardApiTicketLock = new JedisDistributedLock(jedisPool, lockKey.concat("cardApiTicketLock")); } private String getTicketRedisKey(TicketType type) { diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java index 4f1fc900..e0035abe 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java @@ -155,7 +155,18 @@ public class WxOpenComponentServiceImpl implements WxOpenComponentService { */ if (error.getErrorCode() == 42001 || error.getErrorCode() == 40001 || error.getErrorCode() == 40014) { // 强制设置wxMpConfigStorage它的access token过期了,这样在下一次请求里就会刷新access token - this.getWxOpenConfigStorage().expireComponentAccessToken(); + Lock lock = this.getWxOpenConfigStorage().getComponentAccessTokenLock(); + lock.lock(); + try { + if (StringUtils.equals(componentAccessToken, this.getWxOpenConfigStorage().getComponentAccessToken()){ + this.getWxOpenConfigStorage().expireComponentAccessToken(); + } + } catch (Exception ex) { + this.getWxOpenConfigStorage().expireComponentAccessToken(); + }finally { + lock.unlock(); + } + if (this.getWxOpenConfigStorage().autoRefreshToken()) { return this.post(uri, postData, accessTokenKey); } @@ -188,7 +199,17 @@ public class WxOpenComponentServiceImpl implements WxOpenComponentService { */ if (error.getErrorCode() == 42001 || error.getErrorCode() == 40001 || error.getErrorCode() == 40014) { // 强制设置wxMpConfigStorage它的access token过期了,这样在下一次请求里就会刷新access token - this.getWxOpenConfigStorage().expireComponentAccessToken(); + Lock lock = this.getWxOpenConfigStorage().getComponentAccessTokenLock(); + lock.lock(); + try { + if (StringUtils.equals(componentAccessToken, this.getWxOpenConfigStorage().getComponentAccessToken()){ + this.getWxOpenConfigStorage().expireComponentAccessToken(); + } + } catch (Exception ex) { + this.getWxOpenConfigStorage().expireComponentAccessToken(); + }finally { + lock.unlock(); + } if (this.getWxOpenConfigStorage().autoRefreshToken()) { return this.get(uri, accessTokenKey); }