|
|
|
@@ -1,18 +1,7 @@ |
|
|
|
package me.chanjar.weixin.cp.api.impl; |
|
|
|
|
|
|
|
import java.io.File; |
|
|
|
import java.io.IOException; |
|
|
|
import java.io.InputStream; |
|
|
|
import java.util.List; |
|
|
|
import java.util.UUID; |
|
|
|
|
|
|
|
import org.apache.commons.lang3.StringUtils; |
|
|
|
import org.slf4j.Logger; |
|
|
|
import org.slf4j.LoggerFactory; |
|
|
|
|
|
|
|
import com.google.gson.*; |
|
|
|
import com.google.gson.reflect.TypeToken; |
|
|
|
|
|
|
|
import me.chanjar.weixin.common.bean.WxJsapiSignature; |
|
|
|
import me.chanjar.weixin.common.bean.menu.WxMenu; |
|
|
|
import me.chanjar.weixin.common.bean.result.WxError; |
|
|
|
@@ -33,10 +22,19 @@ import me.chanjar.weixin.cp.bean.WxCpMessage; |
|
|
|
import me.chanjar.weixin.cp.bean.WxCpTag; |
|
|
|
import me.chanjar.weixin.cp.bean.WxCpUser; |
|
|
|
import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; |
|
|
|
import org.apache.commons.lang3.StringUtils; |
|
|
|
import org.slf4j.Logger; |
|
|
|
import org.slf4j.LoggerFactory; |
|
|
|
|
|
|
|
import java.io.File; |
|
|
|
import java.io.IOException; |
|
|
|
import java.io.InputStream; |
|
|
|
import java.util.List; |
|
|
|
import java.util.UUID; |
|
|
|
|
|
|
|
public abstract class AbstractWxCpService<H, P> implements WxCpService, RequestHttp<H, P> { |
|
|
|
public abstract class AbstractWxCpServiceImpl<H, P> implements WxCpService, RequestHttp<H, P> { |
|
|
|
|
|
|
|
protected final Logger log = LoggerFactory.getLogger(AbstractWxCpService.class); |
|
|
|
protected final Logger log = LoggerFactory.getLogger(AbstractWxCpServiceImpl.class); |
|
|
|
|
|
|
|
/** |
|
|
|
* 全局的是否正在刷新access token的锁 |
|
|
|
@@ -493,9 +491,7 @@ public abstract class AbstractWxCpService<H, P> implements WxCpService, RequestH |
|
|
|
int retryTimes = 0; |
|
|
|
do { |
|
|
|
try { |
|
|
|
T result = this.executeInternal(executor, uri, data); |
|
|
|
this.log.debug("\n[URL]: {}\n[PARAMS]: {}\n[RESPONSE]: {}",uri, data, result); |
|
|
|
return result; |
|
|
|
return this.executeInternal(executor, uri, data); |
|
|
|
} catch (WxErrorException e) { |
|
|
|
if (retryTimes + 1 > this.maxRetryTimes) { |
|
|
|
this.log.warn("重试达到最大次数【{}】", this.maxRetryTimes); |
|
|
|
@@ -525,37 +521,39 @@ public abstract class AbstractWxCpService<H, P> implements WxCpService, RequestH |
|
|
|
throw new RuntimeException("微信服务端异常,超出重试次数"); |
|
|
|
} |
|
|
|
|
|
|
|
public synchronized <T, E> T executeInternal(RequestExecutor<T, E> executor, String uri, E data) throws WxErrorException { |
|
|
|
private synchronized <T, E> T executeInternal(RequestExecutor<T, E> executor, String uri, E data) throws WxErrorException { |
|
|
|
if (uri.contains("access_token=")) { |
|
|
|
throw new IllegalArgumentException("uri参数中不允许有access_token: " + uri); |
|
|
|
} |
|
|
|
String accessToken = getAccessToken(false); |
|
|
|
|
|
|
|
String uriWithAccessToken = uri; |
|
|
|
uriWithAccessToken += uri.indexOf('?') == -1 ? "?access_token=" + accessToken : "&access_token=" + accessToken; |
|
|
|
String uriWithAccessToken = uri + (uri.contains("?") ? "&" : "?") + "access_token=" + accessToken; |
|
|
|
|
|
|
|
try { |
|
|
|
return executor.execute(this, uriWithAccessToken, data); |
|
|
|
T result = executor.execute(this, uriWithAccessToken, data); |
|
|
|
this.log.debug("\n[URL]: {}\n[PARAMS]: {}\n[RESPONSE]: {}", uriWithAccessToken, data, result); |
|
|
|
return result; |
|
|
|
} catch (WxErrorException e) { |
|
|
|
WxError error = e.getError(); |
|
|
|
/* |
|
|
|
* 发生以下情况时尝试刷新access_token |
|
|
|
* 40001 获取access_token时AppSecret错误,或者access_token无效 |
|
|
|
* 42001 access_token超时 |
|
|
|
* 40014 不合法的access_token,请开发者认真比对access_token的有效性(如是否过期),或查看是否正在为恰当的公众号调用接口 |
|
|
|
*/ |
|
|
|
if (error.getErrorCode() == 42001 || error.getErrorCode() == 40001) { |
|
|
|
if (error.getErrorCode() == 42001 || error.getErrorCode() == 40001 || error.getErrorCode() == 40014) { |
|
|
|
// 强制设置wxCpConfigStorage它的access token过期了,这样在下一次请求里就会刷新access token |
|
|
|
this.configStorage.expireAccessToken(); |
|
|
|
return execute(executor, uri, data); |
|
|
|
} |
|
|
|
|
|
|
|
if (error.getErrorCode() != 0) { |
|
|
|
this.log.error("\n[URL]: {}\n[PARAMS]: {}\n[RESPONSE]: {}", uri, data, error); |
|
|
|
this.log.error("\n[URL]: {}\n[PARAMS]: {}\n[RESPONSE]: {}", uriWithAccessToken, data, error); |
|
|
|
throw new WxErrorException(error); |
|
|
|
} |
|
|
|
return null; |
|
|
|
} catch (IOException e) { |
|
|
|
this.log.error("\n[URL]: {}\n[PARAMS]: {}\n[EXCEPTION]: {}", uri, data, e.getMessage()); |
|
|
|
this.log.error("\n[URL]: {}\n[PARAMS]: {}\n[EXCEPTION]: {}", uriWithAccessToken, data, e.getMessage()); |
|
|
|
throw new RuntimeException(e); |
|
|
|
} |
|
|
|
} |