package com.ibeetl.admin.console.service.pay.utils;
|
|
import java.io.File;
|
import java.io.FileInputStream;
|
import java.io.IOException;
|
import java.net.SocketTimeoutException;
|
import java.security.KeyManagementException;
|
import java.security.KeyStore;
|
import java.security.KeyStoreException;
|
import java.security.NoSuchAlgorithmException;
|
import java.security.UnrecoverableKeyException;
|
import java.security.cert.CertificateException;
|
import javax.net.ssl.SSLContext;
|
import com.ibeetl.admin.console.service.pay.utils.entity.TransfersDto;
|
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;
|
|
public class HttpRequestHandler
|
{
|
|
// 连接超时时间,默认10秒
|
private int socketTimeout = 10000;
|
|
// 传输超时时间,默认30秒
|
private int connectTimeout = 30000;
|
|
// 请求器的配置
|
private static RequestConfig requestConfig;
|
|
// HTTP请求器
|
private static CloseableHttpClient httpClient;
|
|
/**
|
* 加载证书
|
*
|
* @param mchId
|
* @param certPath
|
* @throws IOException
|
* @throws KeyStoreException
|
* @throws UnrecoverableKeyException
|
* @throws NoSuchAlgorithmException
|
* @throws KeyManagementException
|
*/
|
private static void initCert(String mchId, String certPath) throws Exception {
|
// 证书密码,默认为商户ID
|
String key = mchId;
|
// 证书的路径
|
String path = certPath;
|
// 指定读取证书格式为PKCS12
|
KeyStore keyStore = KeyStore.getInstance("PKCS12");
|
// 读取本机存放的PKCS12证书文件
|
FileInputStream instream = new FileInputStream(new File(path));
|
try {
|
// 指定PKCS12的密码(商户ID)
|
keyStore.load(instream, key.toCharArray());
|
} finally {
|
instream.close();
|
}
|
SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, key.toCharArray()).build();
|
SSLConnectionSocketFactory sslsf =
|
new SSLConnectionSocketFactory(sslcontext, new String[] {"TLSv1"}, null,
|
SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
|
httpClient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
|
}
|
/*private static void initCert(String path, TransfersDto transfer)
|
throws IOException, KeyStoreException, UnrecoverableKeyException,
|
NoSuchAlgorithmException, KeyManagementException
|
{
|
// 拼接证书的路径
|
//KeyStore keyStore = KeyStore.getInstance("PKCS12", path, transfer.map());
|
KeyStore store = KeyStore.getInstance ( "PKCS12" );
|
|
// 加载本地的证书进行https加密传输
|
FileInputStream instream = new FileInputStream(new File(path));
|
try
|
{
|
keyStore.load(instream, transfer.getMchid().toCharArray()); // 加载证书密码,默认为商户ID
|
}
|
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,
|
transfer.getMchid().toCharArray()).build();*//*
|
SSLContext sslcontext = org.apache.http.ssl.SSLContexts.custom()
|
.loadKeyMaterial(keyStore, "1546567611".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();
|
|
// 根据默认超时限制初始化requestConfig
|
requestConfig = RequestConfig.custom().setSocketTimeout(10000).setConnectTimeout(30000).build();
|
|
}*/
|
|
/**
|
* 通过Https往API post xml数据
|
*
|
* @param url
|
* API地址
|
* @param xmlObj
|
* 要提交的XML数据对象
|
* @param path
|
* 当前目录,用于加载证书
|
* @return
|
* @throws IOException
|
* @throws KeyStoreException
|
* @throws UnrecoverableKeyException
|
* @throws NoSuchAlgorithmException
|
* @throws KeyManagementException
|
*/
|
public static String httpsRequest(String url, String xmlObj, TransfersDto model, String path)
|
throws IOException, KeyStoreException, UnrecoverableKeyException,
|
NoSuchAlgorithmException, KeyManagementException
|
{
|
// 加载证书
|
try {
|
initCert(model.getMchid(), path);
|
} catch (Exception e) {
|
System.out.println("加载证书失败!");
|
e.printStackTrace();
|
}
|
String result = null;
|
HttpPost httpPost = new HttpPost(url);
|
// 得指明使用UTF-8编码,否则到API服务器XML的中文不能被成功识别
|
StringEntity postEntity = new StringEntity(xmlObj, "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 (ConnectionPoolTimeoutException e)
|
{
|
|
}
|
catch (ConnectTimeoutException e)
|
{
|
|
}
|
catch (SocketTimeoutException e)
|
{
|
|
}
|
catch (Exception e)
|
{
|
|
}
|
finally
|
{
|
httpPost.abort();
|
}
|
|
return result;
|
}
|
}
|