|
|
@@ -89,7 +89,7 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
|
@Override |
|
|
|
public boolean checkSignature(String timestamp, String nonce, String signature) { |
|
|
|
try { |
|
|
|
return SHA1.gen(wxMpConfigStorage.getToken(), timestamp, nonce).equals(signature); |
|
|
|
return SHA1.gen(this.wxMpConfigStorage.getToken(), timestamp, nonce).equals(signature); |
|
|
|
} catch (Exception e) { |
|
|
|
return false; |
|
|
|
} |
|
|
@@ -103,19 +103,19 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
|
@Override |
|
|
|
public String getAccessToken(boolean forceRefresh) throws WxErrorException { |
|
|
|
if (forceRefresh) { |
|
|
|
wxMpConfigStorage.expireAccessToken(); |
|
|
|
this.wxMpConfigStorage.expireAccessToken(); |
|
|
|
} |
|
|
|
if (wxMpConfigStorage.isAccessTokenExpired()) { |
|
|
|
synchronized (globalAccessTokenRefreshLock) { |
|
|
|
if (wxMpConfigStorage.isAccessTokenExpired()) { |
|
|
|
if (this.wxMpConfigStorage.isAccessTokenExpired()) { |
|
|
|
synchronized (this.globalAccessTokenRefreshLock) { |
|
|
|
if (this.wxMpConfigStorage.isAccessTokenExpired()) { |
|
|
|
String url = new StringBuffer() |
|
|
|
.append("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential") |
|
|
|
.append("&appid=").append(wxMpConfigStorage.getAppId()) |
|
|
|
.append("&secret=").append(wxMpConfigStorage.getSecret()).toString(); |
|
|
|
.append("&appid=").append(this.wxMpConfigStorage.getAppId()) |
|
|
|
.append("&secret=").append(this.wxMpConfigStorage.getSecret()).toString(); |
|
|
|
try { |
|
|
|
HttpGet httpGet = new HttpGet(url); |
|
|
|
if (httpProxy != null) { |
|
|
|
RequestConfig config = RequestConfig.custom().setProxy(httpProxy).build(); |
|
|
|
if (this.httpProxy != null) { |
|
|
|
RequestConfig config = RequestConfig.custom().setProxy(this.httpProxy).build(); |
|
|
|
httpGet.setConfig(config); |
|
|
|
} |
|
|
|
try (CloseableHttpResponse response = getHttpclient().execute(httpGet)) { |
|
|
@@ -125,7 +125,7 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
|
throw new WxErrorException(error); |
|
|
|
} |
|
|
|
WxAccessToken accessToken = WxAccessToken.fromJson(resultContent); |
|
|
|
wxMpConfigStorage.updateAccessToken(accessToken.getAccessToken(), accessToken.getExpiresIn()); |
|
|
|
this.wxMpConfigStorage.updateAccessToken(accessToken.getAccessToken(), accessToken.getExpiresIn()); |
|
|
|
}finally { |
|
|
|
httpGet.releaseConnection(); |
|
|
|
} |
|
|
@@ -137,7 +137,7 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
return wxMpConfigStorage.getAccessToken(); |
|
|
|
return this.wxMpConfigStorage.getAccessToken(); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
@@ -148,22 +148,22 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
|
@Override |
|
|
|
public String getJsapiTicket(boolean forceRefresh) throws WxErrorException { |
|
|
|
if (forceRefresh) { |
|
|
|
wxMpConfigStorage.expireJsapiTicket(); |
|
|
|
this.wxMpConfigStorage.expireJsapiTicket(); |
|
|
|
} |
|
|
|
if (wxMpConfigStorage.isJsapiTicketExpired()) { |
|
|
|
synchronized (globalJsapiTicketRefreshLock) { |
|
|
|
if (wxMpConfigStorage.isJsapiTicketExpired()) { |
|
|
|
if (this.wxMpConfigStorage.isJsapiTicketExpired()) { |
|
|
|
synchronized (this.globalJsapiTicketRefreshLock) { |
|
|
|
if (this.wxMpConfigStorage.isJsapiTicketExpired()) { |
|
|
|
String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi"; |
|
|
|
String responseContent = execute(new SimpleGetRequestExecutor(), url, null); |
|
|
|
JsonElement tmpJsonElement = Streams.parse(new JsonReader(new StringReader(responseContent))); |
|
|
|
JsonObject tmpJsonObject = tmpJsonElement.getAsJsonObject(); |
|
|
|
String jsapiTicket = tmpJsonObject.get("ticket").getAsString(); |
|
|
|
int expiresInSeconds = tmpJsonObject.get("expires_in").getAsInt(); |
|
|
|
wxMpConfigStorage.updateJsapiTicket(jsapiTicket, expiresInSeconds); |
|
|
|
this.wxMpConfigStorage.updateJsapiTicket(jsapiTicket, expiresInSeconds); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
return wxMpConfigStorage.getJsapiTicket(); |
|
|
|
return this.wxMpConfigStorage.getJsapiTicket(); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
@@ -179,7 +179,7 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
|
"url=" + url |
|
|
|
); |
|
|
|
WxJsapiSignature jsapiSignature = new WxJsapiSignature(); |
|
|
|
jsapiSignature.setAppid(wxMpConfigStorage.getAppId()); |
|
|
|
jsapiSignature.setAppid(this.wxMpConfigStorage.getAppId()); |
|
|
|
jsapiSignature.setTimestamp(timestamp); |
|
|
|
jsapiSignature.setNoncestr(noncestr); |
|
|
|
jsapiSignature.setUrl(url); |
|
|
@@ -263,7 +263,7 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
|
@Override |
|
|
|
public File mediaDownload(String media_id) throws WxErrorException { |
|
|
|
String url = "http://file.api.weixin.qq.com/cgi-bin/media/get"; |
|
|
|
return execute(new MediaDownloadRequestExecutor(wxMpConfigStorage.getTmpDirFile()), url, "media_id=" + media_id); |
|
|
|
return execute(new MediaDownloadRequestExecutor(this.wxMpConfigStorage.getTmpDirFile()), url, "media_id=" + media_id); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
@@ -285,7 +285,7 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
|
@Override |
|
|
|
public InputStream materialImageOrVoiceDownload(String media_id) throws WxErrorException { |
|
|
|
String url = "https://api.weixin.qq.com/cgi-bin/material/get_material"; |
|
|
|
return execute(new MaterialVoiceAndImageDownloadRequestExecutor(wxMpConfigStorage.getTmpDirFile()), url, media_id); |
|
|
|
return execute(new MaterialVoiceAndImageDownloadRequestExecutor(this.wxMpConfigStorage.getTmpDirFile()), url, media_id); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
@@ -562,14 +562,14 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
|
|
|
|
|
@Override |
|
|
|
public String oauth2buildAuthorizationUrl(String scope, String state) { |
|
|
|
return this.oauth2buildAuthorizationUrl(wxMpConfigStorage.getOauth2redirectUri(), scope, state); |
|
|
|
return this.oauth2buildAuthorizationUrl(this.wxMpConfigStorage.getOauth2redirectUri(), scope, state); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public String oauth2buildAuthorizationUrl(String redirectURI, String scope, String state) { |
|
|
|
StringBuffer url = new StringBuffer(); |
|
|
|
url.append("https://open.weixin.qq.com/connect/oauth2/authorize?"); |
|
|
|
url.append("appid=").append(wxMpConfigStorage.getAppId()); |
|
|
|
url.append("appid=").append(this.wxMpConfigStorage.getAppId()); |
|
|
|
url.append("&redirect_uri=").append(URIUtil.encodeURIComponent(redirectURI)); |
|
|
|
url.append("&response_type=code"); |
|
|
|
url.append("&scope=").append(scope); |
|
|
@@ -584,14 +584,14 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
|
public WxMpOAuth2AccessToken oauth2getAccessToken(String code) throws WxErrorException { |
|
|
|
StringBuffer url = new StringBuffer(); |
|
|
|
url.append("https://api.weixin.qq.com/sns/oauth2/access_token?"); |
|
|
|
url.append("appid=").append(wxMpConfigStorage.getAppId()); |
|
|
|
url.append("&secret=").append(wxMpConfigStorage.getSecret()); |
|
|
|
url.append("appid=").append(this.wxMpConfigStorage.getAppId()); |
|
|
|
url.append("&secret=").append(this.wxMpConfigStorage.getSecret()); |
|
|
|
url.append("&code=").append(code); |
|
|
|
url.append("&grant_type=authorization_code"); |
|
|
|
|
|
|
|
try { |
|
|
|
RequestExecutor<String, String> executor = new SimpleGetRequestExecutor(); |
|
|
|
String responseText = executor.execute(getHttpclient(), httpProxy, url.toString(), null); |
|
|
|
String responseText = executor.execute(getHttpclient(), this.httpProxy, url.toString(), null); |
|
|
|
return WxMpOAuth2AccessToken.fromJson(responseText); |
|
|
|
} catch (ClientProtocolException e) { |
|
|
|
throw new RuntimeException(e); |
|
|
@@ -604,13 +604,13 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
|
public WxMpOAuth2AccessToken oauth2refreshAccessToken(String refreshToken) throws WxErrorException { |
|
|
|
StringBuffer url = new StringBuffer(); |
|
|
|
url.append("https://api.weixin.qq.com/sns/oauth2/refresh_token?"); |
|
|
|
url.append("appid=").append(wxMpConfigStorage.getAppId()); |
|
|
|
url.append("appid=").append(this.wxMpConfigStorage.getAppId()); |
|
|
|
url.append("&grant_type=refresh_token"); |
|
|
|
url.append("&refresh_token=").append(refreshToken); |
|
|
|
|
|
|
|
try { |
|
|
|
RequestExecutor<String, String> executor = new SimpleGetRequestExecutor(); |
|
|
|
String responseText = executor.execute(getHttpclient(), httpProxy, url.toString(), null); |
|
|
|
String responseText = executor.execute(getHttpclient(), this.httpProxy, url.toString(), null); |
|
|
|
return WxMpOAuth2AccessToken.fromJson(responseText); |
|
|
|
} catch (ClientProtocolException e) { |
|
|
|
throw new RuntimeException(e); |
|
|
@@ -633,7 +633,7 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
|
|
|
|
|
try { |
|
|
|
RequestExecutor<String, String> executor = new SimpleGetRequestExecutor(); |
|
|
|
String responseText = executor.execute(getHttpclient(), httpProxy, url.toString(), null); |
|
|
|
String responseText = executor.execute(getHttpclient(), this.httpProxy, url.toString(), null); |
|
|
|
return WxMpUser.fromJson(responseText); |
|
|
|
} catch (ClientProtocolException e) { |
|
|
|
throw new RuntimeException(e); |
|
|
@@ -651,7 +651,7 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
|
|
|
|
|
try { |
|
|
|
RequestExecutor<String, String> executor = new SimpleGetRequestExecutor(); |
|
|
|
executor.execute(getHttpclient(), httpProxy, url.toString(), null); |
|
|
|
executor.execute(getHttpclient(), this.httpProxy, url.toString(), null); |
|
|
|
} catch (ClientProtocolException e) { |
|
|
|
throw new RuntimeException(e); |
|
|
|
} catch (IOException e) { |
|
|
@@ -733,9 +733,9 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
|
* -1 系统繁忙, 1000ms后重试 |
|
|
|
*/ |
|
|
|
if (error.getErrorCode() == -1) { |
|
|
|
int sleepMillis = retrySleepMillis * (1 << retryTimes); |
|
|
|
int sleepMillis = this.retrySleepMillis * (1 << retryTimes); |
|
|
|
try { |
|
|
|
log.debug("微信系统繁忙,{}ms 后重试(第{}次)", sleepMillis, retryTimes + 1); |
|
|
|
this.log.debug("微信系统繁忙,{}ms 后重试(第{}次)", sleepMillis, retryTimes + 1); |
|
|
|
Thread.sleep(sleepMillis); |
|
|
|
} catch (InterruptedException e1) { |
|
|
|
throw new RuntimeException(e1); |
|
|
@@ -744,7 +744,7 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
|
throw e; |
|
|
|
} |
|
|
|
} |
|
|
|
} while (++retryTimes < maxRetryTimes); |
|
|
|
} while (++retryTimes < this.maxRetryTimes); |
|
|
|
|
|
|
|
throw new RuntimeException("微信服务端异常,超出重试次数"); |
|
|
|
} |
|
|
@@ -759,7 +759,7 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
|
uriWithAccessToken += uri.indexOf('?') == -1 ? "?access_token=" + accessToken : "&access_token=" + accessToken; |
|
|
|
|
|
|
|
try { |
|
|
|
return executor.execute(getHttpclient(), httpProxy, uriWithAccessToken, data); |
|
|
|
return executor.execute(getHttpclient(), this.httpProxy, uriWithAccessToken, data); |
|
|
|
} catch (WxErrorException e) { |
|
|
|
WxError error = e.getError(); |
|
|
|
/* |
|
|
@@ -769,7 +769,7 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
|
*/ |
|
|
|
if (error.getErrorCode() == 42001 || error.getErrorCode() == 40001) { |
|
|
|
// 强制设置wxMpConfigStorage它的access token过期了,这样在下一次请求里就会刷新access token |
|
|
|
wxMpConfigStorage.expireAccessToken(); |
|
|
|
this.wxMpConfigStorage.expireAccessToken(); |
|
|
|
return execute(executor, uri, data); |
|
|
|
} |
|
|
|
if (error.getErrorCode() != 0) { |
|
|
@@ -784,21 +784,21 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
|
} |
|
|
|
|
|
|
|
protected CloseableHttpClient getHttpclient() { |
|
|
|
return httpClient; |
|
|
|
return this.httpClient; |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void setWxMpConfigStorage(WxMpConfigStorage wxConfigProvider) { |
|
|
|
this.wxMpConfigStorage = wxConfigProvider; |
|
|
|
|
|
|
|
ApacheHttpClientBuilder apacheHttpClientBuilder = wxMpConfigStorage.getApacheHttpClientBuilder(); |
|
|
|
ApacheHttpClientBuilder apacheHttpClientBuilder = this.wxMpConfigStorage.getApacheHttpClientBuilder(); |
|
|
|
if (null == apacheHttpClientBuilder) { |
|
|
|
apacheHttpClientBuilder = DefaultApacheHttpHttpClientBuilder.get(); |
|
|
|
} |
|
|
|
apacheHttpClientBuilder.httpProxyHost(wxMpConfigStorage.getHttp_proxy_host()) |
|
|
|
.httpProxyPort(wxMpConfigStorage.getHttp_proxy_port()) |
|
|
|
.httpProxyUsername(wxMpConfigStorage.getHttp_proxy_username()) |
|
|
|
.httpProxyPassword(wxMpConfigStorage.getHttp_proxy_password()); |
|
|
|
apacheHttpClientBuilder.httpProxyHost(this.wxMpConfigStorage.getHttp_proxy_host()) |
|
|
|
.httpProxyPort(this.wxMpConfigStorage.getHttp_proxy_port()) |
|
|
|
.httpProxyUsername(this.wxMpConfigStorage.getHttp_proxy_username()) |
|
|
|
.httpProxyPassword(this.wxMpConfigStorage.getHttp_proxy_password()); |
|
|
|
|
|
|
|
if (wxConfigProvider.getSSLContext() != null){ |
|
|
|
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory( |
|
|
@@ -809,7 +809,7 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
|
apacheHttpClientBuilder.sslConnectionSocketFactory(sslsf); |
|
|
|
} |
|
|
|
|
|
|
|
httpClient = apacheHttpClientBuilder.build(); |
|
|
|
this.httpClient = apacheHttpClientBuilder.build(); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
@@ -826,8 +826,8 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
|
@Override |
|
|
|
public WxMpPrepayIdResult getPrepayId(String openId, String outTradeNo, double amt, String body, String tradeType, String ip, String callbackUrl) { |
|
|
|
Map<String, String> packageParams = new HashMap<String, String>(); |
|
|
|
packageParams.put("appid", wxMpConfigStorage.getAppId()); |
|
|
|
packageParams.put("mch_id", wxMpConfigStorage.getPartnerId()); |
|
|
|
packageParams.put("appid", this.wxMpConfigStorage.getAppId()); |
|
|
|
packageParams.put("mch_id", this.wxMpConfigStorage.getPartnerId()); |
|
|
|
packageParams.put("body", body); |
|
|
|
packageParams.put("out_trade_no", outTradeNo); |
|
|
|
packageParams.put("total_fee", (int) (amt * 100) + ""); |
|
|
@@ -844,12 +844,12 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
|
String nonce_str = System.currentTimeMillis() + ""; |
|
|
|
|
|
|
|
final SortedMap<String, String> packageParams = new TreeMap<String, String>(parameters); |
|
|
|
packageParams.put("appid", wxMpConfigStorage.getAppId()); |
|
|
|
packageParams.put("mch_id", wxMpConfigStorage.getPartnerId()); |
|
|
|
packageParams.put("appid", this.wxMpConfigStorage.getAppId()); |
|
|
|
packageParams.put("mch_id", this.wxMpConfigStorage.getPartnerId()); |
|
|
|
packageParams.put("nonce_str", nonce_str); |
|
|
|
checkParameters(packageParams); |
|
|
|
|
|
|
|
String sign = WxCryptUtil.createSign(packageParams, wxMpConfigStorage.getPartnerKey()); |
|
|
|
String sign = WxCryptUtil.createSign(packageParams, this.wxMpConfigStorage.getPartnerKey()); |
|
|
|
packageParams.put("sign", sign); |
|
|
|
|
|
|
|
StringBuilder request = new StringBuilder("<xml>"); |
|
|
@@ -859,8 +859,8 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
|
request.append("</xml>"); |
|
|
|
|
|
|
|
HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/pay/unifiedorder"); |
|
|
|
if (httpProxy != null) { |
|
|
|
RequestConfig config = RequestConfig.custom().setProxy(httpProxy).build(); |
|
|
|
if (this.httpProxy != null) { |
|
|
|
RequestConfig config = RequestConfig.custom().setProxy(this.httpProxy).build(); |
|
|
|
httpPost.setConfig(config); |
|
|
|
} |
|
|
|
|
|
|
@@ -883,7 +883,7 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
|
"trade_type", }; |
|
|
|
|
|
|
|
private void checkParameters(Map<String, String> parameters) { |
|
|
|
for (String para : REQUIRED_ORDER_PARAMETERS) { |
|
|
|
for (String para : this.REQUIRED_ORDER_PARAMETERS) { |
|
|
|
if (!parameters.containsKey(para)) |
|
|
|
throw new IllegalArgumentException("Reqiured argument '" + para + "' is missing."); |
|
|
|
} |
|
|
@@ -896,8 +896,8 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
|
@Override |
|
|
|
public Map<String, String> getJsapiPayInfo(String openId,String outTradeNo, double amt, String body,String ip, String callbackUrl) throws WxErrorException{ |
|
|
|
Map<String, String> packageParams = new HashMap<String, String>(); |
|
|
|
packageParams.put("appid", wxMpConfigStorage.getAppId()); |
|
|
|
packageParams.put("mch_id", wxMpConfigStorage.getPartnerId()); |
|
|
|
packageParams.put("appid", this.wxMpConfigStorage.getAppId()); |
|
|
|
packageParams.put("mch_id", this.wxMpConfigStorage.getPartnerId()); |
|
|
|
packageParams.put("body", body); |
|
|
|
packageParams.put("out_trade_no", outTradeNo); |
|
|
|
packageParams.put("total_fee", (int) (amt * 100) + ""); |
|
|
@@ -912,8 +912,8 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
|
@Override |
|
|
|
public Map<String, String> getNativePayInfo(String productId,String outTradeNo, double amt, String body,String ip, String callbackUrl) throws WxErrorException{ |
|
|
|
Map<String, String> packageParams = new HashMap<String, String>(); |
|
|
|
packageParams.put("appid", wxMpConfigStorage.getAppId()); |
|
|
|
packageParams.put("mch_id", wxMpConfigStorage.getPartnerId()); |
|
|
|
packageParams.put("appid", this.wxMpConfigStorage.getAppId()); |
|
|
|
packageParams.put("mch_id", this.wxMpConfigStorage.getPartnerId()); |
|
|
|
packageParams.put("body", body); |
|
|
|
packageParams.put("out_trade_no", outTradeNo); |
|
|
|
packageParams.put("total_fee", (int) (amt * 100) + ""); |
|
|
@@ -947,7 +947,7 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
|
} |
|
|
|
|
|
|
|
Map<String, String> payInfo = new HashMap<String, String>(); |
|
|
|
payInfo.put("appId", wxMpConfigStorage.getAppId()); |
|
|
|
payInfo.put("appId", this.wxMpConfigStorage.getAppId()); |
|
|
|
// 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符 |
|
|
|
payInfo.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000)); |
|
|
|
payInfo.put("nonceStr", System.currentTimeMillis() + ""); |
|
|
@@ -957,7 +957,7 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
|
payInfo.put("codeUrl", wxMpPrepayIdResult.getCode_url()); |
|
|
|
} |
|
|
|
|
|
|
|
String finalSign = WxCryptUtil.createSign(payInfo, wxMpConfigStorage.getPartnerKey()); |
|
|
|
String finalSign = WxCryptUtil.createSign(payInfo, this.wxMpConfigStorage.getPartnerKey()); |
|
|
|
payInfo.put("paySign", finalSign); |
|
|
|
return payInfo; |
|
|
|
} |
|
|
@@ -967,8 +967,8 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
|
String nonce_str = System.currentTimeMillis() + ""; |
|
|
|
|
|
|
|
SortedMap<String, String> packageParams = new TreeMap<String, String>(); |
|
|
|
packageParams.put("appid", wxMpConfigStorage.getAppId()); |
|
|
|
packageParams.put("mch_id", wxMpConfigStorage.getPartnerId()); |
|
|
|
packageParams.put("appid", this.wxMpConfigStorage.getAppId()); |
|
|
|
packageParams.put("mch_id", this.wxMpConfigStorage.getPartnerId()); |
|
|
|
if (transactionId != null && !"".equals(transactionId.trim())) |
|
|
|
packageParams.put("transaction_id", transactionId); |
|
|
|
else if (outTradeNo != null && !"".equals(outTradeNo.trim())) |
|
|
@@ -976,7 +976,7 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
|
else |
|
|
|
throw new IllegalArgumentException("Either 'transactionId' or 'outTradeNo' must be given."); |
|
|
|
packageParams.put("nonce_str", nonce_str); |
|
|
|
packageParams.put("sign", WxCryptUtil.createSign(packageParams, wxMpConfigStorage.getPartnerKey())); |
|
|
|
packageParams.put("sign", WxCryptUtil.createSign(packageParams, this.wxMpConfigStorage.getPartnerKey())); |
|
|
|
|
|
|
|
StringBuilder request = new StringBuilder("<xml>"); |
|
|
|
for (Entry<String, String> para : packageParams.entrySet()) { |
|
|
@@ -985,14 +985,14 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
|
request.append("</xml>"); |
|
|
|
|
|
|
|
HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/pay/orderquery"); |
|
|
|
if (httpProxy != null) { |
|
|
|
RequestConfig config = RequestConfig.custom().setProxy(httpProxy).build(); |
|
|
|
if (this.httpProxy != null) { |
|
|
|
RequestConfig config = RequestConfig.custom().setProxy(this.httpProxy).build(); |
|
|
|
httpPost.setConfig(config); |
|
|
|
} |
|
|
|
|
|
|
|
StringEntity entity = new StringEntity(request.toString(), Consts.UTF_8); |
|
|
|
httpPost.setEntity(entity); |
|
|
|
try(CloseableHttpResponse response = httpClient.execute(httpPost)) { |
|
|
|
try(CloseableHttpResponse response = this.httpClient.execute(httpPost)) { |
|
|
|
String responseContent = Utf8ResponseHandler.INSTANCE.handleResponse(response); |
|
|
|
XStream xstream = XStreamInitializer.getInstance(); |
|
|
|
xstream.alias("xml", WxMpPayResult.class); |
|
|
@@ -1019,11 +1019,11 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
|
@Override |
|
|
|
public WxMpPayRefundResult refundPay(Map<String, String> parameters) throws WxErrorException { |
|
|
|
SortedMap<String, String> refundParams = new TreeMap<String, String>(parameters); |
|
|
|
refundParams.put("appid", wxMpConfigStorage.getAppId()); |
|
|
|
refundParams.put("mch_id", wxMpConfigStorage.getPartnerId()); |
|
|
|
refundParams.put("appid", this.wxMpConfigStorage.getAppId()); |
|
|
|
refundParams.put("mch_id", this.wxMpConfigStorage.getPartnerId()); |
|
|
|
refundParams.put("nonce_str", System.currentTimeMillis() + ""); |
|
|
|
refundParams.put("op_user_id", wxMpConfigStorage.getPartnerId()); |
|
|
|
String sign = WxCryptUtil.createSign(refundParams, wxMpConfigStorage.getPartnerKey()); |
|
|
|
refundParams.put("op_user_id", this.wxMpConfigStorage.getPartnerId()); |
|
|
|
String sign = WxCryptUtil.createSign(refundParams, this.wxMpConfigStorage.getPartnerKey()); |
|
|
|
refundParams.put("sign", sign); |
|
|
|
|
|
|
|
StringBuilder request = new StringBuilder("<xml>"); |
|
|
@@ -1033,8 +1033,8 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
|
request.append("</xml>"); |
|
|
|
|
|
|
|
HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/secapi/pay/refund"); |
|
|
|
if (httpProxy != null) { |
|
|
|
RequestConfig config = RequestConfig.custom().setProxy(httpProxy).build(); |
|
|
|
if (this.httpProxy != null) { |
|
|
|
RequestConfig config = RequestConfig.custom().setProxy(this.httpProxy).build(); |
|
|
|
httpPost.setConfig(config); |
|
|
|
} |
|
|
|
|
|
|
@@ -1061,7 +1061,7 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
|
|
|
|
|
return wxMpPayRefundResult; |
|
|
|
} catch (IOException e) { |
|
|
|
log.error(MessageFormatter.format("The exception was happened when sending refund '{}'.", request.toString()).getMessage(), e); |
|
|
|
this.log.error(MessageFormatter.format("The exception was happened when sending refund '{}'.", request.toString()).getMessage(), e); |
|
|
|
WxError error = new WxError(); |
|
|
|
error.setErrorCode(-1); |
|
|
|
error.setErrorMsg("incorrect response."); |
|
|
@@ -1073,7 +1073,7 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
|
|
|
|
|
@Override |
|
|
|
public boolean checkJSSDKCallbackDataSignature(Map<String, String> kvm, String signature) { |
|
|
|
return signature.equals(WxCryptUtil.createSign(kvm, wxMpConfigStorage.getPartnerKey())); |
|
|
|
return signature.equals(WxCryptUtil.createSign(kvm, this.wxMpConfigStorage.getPartnerKey())); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
@@ -1081,11 +1081,11 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
|
String nonce_str = System.currentTimeMillis() + ""; |
|
|
|
|
|
|
|
SortedMap<String, String> packageParams = new TreeMap<String, String>(parameters); |
|
|
|
packageParams.put("wxappid", wxMpConfigStorage.getAppId()); |
|
|
|
packageParams.put("mch_id", wxMpConfigStorage.getPartnerId()); |
|
|
|
packageParams.put("wxappid", this.wxMpConfigStorage.getAppId()); |
|
|
|
packageParams.put("mch_id", this.wxMpConfigStorage.getPartnerId()); |
|
|
|
packageParams.put("nonce_str", nonce_str); |
|
|
|
|
|
|
|
String sign = WxCryptUtil.createSign(packageParams, wxMpConfigStorage.getPartnerKey()); |
|
|
|
String sign = WxCryptUtil.createSign(packageParams, this.wxMpConfigStorage.getPartnerKey()); |
|
|
|
packageParams.put("sign", sign); |
|
|
|
|
|
|
|
StringBuilder request = new StringBuilder("<xml>"); |
|
|
@@ -1095,8 +1095,8 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
|
request.append("</xml>"); |
|
|
|
|
|
|
|
HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack"); |
|
|
|
if (httpProxy != null) { |
|
|
|
RequestConfig config = RequestConfig.custom().setProxy(httpProxy).build(); |
|
|
|
if (this.httpProxy != null) { |
|
|
|
RequestConfig config = RequestConfig.custom().setProxy(this.httpProxy).build(); |
|
|
|
httpPost.setConfig(config); |
|
|
|
} |
|
|
|
|
|
|
@@ -1109,7 +1109,7 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
|
WxRedpackResult wxMpRedpackResult = (WxRedpackResult) xstream.fromXML(responseContent); |
|
|
|
return wxMpRedpackResult; |
|
|
|
} catch (IOException e) { |
|
|
|
log.error(MessageFormatter.format("The exception was happened when sending redpack '{}'.", request.toString()).getMessage(), e); |
|
|
|
this.log.error(MessageFormatter.format("The exception was happened when sending redpack '{}'.", request.toString()).getMessage(), e); |
|
|
|
WxError error = new WxError(); |
|
|
|
error.setErrorCode(-1); |
|
|
|
throw new WxErrorException(error); |
|
|
@@ -1147,22 +1147,22 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
|
@Override |
|
|
|
public String getCardApiTicket(boolean forceRefresh) throws WxErrorException { |
|
|
|
if (forceRefresh) { |
|
|
|
wxMpConfigStorage.expireCardApiTicket(); |
|
|
|
this.wxMpConfigStorage.expireCardApiTicket(); |
|
|
|
} |
|
|
|
if (wxMpConfigStorage.isCardApiTicketExpired()) { |
|
|
|
synchronized (globalCardApiTicketRefreshLock) { |
|
|
|
if (wxMpConfigStorage.isCardApiTicketExpired()) { |
|
|
|
if (this.wxMpConfigStorage.isCardApiTicketExpired()) { |
|
|
|
synchronized (this.globalCardApiTicketRefreshLock) { |
|
|
|
if (this.wxMpConfigStorage.isCardApiTicketExpired()) { |
|
|
|
String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=wx_card"; |
|
|
|
String responseContent = execute(new SimpleGetRequestExecutor(), url, null); |
|
|
|
JsonElement tmpJsonElement = Streams.parse(new JsonReader(new StringReader(responseContent))); |
|
|
|
JsonObject tmpJsonObject = tmpJsonElement.getAsJsonObject(); |
|
|
|
String cardApiTicket = tmpJsonObject.get("ticket").getAsString(); |
|
|
|
int expiresInSeconds = tmpJsonObject.get("expires_in").getAsInt(); |
|
|
|
wxMpConfigStorage.updateCardApiTicket(cardApiTicket, expiresInSeconds); |
|
|
|
this.wxMpConfigStorage.updateCardApiTicket(cardApiTicket, expiresInSeconds); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
return wxMpConfigStorage.getCardApiTicket(); |
|
|
|
return this.wxMpConfigStorage.getCardApiTicket(); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
@@ -1305,7 +1305,7 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
|
WxMpCardResult cardResult = WxMpGsonBuilder.INSTANCE.create().fromJson(tmpJsonElement, |
|
|
|
new TypeToken<WxMpCardResult>() { }.getType()); |
|
|
|
if (!cardResult.getErrorCode().equals("0")) { |
|
|
|
log.warn("朋友的券mark失败:{}", cardResult.getErrorMsg()); |
|
|
|
this.log.warn("朋友的券mark失败:{}", cardResult.getErrorMsg()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|