工行银企直联(dom4j无中间件版)
最近,接手了工行银企直联的任务,在网上找了很多,发现能一次说清的文章很少,此篇文章专为第一次接触银企直联的同学准备。
1、准备包:dom4j(自行百度,如果这一步都不知道怎么做,接下来的过程也就别看了)
2、逻辑
3、Http的Post方法
//工行支付前对报文签名
public static String signICBC(String url, String param) {
PrintWriter out = null;
BufferedReader in = null;
String result = "";
try {
URL realUrl = new URL(url);
// 打开和URL之间的连接
URLConnection conn = realUrl.openConnection();
// 设置通用的请求属性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
conn.setRequestProperty("Content-Type", "INFOSEC_SIGN/1.0");
conn.setRequestProperty("Content-Length", String.valueOf(param.length()));
// 发送POST请求必须设置如下两行
conn.setDoOutput(true);
conn.setDoInput(true);
// 获取URLConnection对象对应的输出流
out = new PrintWriter(conn.getOutputStream());
// 发送请求包
out.write(param);
// flush输出流的缓冲
out.flush();
// 定义BufferedReader输入流来读取URL的响应
in = new BufferedReader(
new InputStreamReader(conn.getInputStream(),"GB2312"));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (Exception e) {
System.out.println("发送 POST 请求出现异常!"+e);
e.printStackTrace();
}
//使用finally块来关闭输出流、输入流
finally{
try{
if(out!=null){
out.close();
}
if(in!=null){
in.close();
}
}
catch(IOException ex){
ex.printStackTrace();
}
}
return result;
}
//工行发送Post方法
@Autowired
FiveFinanceXML fiveFinanceXML;
public String postICBC(String packageId,String transCode,String xml,Boolean sign,String version,String zip){
String NCIp = "127.0.0.1";//NC IP地址
String NCPort = "7070"; //NC 加密端口号
String NCPort2 = "7080"; //签名端口号
boolean signatureflg = sign;//是否对交易签名
String retcertPath = "E:\\admin.crt";//工行公钥 admin.crt所在路径
String result = "";
try {
String sCoding = "GBK";//编码格式
String cmpVersion = version;//接口版本 0.0.0.1或者0.0.1.0
String sZip = zip;//是否大文件方式:0,1
String sLanguage = "zh_CN";//语言
//下面字段与明文xml包中保持一致
String sPackageID = packageId;
// String sPackageID = "PERDIS1240225001352809";//包序列号与xml包中保持一致
String sTransCode = transCode;//交易代码
String sBankCode = "102";//银行编码
String sGroupCIS = "自己填";//集团CIS号
String sID = "自己填";//证书ID
String sContent = xml;
System.out.println(sContent);
//提交类报文明文xml包
sContentSign = sContent;
if (signatureflg) {
//需要签名
java.net.URL aURL = new java.net.URL("http://" + NCIp + ":" + NCPort2);//NCPort2 签名端口号
java.net.HttpURLConnection urlConnection = (java.net.HttpURLConnection) aURL.openConnection();
urlConnection.setRequestMethod("POST");
urlConnection.setDoInput(true);
urlConnection.setDoOutput(true);
urlConnection.setUseCaches(false);
urlConnection.setRequestProperty("Content-Length",String.valueOf(sContentSign.getBytes(sCoding).length));
urlConnection.setRequestProperty("Content-Type","INFOSEC_SIGN/1.0");
BufferedOutputStream out = new BufferedOutputStream(urlConnection.getOutputStream());
out.write(sContentSign.getBytes(sCoding));
out.flush();
out.close();
int responseCode = urlConnection.getResponseCode();
if (responseCode != 200){
System.out.println("NC签名失败");
}
String resM = urlConnection.getResponseMessage();//NC签名结果
StringBuffer repContent = new StringBuffer("");
InputStreamReader in = new InputStreamReader(urlConnection.getInputStream