From 516abaec396a4f894412573df4034d3136e1eeec Mon Sep 17 00:00:00 2001 From: momosv Date: Sat, 29 May 2021 20:07:31 +0800 Subject: [PATCH] =?UTF-8?q?WxCpTpRedissonConfigImpl=20=E5=8D=95=E7=8B=AC?= =?UTF-8?q?=E9=85=8D=E7=BD=AEprovider=E7=9A=84redis=20key,=E5=BC=80?= =?UTF-8?q?=E6=94=BEkeyPrefix=20=E5=8F=AF=E4=BB=A5=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=EF=BC=9B=20BaseWxCpTpServiceImpl=20=E5=A2=9E=E5=8A=A0post?= =?UTF-8?q?=E5=A4=9A=E6=80=81=E6=96=B9=E6=B3=95=E9=80=82=E5=BA=94=E8=8E=B7?= =?UTF-8?q?=E5=8F=96providerAccessToken=E5=8F=AF=E4=BB=A5=E4=B8=8D?= =?UTF-8?q?=E9=9C=80=E8=A6=81suiteAccessToken=E7=9A=84=E6=83=85=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/impl/WxCpTpRedissonConfigImpl.java | 43 +++++++++++++++---- .../service/impl/BaseWxCpTpServiceImpl.java | 26 ++++++++--- 2 files changed, 55 insertions(+), 14 deletions(-) diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/impl/WxCpTpRedissonConfigImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/impl/WxCpTpRedissonConfigImpl.java index 28997827b1..a33e2d69f0 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/impl/WxCpTpRedissonConfigImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/impl/WxCpTpRedissonConfigImpl.java @@ -26,7 +26,8 @@ public class WxCpTpRedissonConfigImpl implements WxCpTpConfigStorage, Serializab private final WxRedisOps wxRedisOps; //redis里面key的统一前缀 - private final String keyPrefix = ""; + //private final String keyPrefix = "";//4.0.9.B 有final为不可设置,去掉final改为可设置 + private String keyPrefix = ""; private final String suiteAccessTokenKey = ":suiteAccessTokenKey:"; @@ -298,23 +299,23 @@ public void updateAuthSuiteJsApiTicket(String authCorpId, String jsApiTicket, in @Override public boolean isProviderTokenExpired() { //remain time to live in seconds, or key not exist - return wxRedisOps.getExpire(keyWithPrefix(providerTokenKey)) == 0L || wxRedisOps.getExpire(keyWithPrefix(providerTokenKey)) == -2; + return wxRedisOps.getExpire(providerKeyWithPrefix(providerTokenKey)) == 0L || wxRedisOps.getExpire(providerKeyWithPrefix(providerTokenKey)) == -2; } @Override public void updateProviderToken(String providerToken, int expiredInSeconds) { - wxRedisOps.setValue(keyWithPrefix(providerTokenKey), providerToken, expiredInSeconds, TimeUnit.SECONDS); + wxRedisOps.setValue(providerKeyWithPrefix(providerTokenKey), providerToken, expiredInSeconds, TimeUnit.SECONDS); } @Override public String getProviderToken() { - return wxRedisOps.getValue(keyWithPrefix(providerTokenKey)); + return wxRedisOps.getValue(providerKeyWithPrefix(providerTokenKey)); } @Override public WxCpProviderToken getProviderTokenEntity() { - String providerToken = wxRedisOps.getValue(keyWithPrefix(providerTokenKey)); - Long expire = wxRedisOps.getExpire(keyWithPrefix(providerTokenKey)); + String providerToken = wxRedisOps.getValue(providerKeyWithPrefix(providerTokenKey)); + Long expire = wxRedisOps.getExpire(providerKeyWithPrefix(providerTokenKey)); if (StringUtils.isBlank(providerToken) || expire == null || expire == 0 || expire == -2) { return new WxCpProviderToken(); @@ -328,7 +329,7 @@ public WxCpProviderToken getProviderTokenEntity() { @Override public void expireProviderToken() { - wxRedisOps.expire(keyWithPrefix(providerTokenKey), 0, TimeUnit.SECONDS); + wxRedisOps.expire(providerKeyWithPrefix(providerTokenKey), 0, TimeUnit.SECONDS); } /** @@ -361,7 +362,7 @@ public File getTmpDirFile() { @Override public Lock getProviderAccessTokenLock() { - return getLockByKey(String.join(":", this.corpId, LOCKER_PROVIDER_ACCESS_TOKEN)); + return getProviderLockByKey(String.join(":", this.corpId, LOCKER_PROVIDER_ACCESS_TOKEN)); } @Override @@ -390,6 +391,15 @@ private Lock getLockByKey(String key) { return this.wxRedisOps.getLock(String.join(":", keyWithPrefix(LOCK_KEY + this.suiteId), key)); } + /** + * 单独处理provider,且不应和suite 有关系 + * @param key + * @return + */ + private Lock getProviderLockByKey(String key) { + return this.wxRedisOps.getLock(String.join(":", providerKeyWithPrefix(LOCK_KEY), key)); + } + @Override public ApacheHttpClientBuilder getApacheHttpClientBuilder() { return this.apacheHttpClientBuilder; @@ -406,7 +416,22 @@ public String toString() { return WxCpGsonBuilder.create().toJson(this); } + /** + * 一个provider 会有多个suite,需要唯一标识作为前缀 + * @param key + * @return + */ private String keyWithPrefix(String key) { - return keyPrefix + key; + return keyPrefix +":"+suiteId+":" + key; + } + + /** + * provider 应该独享一个key,且不和任何suite关联 + * 一个provider 会有多个suite,不同的suite 都应该指向同一个provider 的数据 + * @param key + * @return + */ + private String providerKeyWithPrefix(String key) { + return keyPrefix +":"+corpId+":" + key; } } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/service/impl/BaseWxCpTpServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/service/impl/BaseWxCpTpServiceImpl.java index 9811eca182..f681679b90 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/service/impl/BaseWxCpTpServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/service/impl/BaseWxCpTpServiceImpl.java @@ -305,7 +305,11 @@ public String get(String url, String queryParam) throws WxErrorException { @Override public String post(String url, String postData) throws WxErrorException { - return execute(SimplePostRequestExecutor.create(this), url, postData); + return execute(SimplePostRequestExecutor.create(this), url, postData,false); + } + + public String post(String url, String postData,boolean withoutSuiteAccessToken) throws WxErrorException { + return execute(SimplePostRequestExecutor.create(this), url, postData,withoutSuiteAccessToken); } /** @@ -313,10 +317,13 @@ public String post(String url, String postData) throws WxErrorException { */ @Override public T execute(RequestExecutor executor, String uri, E data) throws WxErrorException { + return execute(executor, uri, data,false); + } + public T execute(RequestExecutor executor, String uri, E data,boolean withoutSuiteAccessToken) throws WxErrorException { int retryTimes = 0; do { try { - return this.executeInternal(executor, uri, data); + return this.executeInternal(executor, uri, data,withoutSuiteAccessToken); } catch (WxErrorException e) { if (retryTimes + 1 > this.maxRetryTimes) { log.warn("重试达到最大次数【{}】", this.maxRetryTimes); @@ -347,14 +354,22 @@ public T execute(RequestExecutor executor, String uri, E data) thro } protected T executeInternal(RequestExecutor executor, String uri, E data) throws WxErrorException { + return executeInternal( executor, uri,data,false); + } + protected T executeInternal(RequestExecutor executor, String uri, E data,boolean withoutSuiteAccessToken) throws WxErrorException { E dataForLog = DataUtils.handleDataWithSecret(data); if (uri.contains("suite_access_token=")) { throw new IllegalArgumentException("uri参数中不允许有suite_access_token: " + uri); } - String suiteAccessToken = getSuiteAccessToken(false); + String uriWithAccessToken; + if(!withoutSuiteAccessToken){ + String suiteAccessToken = getSuiteAccessToken(false); + uriWithAccessToken = uri + (uri.contains("?") ? "&" : "?") + "suite_access_token=" + suiteAccessToken; + }else{ + uriWithAccessToken = uri; + } - String uriWithAccessToken = uri + (uri.contains("?") ? "&" : "?") + "suite_access_token=" + suiteAccessToken; try { T result = executor.execute(uriWithAccessToken, data, WxType.CP); @@ -452,9 +467,10 @@ public String getWxCpProviderToken() throws WxErrorException { JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("corpid", configStorage.getCorpId()); jsonObject.addProperty("provider_secret", configStorage.getProviderSecret()); + //providerAccessToken 的获取不需要suiteAccessToken ,一不必要,二可以提高效率 WxCpProviderToken wxCpProviderToken = WxCpProviderToken.fromJson(this.post(this.configStorage.getApiUrl(GET_PROVIDER_TOKEN) - , jsonObject.toString())); + , jsonObject.toString(),true)); String providerAccessToken = wxCpProviderToken.getProviderAccessToken(); Integer expiresIn = wxCpProviderToken.getExpiresIn();