浦发银行前置机配置很像工商银行。
来回请求的XML居然要加密和解密。。。。。太不人性,太啰嗦了。
调试了一下,终于OK了。
记录几个过程:
//浦发银行签名及解签名
public static InputStream send_sign(
byte[] content,//<body>
String contentType,//INFOSEC_SIGN/1.0
String url//http://ip:port
)
throws IOException {
URL urll = new URL(url);
HttpURLConnection con1 = (HttpURLConnection) urll.openConnection();
con1.setDoInput(true);
con1.setDoOutput(true);
con1.setRequestMethod("POST");
con1.setRequestProperty("Content-Type", contentType);
con1.setRequestProperty(
"Content-Length",
String.valueOf(content.length));
con1.connect();
con1.getOutputStream().write(content);
con1.getOutputStream().flush();
InputStream in = con1.getInputStream();
return in;
}
乱码转换,注意GB2312
//InputStream 转为String
public String convertStreamToString(InputStream is) throws Exception {
BufferedReader reader = new BufferedReader(new InputStreamReader(is,"GB2312"));
StringBuilder sb = new StringBuilder();
String line = null;
try {
while ((line = reader.readLine()) != null) {
// sb.append(line + "/n");
sb.append(line );
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return sb.toString();
}
字符串前面补0,或者后面补空格
String xml_send = String.format("%-6s%s", xml_real.length()+6, xml_real);//3508 <?xml version="1.0" 右侧补充空格
// String xml_send1 = String.format("%6s%s", xml_request.length()+6, xml_request);// 3508<?xml version="1.0"
// String xml_send2 = String.format("%06d%s", xml_request.getBytes().length+6, xml_request);//003508<?xml version= //文档这个方式不对!!!
JAVA对象转为XML对象:
//拼接完整请求XML 以取余额为例,测试前置机
private String getxml(String tcode,String xml_body) {
SimpleDateFormat format_date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String str_date = format_date.format(new Date());
SimpleDateFormat format_date1 = new SimpleDateFormat("yyyy-MM-dd");
String str_d = format_date1.format(new Date()).replace("-","");
SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss:SSS");
String str_t = format.format(new Date()).replace(":","");
System.out.println("Time is:"+str_date);
String packetID = (str_d+str_t).substring(0,16);//
System.out.println("packetID is:"+packetID);
String masterID = "2000040752";//企业号
String accno = "952A9997220008092";
//Blow 请求形成XML 测试 Req_Balance_4402 实际未来需要修改,并抽象,body部分不同,其他head都一致
String transCode = "4402";
Req_Balance_4402 req = new Req_Balance_4402();
Req_Balance_4402.Head head = new Req_Balance_4402.Head();
head.setTransCode(transCode);
head.setSignFlag(1);
head.setMasterID(masterID);
head.setPacketID(packetID);
head.setTimeStamp(str_date);
req.setHead(head);
Req_Balance_4402.Rq rq = new Req_Balance_4402.Rq();
Req_Balance_4402.ALists lists = new Req_Balance_4402.ALists();
List<String> acntNo = new ArrayList();
acntNo.add(accno);
Req_Balance_4402.AList list = new Req_Balance_4402.AList(acntNo);
lists.setList(list);
rq.setLists(lists);
req.setRq(rq);
XStreamUtil xStreamUtil = new XStreamUtil();
XStream xs = xStreamUtil.buildCOMBHINAXStream();
Map aliases = new HashMap();
aliases.put("packet", Req_Balance_4402.class);
XStreamMarshaller unmarshaller = xStreamUtil.buildXStreamMarshaller();
unmarshaller.setAliases(aliases);
String xml_test = "<?xml version='1.0' encoding='GB2312'?>" + xs.toXML(req); //
System.out.println(xml_test);
//按照单个功能代码的说明,形成如下格式,实际上是不能用的!!!!
//因为实际上要先形成body内容,而后body去签名,取得sign字段,再形成发送格式的XML 放到signature字段
// <?xml version='1.0' encoding='GB2312'?><packet>
// <head>
// <transCode>4402</transCode>
// <signFlag>1</signFlag>
// <packetID>2018011517255396</packetID>
// <masterID>2000040752</masterID>
// <timeStamp>2018-01-15 17:25:53</timeStamp>
// </head>
// <body>
// <lists name="acctList">
// <list>
// <acctNo>952A9997220008092</acctNo>
// </list>
// </lists>
// </body>
// </packet>
//Up 请求形成XML 测试
//BLow 修改后的,JAVA对象转XML
Req_sign_in re = new Req_sign_in();
Req_sign_in.Head he = new Req_sign_in.Head();
he.setTransCode(tcode);
he.setSignFlag(1);
he.setMasterID(masterID);
he.setPacketID(packetID);
he.setTimeStamp(str_date);
re.setHead(he);
Req_sign_in.Body bo = new Req_sign_in.Body();
bo.setSignature(xml_body);
re.setBody(bo);
XStreamUtil xStrUtil = new XStreamUtil();
XStream xst = xStrUtil.buildXStream();
Map alis = new HashMap();
aliases.put("packet", Req_sign_in.class);
XStreamMarshaller unmarshaller1 = xStrUtil.buildXStreamMarshaller();
unmarshaller1.setAliases(alis);
String xml_temp = xst.toXML(re);
xml_temp = xml_temp.replace("\n","");
xml_temp = xml_temp.replace(" ","");
String xml_real = "<?xml version='1.0' encoding='GB2312'?>" + xml_temp; //
System.out.println(xml_real);
//Up 修改后的,JAVA对象转XML
//BLow 旧测试
// String xml_request = "<?xml version='1.0' encoding='GB2312'?>" +
// "<packet>" +
// "<head>" +
// "<transCode>"+tcode+"</transCode>" +
// "<signFlag>1</signFlag>" +
// "<masterID>"+masterID+"</masterID>" +
// "<packetID>"+packetID+"</packetID>" +
// "<timeStamp>"+str_date+"</timeStamp>" +
// "</head>" +
// "<body><signature>" +
// xml_body +
// "</signature></body>"+
// "</packet>";
//Up 旧测试
String xml_send = String.format("%-6s%s", xml_real.length()+6, xml_real);//3508 <?xml version="1.0" 右侧补充空格
// String xml_send1 = String.format("%6s%s", xml_request.length()+6, xml_request);// 3508<?xml version="1.0"
// String xml_send2 = String.format("%06d%s", xml_request.getBytes().length+6, xml_request);//003508<?xml version= //文档这个方式不对!!!
return xml_send;
}
利用jsoup 解析HTML 到变量
//Step3.解签名 XML除去前面6位,然后用jsoup解析return_code为6个A时,读取signature;发送去解签
postResult = postResult.substring(6);//去除前6个字符
Document doc_result = Jsoup.parse(postResult);
Element e_return_code = doc_result.select("returnCode").first();//返回结果
String return_code = e_return_code.text();
if(!return_code.equals("AAAAAAA"))
{
System.out.println("调用失败!");
return;
}
Element e_sign = doc_result.select("signature").first();//查找第一个a元素
String str_sign_re = e_sign.text();
byte[] srtbyte_result = str_sign_re.getBytes();
Integer postResult_len = srtbyte_result.length;
String conType = "INFOSEC_VERIFY_SIGN/1.0; Content-Length/"+postResult_len.toString()+";";
InputStream in_result = send_sign(srtbyte_result,conType,http_sign_url);
String xml_request_result = convertStreamToString(in_result);
System.out.println("*****************************2:服务器解析结果******************************\n");
System.out.println(xml_request_result);
System.out.println("*****************************3:中文乱码处理结果******************************\n");
String newStr1 = new String(xml_request_result.getBytes("GB2312"), "GB2312");
System.out.println(newStr1);
// String newStr2 = EntityUtils.toString(entity1 , "GBK").trim();
//Step4.解析html结果
// Document doc_real = Jsoup.parse(xml_request_result,"utf-8");
Document doc_real = Jsoup.parse(xml_request_result,"GB2312");
// System.out.println(doc_real.body());
Elements elementList = doc_real.getElementsByTag("list");
// System.out.println(elementList.size());
if(ztype==2){
Elements ele_totalCount = doc_real.getElementsByTag("totalCount");
Integer totalCount = 0;//总记录数
totalCount = Integer.parseInt(ele_totalCount.select("totalCount").first().text().toString());//
System.out.println("总记录数:"+totalCount.toString());
}
for (Element element : elementList) {
if(ztype==1){
//4402余额结果
// <sic>
// <body>
// <lists name="acctBalanceList">
// <list>
// <acctNo>952A9997220008092</acctNo>
// <masterID>2489675304</masterID>
// <reserveBalance>0.00</reserveBalance>
// <freezeBalance>0.00</freezeBalance>
// <cortrolBalance>0.00</cortrolBalance>
// <canUseBalance>22259150.38</canUseBalance>
// <overdraftBalance>0.00</overdraftBalance>
// <balance>22259150.38</balance>
// </list>
// </lists>
// </body>
// </sic>
String acctNo = "";
String balance = "";
String canUseBalance = "";//可用余额
acctNo = element.select("acctNo").first().text().toString();//
balance = element.select("balance").first().text().toString();//
canUseBalance = element.select("canUseBalance").first().text().toString();//
System.out.println("acctNo:"+acctNo+" balance :"+balance+" ");
System.out.println("acctNo:"+acctNo+" canUseBalance :"+canUseBalance+" ");
}
else if(ztype==2){
// <lists name="HistoryList">
// <list>
// <voucherNo></voucherNo>
// <seqNo>999701700001</seqNo>
// <txAmount>2.13</txAmount>
// <balance>51827714.57</balance>
// <tranFlag>0</tranFlag>
// <transDate>20180102</transDate>
// <transTime>165952</transTime>
// <note>KM����0102170005</note>
// <remark>֧�����루���ʣ�</remark>
// <payeeBankNo>9520</payeeBankNo>
// <payeeBankName>�ַ����ݷ���Ӫҵ��</payeeBankName>
// <payeeAcctNo>952A9997220008349</payeeAcctNo>
// <payeeName>�ַ�2878487587</payeeName>
// <transCode>8801</transCode>
// <branchId>9520</branchId>
// <customerAcctNo></customerAcctNo>
// <payeeAcctType></payeeAcctType>
// <transCounter>99970170</transCounter>
// <authCounter></authCounter>
// <otherChar10></otherChar10>
// <otherChar40></otherChar40>
// <seqNum>1</seqNum>
// <revFlag>0</revFlag>
// </list>
// <list>
// <voucherNo></voucherNo>
// <seqNo>999701000001</seqNo>
String seqNo = "";//唯一标识ID
Integer tranFlag = 0;//借贷标志 0借 1贷
Double txAmount = 0.00;//交易金额
seqNo = element.select("seqNo").first().text().toString();//
tranFlag=Integer.parseInt(element.select("tranFlag").first().text().toString());//
txAmount = Double.parseDouble(element.select("txAmount").first().text().toString());
System.out.println("seqNo:"+seqNo+" tranFlag :"+tranFlag.toString()+" txAmount: "+txAmount.toString());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}