@@ -0,0 +1,87 @@ | |||||
package com.github.binarywang.wxpay.bean; | |||||
/** | |||||
* <pre> | |||||
* 微信支付接口请求数据封装对象 | |||||
* Created by Binary Wang on 2017-8-25. | |||||
* </pre> | |||||
* | |||||
* @author <a href="https://github.com/binarywang">Binary Wang</a> | |||||
*/ | |||||
public class WxPayApiData { | |||||
/** | |||||
* 接口请求地址 | |||||
*/ | |||||
private String url; | |||||
/** | |||||
* 请求数据 | |||||
*/ | |||||
private String requestData; | |||||
/** | |||||
* 响应数据 | |||||
*/ | |||||
private String responseData; | |||||
/** | |||||
* 接口请求异常信息 | |||||
*/ | |||||
private String exceptionMsg; | |||||
/** | |||||
* @param url 接口请求地址 | |||||
* @param requestData 请求数据 | |||||
* @param responseData 响应数据 | |||||
* @param exceptionMsg 接口请求异常信息 | |||||
*/ | |||||
public WxPayApiData(String url, String requestData, String responseData, String exceptionMsg) { | |||||
this.url = url; | |||||
this.requestData = requestData; | |||||
this.responseData = responseData; | |||||
this.exceptionMsg = exceptionMsg; | |||||
} | |||||
public String getUrl() { | |||||
return this.url; | |||||
} | |||||
public void setUrl(String url) { | |||||
this.url = url; | |||||
} | |||||
public String getRequestData() { | |||||
return this.requestData; | |||||
} | |||||
public void setRequestData(String requestData) { | |||||
this.requestData = requestData; | |||||
} | |||||
public String getResponseData() { | |||||
return this.responseData; | |||||
} | |||||
public void setResponseData(String responseData) { | |||||
this.responseData = responseData; | |||||
} | |||||
public String getExceptionMsg() { | |||||
return this.exceptionMsg; | |||||
} | |||||
public void setExceptionMsg(String exceptionMsg) { | |||||
this.exceptionMsg = exceptionMsg; | |||||
} | |||||
@Override | |||||
public String toString() { | |||||
if (this.exceptionMsg != null) { | |||||
return String.format("\n【请求地址】:%s\n【请求数据】:%s\n【异常信息】:%s", | |||||
this, url, this.requestData, this.exceptionMsg); | |||||
} | |||||
return String.format("\n【请求地址】:%s\n【请求数据】:%s\n【响应数据】:%s", | |||||
this.url, this.requestData, this.responseData); | |||||
} | |||||
} |
@@ -1,5 +1,6 @@ | |||||
package com.github.binarywang.wxpay.service; | package com.github.binarywang.wxpay.service; | ||||
import com.github.binarywang.wxpay.bean.WxPayApiData; | |||||
import com.github.binarywang.wxpay.bean.coupon.*; | import com.github.binarywang.wxpay.bean.coupon.*; | ||||
import com.github.binarywang.wxpay.bean.request.*; | import com.github.binarywang.wxpay.bean.request.*; | ||||
import com.github.binarywang.wxpay.bean.result.*; | import com.github.binarywang.wxpay.bean.result.*; | ||||
@@ -368,4 +369,9 @@ public interface WxPayService { | |||||
* </pre> | * </pre> | ||||
*/ | */ | ||||
WxPayCouponInfoQueryResult queryCouponInfo(WxPayCouponInfoQueryRequest request) throws WxPayException; | WxPayCouponInfoQueryResult queryCouponInfo(WxPayCouponInfoQueryRequest request) throws WxPayException; | ||||
/** | |||||
* 获取微信请求数据,方便接口调用方获取处理 | |||||
*/ | |||||
WxPayApiData getWxApiData(); | |||||
} | } |
@@ -1,6 +1,7 @@ | |||||
package com.github.binarywang.wxpay.service.impl; | package com.github.binarywang.wxpay.service.impl; | ||||
import com.github.binarywang.utils.qrcode.QrcodeUtils; | import com.github.binarywang.utils.qrcode.QrcodeUtils; | ||||
import com.github.binarywang.wxpay.bean.WxPayApiData; | |||||
import com.github.binarywang.wxpay.bean.coupon.*; | import com.github.binarywang.wxpay.bean.coupon.*; | ||||
import com.github.binarywang.wxpay.bean.request.*; | import com.github.binarywang.wxpay.bean.request.*; | ||||
import com.github.binarywang.wxpay.bean.result.*; | import com.github.binarywang.wxpay.bean.result.*; | ||||
@@ -33,6 +34,7 @@ import java.util.Map; | |||||
public abstract class WxPayServiceAbstractImpl implements WxPayService { | public abstract class WxPayServiceAbstractImpl implements WxPayService { | ||||
private static final String PAY_BASE_URL = "https://api.mch.weixin.qq.com"; | private static final String PAY_BASE_URL = "https://api.mch.weixin.qq.com"; | ||||
protected final Logger log = LoggerFactory.getLogger(this.getClass()); | protected final Logger log = LoggerFactory.getLogger(this.getClass()); | ||||
protected static ThreadLocal<WxPayApiData> wxApiData = new ThreadLocal<>(); | |||||
protected WxPayConfig config; | protected WxPayConfig config; | ||||
@@ -501,4 +503,15 @@ public abstract class WxPayServiceAbstractImpl implements WxPayService { | |||||
result.checkResult(this); | result.checkResult(this); | ||||
return result; | return result; | ||||
} | } | ||||
@Override | |||||
public WxPayApiData getWxApiData() { | |||||
try { | |||||
return wxApiData.get(); | |||||
}finally { | |||||
//一般来说,接口请求会在一个线程内进行,这种情况下,每个线程get的会是之前所存入的数据, | |||||
// 但以防万一有同一线程多次请求的问题,所以每次获取完数据后移除对应数据 | |||||
wxApiData.remove(); | |||||
} | |||||
} | |||||
} | } |
@@ -1,5 +1,6 @@ | |||||
package com.github.binarywang.wxpay.service.impl; | package com.github.binarywang.wxpay.service.impl; | ||||
import com.github.binarywang.wxpay.bean.WxPayApiData; | |||||
import com.github.binarywang.wxpay.exception.WxPayException; | import com.github.binarywang.wxpay.exception.WxPayException; | ||||
import org.apache.commons.lang3.StringUtils; | import org.apache.commons.lang3.StringUtils; | ||||
import org.apache.http.auth.AuthScope; | import org.apache.http.auth.AuthScope; | ||||
@@ -66,15 +67,17 @@ public class WxPayServiceApacheHttpImpl extends WxPayServiceAbstractImpl { | |||||
try (CloseableHttpClient httpclient = httpClientBuilder.build()) { | try (CloseableHttpClient httpclient = httpClientBuilder.build()) { | ||||
httpPost.setEntity(new StringEntity(new String(requestStr.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1))); | httpPost.setEntity(new StringEntity(new String(requestStr.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1))); | ||||
try (CloseableHttpResponse response = httpclient.execute(httpPost)) { | try (CloseableHttpResponse response = httpclient.execute(httpPost)) { | ||||
String result = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8); | |||||
this.log.info("\n【请求地址】:{}\n【请求数据】:{}\n【响应数据】:{}", url, requestStr, result); | |||||
return result; | |||||
String responseString = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8); | |||||
this.log.info("\n【请求地址】:{}\n【请求数据】:{}\n【响应数据】:{}", url, requestStr, responseString); | |||||
wxApiData.set(new WxPayApiData(url, requestStr, responseString, null)); | |||||
return responseString; | |||||
} | } | ||||
} finally { | } finally { | ||||
httpPost.releaseConnection(); | httpPost.releaseConnection(); | ||||
} | } | ||||
} catch (Exception e) { | } catch (Exception e) { | ||||
this.log.error("\n【请求地址】:{}\n【请求数据】:{}\n【异常信息】:{}", url, requestStr, e.getMessage()); | this.log.error("\n【请求地址】:{}\n【请求数据】:{}\n【异常信息】:{}", url, requestStr, e.getMessage()); | ||||
wxApiData.set(new WxPayApiData(url, requestStr, null, e.getMessage())); | |||||
throw new WxPayException(e.getMessage(), e); | throw new WxPayException(e.getMessage(), e); | ||||
} | } | ||||
} | } | ||||
@@ -1,5 +1,6 @@ | |||||
package com.github.binarywang.wxpay.service.impl; | package com.github.binarywang.wxpay.service.impl; | ||||
import com.github.binarywang.wxpay.bean.WxPayApiData; | |||||
import com.github.binarywang.wxpay.exception.WxPayException; | import com.github.binarywang.wxpay.exception.WxPayException; | ||||
import jodd.http.HttpConnectionProvider; | import jodd.http.HttpConnectionProvider; | ||||
import jodd.http.HttpRequest; | import jodd.http.HttpRequest; | ||||
@@ -53,9 +54,11 @@ public class WxPayServiceJoddHttpImpl extends WxPayServiceAbstractImpl { | |||||
String responseString = this.getResponseString(request.send()); | String responseString = this.getResponseString(request.send()); | ||||
this.log.info("\n【请求地址】:{}\n【请求数据】:{}\n【响应数据】:{}", url, requestStr, responseString); | this.log.info("\n【请求地址】:{}\n【请求数据】:{}\n【响应数据】:{}", url, requestStr, responseString); | ||||
wxApiData.set(new WxPayApiData(url, requestStr, responseString, null)); | |||||
return responseString; | return responseString; | ||||
} catch (Exception e) { | } catch (Exception e) { | ||||
this.log.error("\n【请求地址】:{}\n【请求数据】:{}\n【异常信息】:{}", url, requestStr, e.getMessage()); | this.log.error("\n【请求地址】:{}\n【请求数据】:{}\n【异常信息】:{}", url, requestStr, e.getMessage()); | ||||
wxApiData.set(new WxPayApiData(url, requestStr, null, e.getMessage())); | |||||
throw new WxPayException(e.getMessage(), e); | throw new WxPayException(e.getMessage(), e); | ||||
} | } | ||||
} | } | ||||
@@ -53,6 +53,7 @@ public class WxPayServiceAbstractImplTest { | |||||
.outTradeNo("1111112") | .outTradeNo("1111112") | ||||
.build()); | .build()); | ||||
this.logger.info(result.toString()); | this.logger.info(result.toString()); | ||||
this.logger.warn(this.payService.getWxApiData().toString()); | |||||
} | } | ||||
@Test | @Test | ||||
@@ -12,11 +12,16 @@ import java.io.IOException; | |||||
import java.io.InputStream; | import java.io.InputStream; | ||||
public class ApiTestModule implements Module { | public class ApiTestModule implements Module { | ||||
private static final String TEST_CONFIG_XML = "test-config.xml"; | |||||
@Override | @Override | ||||
public void configure(Binder binder) { | public void configure(Binder binder) { | ||||
try (InputStream is1 = ClassLoader.getSystemResourceAsStream("test-config.xml")) { | |||||
XmlWxPayConfig config = this.fromXml(XmlWxPayConfig.class, is1); | |||||
try (InputStream inputStream = ClassLoader.getSystemResourceAsStream(TEST_CONFIG_XML)) { | |||||
if (inputStream == null) { | |||||
throw new RuntimeException("测试配置文件【" + TEST_CONFIG_XML + "】未找到"); | |||||
} | |||||
XmlWxPayConfig config = this.fromXml(XmlWxPayConfig.class, inputStream); | |||||
WxPayService wxService = new WxPayServiceImpl(); | WxPayService wxService = new WxPayServiceImpl(); | ||||
wxService.setConfig(config); | wxService.setConfig(config); | ||||