您的位置:首页 > 理论基础 > 计算机网络

微信支付--工具类--通过Https往API post xml数据

2015-11-24 10:19 183 查看
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.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;  

[java] view
plaincopy

import javax.net.ssl.SSLContext;  

import java.io.IOException;  

import java.security.*;  

  

public class HttpsRequest {  

  

    public interface ResultListener {  

  

        public void onConnectionPoolTimeoutError();  

  

    }  

  

    // 表示请求器是否已经做了初始化工作  

    private boolean hasInit = false;  

  

    // 连接超时时间,默认10秒  

    private int socketTimeout = 10000;  

  

    // 传输超时时间,默认30秒  

    private int connectTimeout = 30000;  

  

    // 请求器的配置  

    private RequestConfig requestConfig;  

  

    // HTTP请求器  

    private CloseableHttpClient httpClient;  

  

    public HttpsRequest() throws UnrecoverableKeyException,  

            KeyManagementException, NoSuchAlgorithmException,  

            KeyStoreException, IOException {  

        init();  

    }  

  

    private void init() throws IOException, KeyStoreException,  

            UnrecoverableKeyException, NoSuchAlgorithmException,  

            KeyManagementException {  

  

        // Trust own CA and all self-signed certs  

        SSLContext sslcontext = SSLContexts.custom().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();  

  

        // 根据默认超时限制初始化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, String postDataXML) throws IOException,  

            KeyStoreException, UnrecoverableKeyException,  

            NoSuchAlgorithmException, KeyManagementException {  

  

        if (!hasInit) {  

            init();  

        }  

  

        String result = null;  

  

        HttpPost httpPost = new HttpPost(url);  

  

        // 得指明使用UTF-8编码,否则到API服务器XML的中文不能被成功识别  

        StringEntity postEntity = new StringEntity(postDataXML, "UTF-8");  

        httpPost.addHeader("Content-Type", "text/xml");  

        httpPost.setEntity(postEntity);  

  

        // 设置请求器的配置  

        httpPost.setConfig(requestConfig);  

  

        try {  

            HttpResponse response = httpClient.execute(httpPost);  

  

            HttpEntity entity = response.getEntity();  

  

            result = EntityUtils.toString(entity, "UTF-8");  

  

        } catch (Exception e) {  

            e.printStackTrace();  

  

        } 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;  

    }  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: