From d752c48dc8a005988bed952866bca8558b1f44a3 Mon Sep 17 00:00:00 2001 From: 007gzs <007gzs@gmail.com> Date: Sat, 4 Apr 2020 21:38:59 +0800 Subject: [PATCH] =?UTF-8?q?:art:=20#1488=20=E5=85=AC=E4=BC=97=E5=8F=B7?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E6=94=AF=E6=8C=81=E5=88=86=E5=B8=83=E5=BC=8F?= =?UTF-8?q?=E9=94=81=EF=BC=8C=E8=AE=BE=E7=BD=AEtoken=E8=BF=87=E6=9C=9F?= =?UTF-8?q?=E6=97=B6=E5=8A=A0=E9=94=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wx/miniapp/api/impl/WxMaServiceImpl.java | 12 ++++++++- .../mp/api/impl/BaseWxMpServiceImpl.java | 12 ++++++++- .../mp/config/impl/WxMpRedisConfigImpl.java | 11 ++++++++ .../api/impl/WxOpenComponentServiceImpl.java | 25 +++++++++++++++++-- 4 files changed, 56 insertions(+), 4 deletions(-) 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); }