IBM服务器中HTTPS发送银行请求报文

MaryL2 2013-09-23 05:53:50
之前试了N种方法在IBM服务上通过HTTPS发送报文总是出现错误,现在终于弄好了,提供给大家参考下,在发送报文时需要导入相应的证书及得到相关的秘钥进行签名,大概步骤如下:
1.组织发送的报文
2.执行QuickPayTester.doPost方法,传入相应参数
QuickPayTester.doPost(请求URL地址,头部内容定义,发送的报文,编码格式)

相关类:
package com.hisun.bojbank.qcpay;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.StringWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.Map;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.KeyManager;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpConnectionManager;
import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.StringRequestEntity;
import org.apache.commons.httpclient.params.HttpClientParams;
import org.apache.commons.httpclient.params.HttpConnectionManagerParams;
import org.apache.commons.httpclient.protocol.Protocol;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;



import com.hisun.hilog4j.HiLog;
import com.hisun.hilog4j.Logger;
import com.hisun.message.HiMessage;


public class QuickPayTester {
private static final String METHOD_POST = "POST";
private static final String DEFAULT_CHARSET = "utf-8";
private static Log log = LogFactory.getLog(KeyTest.class);

public static String doPost(String url, String params, String charset, int connectTimeout, int readTimeout,HiMessage msg) throws Exception {
String ctype = "application/json;charset=" + charset;
byte[] content = {};
if(params != null){
content = params.getBytes(charset);
}

return doPost(url, ctype, content, connectTimeout, readTimeout,msg);
}



private static HttpConnectionManager connectionManager;

static{
// 创建一个线程安全的HTTP连接池
connectionManager = new MultiThreadedHttpConnectionManager();
HttpConnectionManagerParams params = new HttpConnectionManagerParams();
// 连接建立超时
params.setConnectionTimeout(6 * 1000000);
// 数据等待超时
params.setSoTimeout(6 * 1000000);
// 默认每个Host最多10个连接
params.setDefaultMaxConnectionsPerHost(10);
// 最大连接数(所有Host加起来)
params.setMaxTotalConnections(200);

connectionManager.setParams(params);
}

public static String doPost(String url,Map<String, String>head,String content,String charSet){
PostMethod method = new PostMethod(url);
HttpClientParams httpClientParams = new HttpClientParams();
httpClientParams.setContentCharset(charSet);
HttpClient httpClient = new HttpClient(httpClientParams, connectionManager);
Protocol myhttps = new Protocol("https", new MySSLProtocolSocketFactory2(), 443);
Protocol.registerProtocol("https", myhttps);
String reqStr = content;

for (Map.Entry<String, String> item : head.entrySet()) {
method.addRequestHeader(item.getKey(), item.getValue());
}
try {
method.setRequestEntity(new StringRequestEntity(reqStr, null, charSet));
int executeMethod = httpClient.executeMethod(method);
//logger.debug("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>response status:::::" + executeMethod + "\n");
// 获得返回报文
String resStr = method.getResponseBodyAsString();
return resStr;
}
catch (Exception e) {
e.printStackTrace();
return null;
}
finally {
method.releaseConnection();
}
}

public static String doPost(String url, String ctype, byte[] content,int connectTimeout,int readTimeout,HiMessage msg) throws Exception {
Logger log = HiLog.getLogger(msg);
// 设置代理
// String proxy = "172.16.1.35";
// int port = 80;
// System.setProperty("proxyType", "4");
// System.setProperty("proxyPort", Integer.toString(port));
// System.setProperty("proxyHost", proxy);
// System.setProperty("proxySet", "true");

HttpsURLConnection conn = null;
OutputStream out = null;
String rsp = null;
try {
try{
SSLContext ctx = SSLContext.getInstance("SSL","IBMJSSE2");
//SSLContext ctx = SSLContext.getInstance("SSL");
ctx.init(null, new TrustManager[]{new DefaultTrustManager()}, new java.security.SecureRandom());
// ctx.init(new KeyManager[0], new TrustManager[] {new DefaultTrustManager()}, new SecureRandom());
SSLContext.setDefault(ctx);

conn = getConnection(new URL(url), METHOD_POST, ctype);
conn.setHostnameVerifier(new HostnameVerifier() {


@Override
public boolean verify(String arg0, SSLSession arg1) {
// TODO Auto-generated method stub
return true;
}
});
conn.setConnectTimeout(connectTimeout);
conn.setReadTimeout(readTimeout);
}catch(Exception e){
log.error("GET_CONNECTOIN_ERROR, URL = " + url, e.getMessage());
log.info("TESTER:"+e.getMessage());
throw e;
}
try{
out = conn.getOutputStream();
out.write(content);
rsp = getResponseAsString(conn);
}catch(IOException e){
log.error("REQUEST_RESPONSE_ERROR, URL = " + url, e.getMessage());
log.info("TESTER:"+e.getMessage());
throw e;
}

}finally {
if (out != null) {
out.close();
}
if (conn != null) {
conn.disconnect();
}
}

return rsp;
}

private static class DefaultTrustManager implements X509TrustManager {

@Override
public void checkClientTrusted(X509Certificate[] arg0, String arg1)
throws CertificateException {
// TODO Auto-generated method stub

}

@Override
public void checkServerTrusted(X509Certificate[] arg0, String arg1)
throws CertificateException {
// TODO Auto-generated method stub

}

@Override
public X509Certificate[] getAcceptedIssuers() {
// TODO Auto-generated method stub
return null;
}



}

private static HttpsURLConnection getConnection(URL url, String method, String ctype)
throws IOException {
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setRequestMethod(method);
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setRequestProperty("Accept", "text/xml,text/javascript,text/html");
conn.setRequestProperty("User-Agent", "stargate");
conn.setRequestProperty("Content-Type", ctype);
return conn;
}

protected static String getResponseAsString(HttpURLConnection conn) throws IOException {
String charset = getResponseCharset(conn.getContentType());
InputStream es = conn.getErrorStream();
if (es == null) {
return getStreamAsString(conn.getInputStream(), charset);
} else {
String msg = getStreamAsString(es, charset);
if (StringUtils.isEmpty(msg)) {
throw new IOException(conn.getResponseCode() + ":" + conn.getResponseMessage());
} else {
throw new IOException(msg);
}
}
}

private static String getStreamAsString(InputStream stream, String charset) throws IOException {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(stream, charset));
StringWriter writer = new StringWriter();

char[] chars = new char[256];
int count = 0;
while ((count = reader.read(chars)) > 0) {
writer.write(chars, 0, count);
}

return writer.toString();
} finally {
if (stream != null) {
stream.close();
}
}
}

private static String getResponseCharset(String ctype) {
String charset = DEFAULT_CHARSET;

if (!StringUtils.isEmpty(ctype)) {
String[] params = ctype.split(";");
for (String param : params) {
param = param.trim();
if (param.startsWith("charset")) {
String[] pair = param.split("=", 2);
if (pair.length == 2) {
if (!StringUtils.isEmpty(pair[1])) {
charset = pair[1].trim();
}
}
break;
}
}
}

return charset;
}
}
...全文
197 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
zoeg 2013-09-24
  • 打赏
  • 举报
回复
跟IBM服务器啥关系?
MaryL2 2013-09-23
  • 打赏
  • 举报
回复
进行SSL链接时需要用到MySSLProtocolSocketFactory这个类,网上有很多例子,附上这个类内容超出访问了,各位自己再网上搜索就行了

67,515

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