package com.matrix.component.wechat.externalInterface.common; 
 | 
  
 | 
import com.matrix.core.tools.WebUtil; 
 | 
import com.matrix.system.common.bean.BusParameterSettings; 
 | 
import com.matrix.system.common.constance.AppConstance; 
 | 
import com.matrix.system.common.dao.BusParameterSettingsDao; 
 | 
import com.thoughtworks.xstream.XStream; 
 | 
import com.thoughtworks.xstream.io.xml.DomDriver; 
 | 
import com.thoughtworks.xstream.io.xml.XmlFriendlyNameCoder; 
 | 
import com.matrix.component.wechat.externalInterface.service.IServiceRequest; 
 | 
import org.apache.http.HttpEntity; 
 | 
import org.apache.http.HttpResponse; 
 | 
import org.apache.http.client.config.RequestConfig; 
 | 
import org.apache.http.client.methods.HttpPost; 
 | 
import org.apache.http.conn.ConnectTimeoutException; 
 | 
import org.apache.http.conn.ConnectionPoolTimeoutException; 
 | 
import org.apache.http.conn.ssl.SSLConnectionSocketFactory; 
 | 
import org.apache.http.conn.ssl.SSLContexts; 
 | 
import org.apache.http.entity.StringEntity; 
 | 
import org.apache.http.impl.client.CloseableHttpClient; 
 | 
import org.apache.http.impl.client.HttpClients; 
 | 
import org.apache.http.util.EntityUtils; 
 | 
import org.apache.log4j.Logger; 
 | 
  
 | 
import javax.net.ssl.SSLContext; 
 | 
import java.io.File; 
 | 
import java.io.FileInputStream; 
 | 
import java.io.IOException; 
 | 
import java.net.SocketTimeoutException; 
 | 
import java.security.*; 
 | 
import java.security.cert.CertificateException; 
 | 
  
 | 
/** 
 | 
 * User: rizenguo 
 | 
 * Date: 2014/10/29 
 | 
 * Time: 14:36 
 | 
 */ 
 | 
public class HttpsRequest2 implements IServiceRequest { 
 | 
  
 | 
    public interface ResultListener { 
 | 
  
 | 
  
 | 
        public void onConnectionPoolTimeoutError(); 
 | 
  
 | 
    } 
 | 
  
 | 
    Logger log=Logger.getLogger(HttpRequest.class); 
 | 
  
 | 
    //表示请求器是否已经做了初始化工作 
 | 
    private boolean hasInit = false; 
 | 
  
 | 
    //连接超时时间,默认10秒 
 | 
    private int socketTimeout = 10000; 
 | 
  
 | 
    //传输超时时间,默认30秒 
 | 
    private int connectTimeout = 30000; 
 | 
  
 | 
    //请求器的配置 
 | 
    private RequestConfig requestConfig; 
 | 
  
 | 
    //HTTP请求器 
 | 
    private CloseableHttpClient httpClient; 
 | 
    //证书地址 
 | 
    private String  certLocalPath; 
 | 
    //商户号 
 | 
    private String mchId; 
 | 
  
 | 
    public HttpsRequest2() throws UnrecoverableKeyException, KeyManagementException, NoSuchAlgorithmException, KeyStoreException, IOException { 
 | 
  
 | 
    } 
 | 
  
