@@ -11,7 +11,6 @@ import com.github.binarywang.wxpay.bean.order.WxPayNativeOrderResult;  
		
	
		
			
			import com.github.binarywang.wxpay.bean.request.*;  
		
	
		
			
			import com.github.binarywang.wxpay.bean.result.*;  
		
	
		
			
			import com.github.binarywang.wxpay.config.WxPayConfig;  
		
	
		
			
			import com.github.binarywang.wxpay.constant.WxPayConstants;  
		
	
		
			
			import com.github.binarywang.wxpay.constant.WxPayConstants.BillType;  
		
	
		
			
			import com.github.binarywang.wxpay.constant.WxPayConstants.SignType;  
		
	
		
			
			import com.github.binarywang.wxpay.constant.WxPayConstants.TradeType;  
		
	
	
		
			
				
				
				
				
					 
			
			@@ -21,26 +20,10 @@ import com.github.binarywang.wxpay.util.SignUtils;  
		
	
		
			
			import com.google.common.base.Joiner;  
		
	
		
			
			import com.google.common.collect.Maps;  
		
	
		
			
			import jodd.io.ZipUtil;  
		
	
		
			
			import jodd.util.Base64;  
		
	
		
			
			import org.apache.commons.lang3.StringUtils;  
		
	
		
			
			import org.apache.http.auth.AuthScope;  
		
	
		
			
			import org.apache.http.auth.UsernamePasswordCredentials;  
		
	
		
			
			import org.apache.http.client.CredentialsProvider;  
		
	
		
			
			import org.apache.http.client.config.RequestConfig;  
		
	
		
			
			import org.apache.http.client.methods.CloseableHttpResponse;  
		
	
		
			
			import org.apache.http.client.methods.HttpPost;  
		
	
		
			
			import org.apache.http.conn.ssl.DefaultHostnameVerifier;  
		
	
		
			
			import org.apache.http.conn.ssl.SSLConnectionSocketFactory;  
		
	
		
			
			import org.apache.http.entity.StringEntity;  
		
	
		
			
			import org.apache.http.impl.client.BasicCredentialsProvider;  
		
	
		
			
			import org.apache.http.impl.client.CloseableHttpClient;  
		
	
		
			
			import org.apache.http.impl.client.HttpClientBuilder;  
		
	
		
			
			import org.apache.http.impl.client.HttpClients;  
		
	
		
			
			import org.apache.http.util.EntityUtils;  
		
	
		
			
			import org.slf4j.Logger;  
		
	
		
			
			import org.slf4j.LoggerFactory;  
		
	
		
			
			 
		
	
		
			
			import javax.net.ssl.SSLContext;  
		
	
		
			
			import java.io.File;  
		
	
		
			
			import java.io.IOException;  
		
	
		
			
			import java.nio.charset.StandardCharsets;  
		
	
	
		
			
				
				
				
				
					 
			
			@@ -61,7 +44,7 @@ import static com.github.binarywang.wxpay.constant.WxPayConstants.TarType;  
		
	
		
			
			 *  
		
	
		
			
			 * @author <a href="https://github.com/binarywang">Binary Wang</a>  
		
	
		
			
			 */  
		
	
		
			
			public abstract class WxPayServiceAbstract Impl implements WxPayService {  
		
	
		
			
			public abstract class Base WxPayServiceImpl implements WxPayService {  
		
	
		
			
			  private static final String PAY_BASE_URL = "https://api.mch.weixin.qq.com";  
		
	
		
			
			  protected final Logger log = LoggerFactory.getLogger(this.getClass());  
		
	
		
			
			  protected static ThreadLocal<WxPayApiData> wxApiData = new ThreadLocal<>();  
		
	
	
		
			
				
				
					 
			
			@@ -112,7 +95,7 @@ public abstract class WxPayServiceAbstractImpl implements WxPayService {  
		
	
		
			
			 
		
	
		
			
			    String url = this.getPayBaseUrl() + "/secapi/pay/refund";  
		
	
		
			
			    String responseContent = this.post(url, request.toXML(), true);  
		
	
		
			
			    WxPayRefundResult result = WxPayBase Result.fromXML(responseContent, WxPayRefundResult.class);  
		
	
		
			
			    WxPayRefundResult result = Base WxPayResult.fromXML(responseContent, WxPayRefundResult.class);  
		
	
		
			
			    result.checkResult(this, request.getSignType(), true);  
		
	
		
			
			    return result;  
		
	
		
			
			  }  
		
	
	
		
			
				
				
				
				
					 
			
			@@ -130,7 +113,7 @@ public abstract class WxPayServiceAbstractImpl implements WxPayService {  
		
	
		
			
			 
		
	
		
			
			    String url = this.getPayBaseUrl() + "/pay/refundquery";  
		
	
		
			
			    String responseContent = this.post(url, request.toXML(), false);  
		
	
		
			
			    WxPayRefundQueryResult result = WxPayBase Result.fromXML(responseContent, WxPayRefundQueryResult.class);  
		
	
		
			
			    WxPayRefundQueryResult result = Base WxPayResult.fromXML(responseContent, WxPayRefundQueryResult.class);  
		
	
		
			
			    result.composeRefundRecords();  
		
	
		
			
			    result.checkResult(this, request.getSignType(), true);  
		
	
		
			
			    return result;  
		
	
	
		
			
				
				
					 
			
			@@ -184,7 +167,7 @@ public abstract class WxPayServiceAbstractImpl implements WxPayService {  
		
	
		
			
			 
		
	
		
			
			    String responseContent = this.post(url, request.toXML(), true);  
		
	
		
			
			    //无需校验,因为没有返回签名信息  
		
	
		
			
			    return WxPayBase Result.fromXML(responseContent, WxPaySendRedpackResult.class);  
		
	
		
			
			    return Base WxPayResult.fromXML(responseContent, WxPaySendRedpackResult.class);  
		
	
		
			
			  }  
		
	
		
			
			 
		
	
		
			
			  @Override  
		
	
	
		
			
				
				
				
				
					 
			
			@@ -196,7 +179,7 @@ public abstract class WxPayServiceAbstractImpl implements WxPayService {  
		
	
		
			
			 
		
	
		
			
			    String url = this.getPayBaseUrl() + "/mmpaymkttransfers/gethbinfo";  
		
	
		
			
			    String responseContent = this.post(url, request.toXML(), true);  
		
	
		
			
			    WxPayRedpackQueryResult result = WxPayBase Result.fromXML(responseContent, WxPayRedpackQueryResult.class);  
		
	
		
			
			    WxPayRedpackQueryResult result = Base WxPayResult.fromXML(responseContent, WxPayRedpackQueryResult.class);  
		
	
		
			
			    result.checkResult(this, request.getSignType(), true);  
		
	
		
			
			    return result;  
		
	
		
			
			  }  
		
	
	
		
			
				
				
				
				
					 
			
			@@ -214,7 +197,7 @@ public abstract class WxPayServiceAbstractImpl implements WxPayService {  
		
	
		
			
			      throw new WxPayException("无响应结果");  
		
	
		
			
			    }  
		
	
		
			
			 
		
	
		
			
			    WxPayOrderQueryResult result = WxPayBase Result.fromXML(responseContent, WxPayOrderQueryResult.class);  
		
	
		
			
			    WxPayOrderQueryResult result = Base WxPayResult.fromXML(responseContent, WxPayOrderQueryResult.class);  
		
	
		
			
			    result.composeCoupons();  
		
	
		
			
			    result.checkResult(this, request.getSignType(), true);  
		
	
		
			
			    return result;  
		
	
	
		
			
				
				
				
				
					 
			
			@@ -232,7 +215,7 @@ public abstract class WxPayServiceAbstractImpl implements WxPayService {  
		
	
		
			
			 
		
	
		
			
			    String url = this.getPayBaseUrl() + "/pay/closeorder";  
		
	
		
			
			    String responseContent = this.post(url, request.toXML(), false);  
		
	
		
			
			    WxPayOrderCloseResult result = WxPayBase Result.fromXML(responseContent, WxPayOrderCloseResult.class);  
		
	
		
			
			    WxPayOrderCloseResult result = Base WxPayResult.fromXML(responseContent, WxPayOrderCloseResult.class);  
		
	
		
			
			    result.checkResult(this, request.getSignType(), true);  
		
	
		
			
			 
		
	
		
			
			    return result;  
		
	
	
		
			
				
				
					 
			
			@@ -314,7 +297,7 @@ public abstract class WxPayServiceAbstractImpl implements WxPayService {  
		
	
		
			
			 
		
	
		
			
			    String url = this.getPayBaseUrl() + "/pay/unifiedorder";  
		
	
		
			
			    String responseContent = this.post(url, request.toXML(), false);  
		
	
		
			
			    WxPayUnifiedOrderResult result = WxPayBase Result.fromXML(responseContent, WxPayUnifiedOrderResult.class);  
		
	
		
			
			    WxPayUnifiedOrderResult result = Base WxPayResult.fromXML(responseContent, WxPayUnifiedOrderResult.class);  
		
	
		
			
			    result.checkResult(this, request.getSignType(), true);  
		
	
		
			
			    return result;  
		
	
		
			
			  }  
		
	
	
		
			
				
				
					 
			
			@@ -374,7 +357,7 @@ public abstract class WxPayServiceAbstractImpl implements WxPayService {  
		
	
		
			
			    String url = this.getPayBaseUrl() + "/mmpaymkttransfers/promotion/transfers";  
		
	
		
			
			 
		
	
		
			
			    String responseContent = this.post(url, request.toXML(), true);  
		
	
		
			
			    WxEntPayResult result = WxPayBase Result.fromXML(responseContent, WxEntPayResult.class);  
		
	
		
			
			    WxEntPayResult result = Base WxPayResult.fromXML(responseContent, WxEntPayResult.class);  
		
	
		
			
			    result.checkResult(this, request.getSignType(), true);  
		
	
		
			
			    return result;  
		
	
		
			
			  }  
		
	
	
		
			
				
				
				
				
					 
			
			@@ -387,7 +370,7 @@ public abstract class WxPayServiceAbstractImpl implements WxPayService {  
		
	
		
			
			 
		
	
		
			
			    String url = this.getPayBaseUrl() + "/mmpaymkttransfers/gettransferinfo";  
		
	
		
			
			    String responseContent = this.post(url, request.toXML(), true);  
		
	
		
			
			    WxEntPayQueryResult result = WxPayBase Result.fromXML(responseContent, WxEntPayQueryResult.class);  
		
	
		
			
			    WxEntPayQueryResult result = Base WxPayResult.fromXML(responseContent, WxEntPayQueryResult.class);  
		
	
		
			
			    result.checkResult(this, request.getSignType(), true);  
		
	
		
			
			    return result;  
		
	
		
			
			  }  
		
	
	
		
			
				
				
					 
			
			@@ -440,7 +423,7 @@ public abstract class WxPayServiceAbstractImpl implements WxPayService {  
		
	
		
			
			 
		
	
		
			
			    String url = this.getPayBaseUrl() + "/payitil/report";  
		
	
		
			
			    String responseContent = this.post(url, request.toXML(), false);  
		
	
		
			
			    WxPayCommonResult result = WxPayBase Result.fromXML(responseContent, WxPayCommonResult.class);  
		
	
		
			
			    WxPayCommonResult result = Base WxPayResult.fromXML(responseContent, WxPayCommonResult.class);  
		
	
		
			
			    result.checkResult(this, request.getSignType(), true);  
		
	
		
			
			  }  
		
	
		
			
			 
		
	
	
		
			
				
				
				
				
					 
			
			@@ -466,7 +449,7 @@ public abstract class WxPayServiceAbstractImpl implements WxPayService {  
		
	
		
			
			    } else {  
		
	
		
			
			      responseContent = this.post(url, request.toXML(), false);  
		
	
		
			
			      if (responseContent.startsWith("<")) {  
		
	
		
			
			        throw WxPayException.from(WxPayBase Result.fromXML(responseContent, WxPayCommonResult.class));  
		
	
		
			
			        throw WxPayException.from(Base WxPayResult.fromXML(responseContent, WxPayCommonResult.class));  
		
	
		
			
			      }  
		
	
		
			
			    }  
		
	
		
			
			 
		
	
	
		
			
				
				
				
				
					 
			
			@@ -492,7 +475,7 @@ public abstract class WxPayServiceAbstractImpl implements WxPayService {  
		
	
		
			
			        return Joiner.on("\n").join(allLines);  
		
	
		
			
			      } catch (ZipException e) {  
		
	
		
			
			        if (e.getMessage().contains("Not in GZIP format")) {  
		
	
		
			
			          throw WxPayException.from(WxPayBase Result.fromXML(new String(responseBytes, StandardCharsets.UTF_8),  
		
	
		
			
			          throw WxPayException.from(Base WxPayResult.fromXML(new String(responseBytes, StandardCharsets.UTF_8),  
		
	
		
			
			            WxPayCommonResult.class));  
		
	
		
			
			        } else {  
		
	
		
			
			          this.log.error("解压zip文件出错", e);  
		
	
	
		
			
				
				
					 
			
			@@ -584,7 +567,7 @@ public abstract class WxPayServiceAbstractImpl implements WxPayService {  
		
	
		
			
			 
		
	
		
			
			    String url = this.getPayBaseUrl() + "/pay/micropay";  
		
	
		
			
			    String responseContent = this.post(url, request.toXML(), false);  
		
	
		
			
			    WxPayMicropayResult result = WxPayBase Result.fromXML(responseContent, WxPayMicropayResult.class);  
		
	
		
			
			    WxPayMicropayResult result = Base WxPayResult.fromXML(responseContent, WxPayMicropayResult.class);  
		
	
		
			
			    result.checkResult(this, request.getSignType(), true);  
		
	
		
			
			    return result;  
		
	
		
			
			  }  
		
	
	
		
			
				
				
				
				
					 
			
			@@ -595,7 +578,7 @@ public abstract class WxPayServiceAbstractImpl implements WxPayService {  
		
	
		
			
			 
		
	
		
			
			    String url = this.getPayBaseUrl() + "/secapi/pay/reverse";  
		
	
		
			
			    String responseContent = this.post(url, request.toXML(), true);  
		
	
		
			
			    WxPayOrderReverseResult result = WxPayBase Result.fromXML(responseContent, WxPayOrderReverseResult.class);  
		
	
		
			
			    WxPayOrderReverseResult result = Base WxPayResult.fromXML(responseContent, WxPayOrderReverseResult.class);  
		
	
		
			
			    result.checkResult(this, request.getSignType(), true);  
		
	
		
			
			    return result;  
		
	
		
			
			  }  
		
	
	
		
			
				
				
				
				
					 
			
			@@ -606,7 +589,7 @@ public abstract class WxPayServiceAbstractImpl implements WxPayService {  
		
	
		
			
			 
		
	
		
			
			    String url = this.getPayBaseUrl() + "/tools/shorturl";  
		
	
		
			
			    String responseContent = this.post(url, request.toXML(), false);  
		
	
		
			
			    WxPayShorturlResult result = WxPayBase Result.fromXML(responseContent, WxPayShorturlResult.class);  
		
	
		
			
			    WxPayShorturlResult result = Base WxPayResult.fromXML(responseContent, WxPayShorturlResult.class);  
		
	
		
			
			    result.checkResult(this, request.getSignType(), true);  
		
	
		
			
			    return result.getShortUrl();  
		
	
		
			
			  }  
		
	
	
		
			
				
				
				
				
					 
			
			@@ -622,7 +605,7 @@ public abstract class WxPayServiceAbstractImpl implements WxPayService {  
		
	
		
			
			 
		
	
		
			
			    String url = this.getPayBaseUrl() + "/tools/authcodetoopenid";  
		
	
		
			
			    String responseContent = this.post(url, request.toXML(), false);  
		
	
		
			
			    WxPayAuthcode2OpenidResult result = WxPayBase Result.fromXML(responseContent, WxPayAuthcode2OpenidResult.class);  
		
	
		
			
			    WxPayAuthcode2OpenidResult result = Base WxPayResult.fromXML(responseContent, WxPayAuthcode2OpenidResult.class);  
		
	
		
			
			    result.checkResult(this, request.getSignType(), true);  
		
	
		
			
			    return result.getOpenid();  
		
	
		
			
			  }  
		
	
	
		
			
				
				
				
				
					 
			
			@@ -639,7 +622,7 @@ public abstract class WxPayServiceAbstractImpl implements WxPayService {  
		
	
		
			
			 
		
	
		
			
			    String url = "https://api.mch.weixin.qq.com/sandboxnew/pay/getsignkey";  
		
	
		
			
			    String responseContent = this.post(url, request.toXML(), false);  
		
	
		
			
			    WxPaySandboxSignKeyResult result = WxPayBase Result.fromXML(responseContent, WxPaySandboxSignKeyResult.class);  
		
	
		
			
			    WxPaySandboxSignKeyResult result = Base WxPayResult.fromXML(responseContent, WxPaySandboxSignKeyResult.class);  
		
	
		
			
			    result.checkResult(this, request.getSignType(), true);  
		
	
		
			
			    return result.getSandboxSignKey();  
		
	
		
			
			  }  
		
	
	
		
			
				
				
				
				
					 
			
			@@ -650,7 +633,7 @@ public abstract class WxPayServiceAbstractImpl implements WxPayService {  
		
	
		
			
			 
		
	
		
			
			    String url = this.getPayBaseUrl() + "/mmpaymkttransfers/send_coupon";  
		
	
		
			
			    String responseContent = this.post(url, request.toXML(), true);  
		
	
		
			
			    WxPayCouponSendResult result = WxPayBase Result.fromXML(responseContent, WxPayCouponSendResult.class);  
		
	
		
			
			    WxPayCouponSendResult result = Base WxPayResult.fromXML(responseContent, WxPayCouponSendResult.class);  
		
	
		
			
			    result.checkResult(this, request.getSignType(), true);  
		
	
		
			
			    return result;  
		
	
		
			
			  }  
		
	
	
		
			
				
				
				
				
					 
			
			@@ -661,7 +644,7 @@ public abstract class WxPayServiceAbstractImpl implements WxPayService {  
		
	
		
			
			 
		
	
		
			
			    String url = this.getPayBaseUrl() + "/mmpaymkttransfers/query_coupon_stock";  
		
	
		
			
			    String responseContent = this.post(url, request.toXML(), false);  
		
	
		
			
			    WxPayCouponStockQueryResult result = WxPayBase Result.fromXML(responseContent, WxPayCouponStockQueryResult.class);  
		
	
		
			
			    WxPayCouponStockQueryResult result = Base WxPayResult.fromXML(responseContent, WxPayCouponStockQueryResult.class);  
		
	
		
			
			    result.checkResult(this, request.getSignType(), true);  
		
	
		
			
			    return result;  
		
	
		
			
			  }  
		
	
	
		
			
				
				
				
				
					 
			
			@@ -672,7 +655,7 @@ public abstract class WxPayServiceAbstractImpl implements WxPayService {  
		
	
		
			
			 
		
	
		
			
			    String url = this.getPayBaseUrl() + "/mmpaymkttransfers/querycouponsinfo";  
		
	
		
			
			    String responseContent = this.post(url, request.toXML(), false);  
		
	
		
			
			    WxPayCouponInfoQueryResult result = WxPayBase Result.fromXML(responseContent, WxPayCouponInfoQueryResult.class);  
		
	
		
			
			    WxPayCouponInfoQueryResult result = Base WxPayResult.fromXML(responseContent, WxPayCouponInfoQueryResult.class);  
		
	
		
			
			    result.checkResult(this, request.getSignType(), true);  
		
	
		
			
			    return result;  
		
	
		
			
			  }  
		
	
	
		
			
				
				
					 
			
			@@ -703,7 +686,7 @@ public abstract class WxPayServiceAbstractImpl implements WxPayService {  
		
	
		
			
			 
		
	
		
			
			    String responseContent = this.post(url, request.toXML(), true);  
		
	
		
			
			    if (responseContent.startsWith("<")) {  
		
	
		
			
			      throw WxPayException.from(WxPayBase Result.fromXML(responseContent, WxPayCommonResult.class));  
		
	
		
			
			      throw WxPayException.from(Base WxPayResult.fromXML(responseContent, WxPayCommonResult.class));  
		
	
		
			
			    }  
		
	
		
			
			 
		
	
		
			
			    return responseContent;