微信支付之退款 带apiclient_cert.p12证书的请求方法 JAVA版

微信支付 带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

猜你喜欢

转载自blog.csdn.net/Mr1shuai/article/details/81184098