🎨 #2115 优化公众号、小程序、企业微信的access token自动刷新逻辑,避免循环递归调用

This commit is contained in:
hywr
2021-05-20 14:23:26 +08:00
committed by GitHub
parent dfb02eac38
commit 62a3931aee
8 changed files with 200 additions and 28 deletions

View File

@@ -207,7 +207,7 @@ public abstract class BaseWxMaServiceImpl<H, P> implements WxMaService, RequestH
int retryTimes = 0;
do {
try {
return this.executeInternal(executor, uri, data);
return this.executeInternal(executor, uri, data, false);
} catch (WxErrorException e) {
if (retryTimes + 1 > this.maxRetryTimes) {
log.warn("重试达到最大次数【{}】", maxRetryTimes);
@@ -238,7 +238,7 @@ public abstract class BaseWxMaServiceImpl<H, P> implements WxMaService, RequestH
throw new WxRuntimeException("微信服务端异常,超出重试次数");
}
private <T, E> T executeInternal(RequestExecutor<T, E> executor, String uri, E data) throws WxErrorException {
private <T, E> T executeInternal(RequestExecutor<T, E> executor, String uri, E data, boolean doNotAutoRefreshToken) throws WxErrorException {
E dataForLog = DataUtils.handleDataWithSecret(data);
if (uri.contains("access_token=")) {
@@ -271,9 +271,11 @@ public abstract class BaseWxMaServiceImpl<H, P> implements WxMaService, RequestH
} finally {
lock.unlock();
}
if (this.getWxMaConfig().autoRefreshToken()) {
if (this.getWxMaConfig().autoRefreshToken() && !doNotAutoRefreshToken) {
log.warn("即将重新获取新的access_token错误代码{},错误信息:{}", error.getErrorCode(), error.getErrorMsg());
return this.execute(executor, uri, data);
//下一次不再自动重试
//当小程序误调用第三方平台专属接口时,第三方无法使用小程序的access token,如果可以继续自动获取token会导致无限循环重试,直到栈溢出
return this.executeInternal(executor, uri, data, true);
}
}