1 package action;
2
3 import java.io.BufferedReader;
4 import java.io.ByteArrayOutputStream;
5 import java.io.File;
6 import java.io.FileInputStream;
7 import java.io.FileNotFoundException;
8 import java.io.IOException;
9 import java.io.InputStream;
10 import java.io.InputStreamReader;
11 import java.io.OutputStream;
12 import java.io.PrintWriter;
13 import java.net.URL;
14 import java.net.URLConnection;
15 import java.util.HashMap;
16 import java.util.Map;
17 import java.util.List;
18 import java.security.KeyStore;
19 import java.security.KeyStoreException;
20 import java.security.NoSuchAlgorithmException;
21 import java.security.UnrecoverableKeyException;
22 import java.security.cert.CertificateException;
23
24 import javax.net.ssl.HttpsURLConnection;
25 import javax.net.ssl.KeyManagerFactory;
26 import javax.net.ssl.SSLContext;
27 import javax.net.ssl.SSLSocketFactory;
28 import javax.net.ssl.TrustManager;
29
30 import com.bill99.mgw.entity.*;
31 import com.bill99.mgw.util.*;
32
33 public class Post
34 {
35 /**
36 * 向指定URL发送POST方法的请求
37 * @param url 发送请求的URL
38 * @param param 请求参数,请求参数应该是name1=value1&name2=value2的形式。
39 * @return URL所代表远程资源的响应
40 * @throws Exception
41 */
42 public static HashMap sendPost(String url,String tr1XML) throws Exception
43 {
44 OutputStream out = null;
45 HashMap respXml = null;
46
47 //获取证书路径
48 File certFile = new File("C://TS/10411004511201290.jks");
49 //File certFile = new File("D://hui.ding/workspace/DH_QuickPay/src/10411004511201290.jks");
50 //访问Java密钥库,JKS是keytool创建的Java密钥库,保存密钥。
51 KeyStore ks = KeyStore.getInstance("JKS");
52 ks.load(new FileInputStream(certFile), "vpos123".toCharArray());
53 //创建用于管理JKS密钥库的密钥管理器
54 KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
55 //初始化证书
56 kmf.init(ks, "vpos123".toCharArray());
57
58 //同位体验证信任决策源//同位体验证可信任的证书来源
59 TrustManager[] tm = { new MyX509TrustManager() };
60
61 //初始化安全套接字
62 SSLContext sslContext = SSLContext.getInstance("SSL");
63 //初始化SSL环境。第二个参数是告诉JSSE使用的可信任证书的来源,设置为null是从javax.net.ssl.trustStore中获得证书。
64 //第三个参数是JSSE生成的随机数,这个参数将影响系统的安全性,设置为null是个好选择,可以保证JSSE的安全性。
65 sslContext.init(kmf.getKeyManagers(),tm, null);
66
67 //根据上面配置的SSL上下文来产生SSLSocketFactory,与通常的产生方法不同
68 SSLSocketFactory factory = sslContext.getSocketFactory();
69
70 try
71 {
72 URL realUrl = new URL(url);
73 //打开和URL之间的连接
74 HttpsURLConnection conn = (HttpsURLConnection)realUrl.openConnection();
75 //创建安全的连接套接字
76 conn.setSSLSocketFactory(factory);
77 //发送POST请求必须设置如下两行,使用 URL 连接进行输出、入
78 conn.setDoOutput(true);
79 conn.setDoInput(true);
80 //设置URL连接的超时时限
81 conn.setReadTimeout(100000);
82
83 //设置通用的请求属性
84 String authString = "104110045112012" + ":" + "vpos123";
85 String auth = "Basic " + Base64Binrary.encodeBase64Binrary(authString.getBytes());
86 conn.setRequestProperty("Authorization", auth);
87
88 // 获取URLConnection对象对应的输出流
89 out = conn.getOutputStream();
90 //发送请求参数
91 out.write(tr1XML.getBytes("utf-8"));
92 //flush 输出流的缓冲
93 out.flush();
94
95 //得到服务端返回
96 InputStream is = conn.getInputStream();
97 String reqData = "";
98 if(is!=null && !"".equals(is))
99 {
100 ByteArrayOutputStream bos = new ByteArrayOutputStream();
101 byte[] receiveBuffer = new byte[2048];//缓冲区长度
102 int readBytesSize = is.read(receiveBuffer);//读取数据长度,InputStream要读取的数据长度一定要小于等于缓冲区中的字节数
103 System.out.println("#######readBytesSize:"+readBytesSize);
104
105 while(readBytesSize != -1){//判断流是否位于文件末尾而没有可用的字节
106 bos.write(receiveBuffer, 0, readBytesSize);//从receiveBuffer内存处的0偏移开始写,写与readBytesSize长度相等的字节
107 readBytesSize = is.read(receiveBuffer);
108 System.out.println("#######bos:"+bos);
109 }
110 reqData = new String(bos.toByteArray(), "UTF-8");//编码后的tr2报文
111 }
112 System.out.println("tr2报文:"+reqData);
113 respXml= ParseUtil.parseXML(reqData);//给解析XML的函数传递快钱返回的TR2的XML数据流
114
115 }
116 catch(Exception e)
117 {
118 System.out.println("发送POST请求出现异常!" + e);
119 e.printStackTrace();
120 }
121 //使用finally块来关闭输出流、输入流
122 finally
123 {
124 if (out != null){out.close();}
125 //if (in != null){in.close();}
126 }
127 return respXml;
128 }
129
130 }