微信支付 带apiclient_cert.p12证书的请求方法 JAVA版
以下是带apiclient_cert.p12证书的请求方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
|
package
utils.wechat;
import
java.io.File;
import
java.io.FileInputStream;
import
java.io.IOException;
import
java.security.KeyStore;
import
javax.net.ssl.SSLContext;
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;
/**
* 获取微信apiclient_cert.p12证书
*
* @author zengwei
* @email [email protected]
* @date 2018年4月5日 下午4:49:36
*/
@SuppressWarnings
(
"deprecation"
)
public
class
CertHttpUtil {
private
static
int
socketTimeout =
10000
;
// 连接超时时间,默认10秒
private
static
int
connectTimeout =
30000
;
// 传输超时时间,默认30秒
private
static
RequestConfig requestConfig;
// 请求器的配置
private
static
CloseableHttpClient httpClient;
// HTTP请求器
/**
* 通过Https往API post xml数据
*
* @param url API地址
* @param xmlObj 要提交的XML数据对象
* @param mchId 商户ID
* @param certPath 证书位置
* @return
*/
public
static
String postData(String url, String xmlObj, String mchId, String certPath) {
// 加载证书
try
{
initCert(mchId, certPath);
}
catch
(Exception e) {
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);
// 根据默认超时限制初始化requestConfig
requestConfig = RequestConfig.custom().setSocketTimeout(socketTimeout).setConnectTimeout(connectTimeout).build();
// 设置请求器的配置
httpPost.setConfig(requestConfig);
try
{
HttpResponse response =
null
;
try
{
response = httpClient.execute(httpPost);
}
catch
(IOException e) {
e.printStackTrace();
}
HttpEntity entity = response.getEntity();
try
{
result = EntityUtils.toString(entity,
"UTF-8"
);
}
catch
(IOException e) {
e.printStackTrace();
}
}
finally
{
httpPost.abort();
}
return
result;
}
/**
* 加载证书
*
* @param mchId 商户ID
* @param certPath 证书位置
* @throws Exception
*/
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();
}
}
|
转载:離殤望孏951118 https://www.cnblogs.com/zengweiB208/p/9025545.html