 | 
    private void init() throws IOException, KeyStoreException, UnrecoverableKeyException, NoSuchAlgorithmException, KeyManagementException { 
 | 
  
 | 
        KeyStore keyStore = KeyStore.getInstance("PKCS12"); 
 | 
        FileInputStream instream = new FileInputStream(new File(certLocalPath));//加载本地的证书进行https加密传输 
 | 
        try { 
 | 
            keyStore.load(instream, mchId.toCharArray());//设置证书密码 
 | 
        } catch (CertificateException e) { 
 | 
            e.printStackTrace(); 
 | 
        } catch (NoSuchAlgorithmException e) { 
 | 
            e.printStackTrace(); 
 | 
        } finally { 
 | 
            instream.close(); 
 | 
        } 
 | 
        // Trust own CA and all self-signed certs 
 | 
        SSLContext sslcontext = SSLContexts.custom() 
 | 
                .loadKeyMaterial(keyStore, mchId.toCharArray()) 
 | 
                .build(); 
 | 
        // Allow TLSv1 protocol only 
 | 
        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory( 
 | 
                sslcontext, 
 | 
                new String[]{"TLSv1"}, 
 | 
                null, 
 | 
                SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER); 
 | 
  
 | 
  
 | 
        httpClient = HttpClients.custom() 
 | 
                .setSSLSocketFactory(sslsf) 
 | 
                .build(); 
 | 
        // httpClient = HttpClients.custom().build(); 
 | 
        //根据默认超时限制初始化requestConfig 
 | 
        requestConfig = RequestConfig.custom().setSocketTimeout(socketTimeout).setConnectTimeout(connectTimeout).build(); 
 | 
        hasInit = true; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 通过Https往API post xml数据 
 | 
     * 
 | 
     * @param url    API地址 
 | 
     * @param xmlObj 要提交的XML数据对象 
 | 
     * @return API回包的实际数据 
 | 
     * @throws IOException 
 | 
     * @throws KeyStoreException 
 | 
     * @throws UnrecoverableKeyException 
 | 
     * @throws NoSuchAlgorithmException 
 | 
     * @throws KeyManagementException 
 | 
     */ 
 | 
  
 | 
    public String sendPost(String url, Object xmlObj) throws IOException, KeyStoreException, UnrecoverableKeyException, NoSuchAlgorithmException, KeyManagementException { 
 | 
  
 | 
        if (!hasInit) { 
 | 
            init(); 
 | 
        } 
 | 
  
 | 
        String result = null; 
 | 
  
 | 
        HttpPost httpPost = new HttpPost(url); 
 | 
  
 | 
        //解决XStream对出现双下划线的bug 
 | 
        XStream xStreamForRequestPostData = new XStream(new DomDriver("UTF-8", new XmlFriendlyNameCoder("-_", "_"))); 
 | 
  
 | 
        //将要提交给API的数据对象转换成XML格式数据Post给API 
 | 
        String postDataXML = xStreamForRequestPostData.toXML(xmlObj); 
 | 
  
 | 
        log.info( "POST request send  data:"); 
 | 
        log.info(postDataXML); 
 | 
        //得指明使用UTF-8编码,否则到API服务器XML的中文不能被成功识别 
 | 
        StringEntity postEntity = new StringEntity(postDataXML, "UTF-8"); 
 | 
        httpPost.addHeader("Content-Type", "text/xml"); 
 | 
        httpPost.setEntity(postEntity); 
 | 
  
 | 
        //设置请求器的配置 
 | 
        httpPost.setConfig(requestConfig); 
 | 
  
 | 
        log.info("executing request" + httpPost.getRequestLine()); 
 | 
  
 | 
        try { 
 | 
            HttpResponse response = httpClient.execute(httpPost); 
 | 
  
 | 
            HttpEntity entity = response.getEntity(); 
 | 
  
 | 
            result = EntityUtils.toString(entity, "UTF-8"); 
 | 
  
 | 
            log.info("POST back date:" + httpPost.getRequestLine()); 
 | 
  
 | 
  
 | 
  
 | 
        } catch (ConnectionPoolTimeoutException e) { 
 | 
//            log.e("http get throw ConnectionPoolTimeoutException(wait time out)"); 
 | 
  
 | 
        } catch (ConnectTimeoutException e) { 
 | 
//            log.e("http get throw ConnectTimeoutException"); 
 | 
  
 | 
        } catch (SocketTimeoutException e) { 
 | 
//            log.e("http get throw SocketTimeoutException"); 
 | 
  
 | 
        } catch (Exception e) { 
 | 
            e.printStackTrace(); 
 | 
//            log.e("http get throw Exception"); 
 | 
  
 | 
        } finally { 
 | 
            httpPost.abort(); 
 | 
        } 
 | 
  
 | 
        return result; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 设置连接超时时间 
 | 
     * 
 | 
     * @param socketTimeout 连接时长,默认10秒 
 | 
     */ 
 | 
    public void setSocketTimeout(int socketTimeout) { 
 | 
        this.socketTimeout = socketTimeout; 
 | 
        resetRequestConfig(); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 设置传输超时时间 
 | 
     * 
 | 
     * @param connectTimeout 传输时长,默认30秒 
 | 
     */ 
 | 
    public void setConnectTimeout(int connectTimeout) { 
 | 
        this.connectTimeout = connectTimeout; 
 | 
        resetRequestConfig(); 
 | 
    } 
 | 
  
 | 
    private void resetRequestConfig(){ 
 | 
        requestConfig = RequestConfig.custom().setSocketTimeout(socketTimeout).setConnectTimeout(connectTimeout).build(); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 允许商户自己做更高级更复杂的请求器配置 
 | 
     * 
 | 
     * @param requestConfig 设置HttpsRequest的请求器配置 
 | 
     */ 
 | 
    public void setRequestConfig(RequestConfig requestConfig) { 
 | 
        this.requestConfig = requestConfig; 
 | 
    } 
 | 
  
 | 
  
 | 
    public String getMchId() { 
 | 
        return mchId; 
 | 
    } 
 | 
  
 | 
    public void setMchId(String mchId) { 
 | 
        this.mchId = mchId; 
 | 
    } 
 | 
  
 | 
    public String getCertLocalPath() { 
 | 
        return certLocalPath; 
 | 
    } 
 | 
  
 | 
    public void setCertLocalPath(String certLocalPath) { 
 | 
        this.certLocalPath = certLocalPath; 
 | 
    } 
 | 
} 
 |