最近在对接中行银行接口,在获取返回报文的时候遇到一些问题,现在在这里做个总结

TIP:

在返回报文之前,要对前置机的URL请求,在这期间遇到一个坑,还是通过查看日志才发现问题

在填写转账信息的时候要求输入转账公司名称,但是银行接口又不会强制对转账公司名称校验,而且转账操作也会显示成功,只是在查询交易状态的时候才会显示

交易失败被银行退回/收款人账号和收款人名称不一致的错误

当时有点懵逼,还仔细检查到底有没有输错信息 = =

后来使用Postman把我要发送的报文粘贴进去,发现成功!这时候才发现是编码问题

原来

最开始使用下面方法设置字符集

// 设置文件字符集:
conn.setRequestProperty("Charset", "UTF-8");

发现这样不会把字符设置为UTF-8的编码,所以系统就取了默认的编码格式

原来是要在转换为字节数组的时候给它设置字符编码

//转换为字节数组
byte[] data = xml.getBytes("UTF-8");

1.普通报文

<?xml version="1.0" encoding="UTF-8"?>
<bocb2e version="120" locale="zh_CN">
<head>
<termid>E192168000105</termid>
<trnid>20060704001</trnid>
<custid>133724203</custid>
<cusopr>135989127</cusopr>
<trncod>b2e0001</trncod>
<token>SyX3PnpuNdIQm6FDj1SgZn8</token>
</head>
<trans>
<trn-b2e0001-rs>
<status>
<rspcod>B001</rspcod>
<rspmsg>ok</rspmsg>
</status>
<serverdt>20180126105944</serverdt>
<token>SyX3PnpuNdIQm6FDj1SgZn8</token>
</trn-b2e0001-rs>
</trans>
</bocb2e>

上面是调用银行接口成功签到的报文,类似于这样的特征就比较明显,不需要做任何处理,就能通过下面Dom4j提供的基础方法对每个节点进行操作

Document document = DocumentHelper.parseText("传入的报文");
//获取文档根节点
Element root = document.getRootElement();

上面方法就已经获取到返回报文的根节点了,这个时候你就能获取到任何你想要的节点参数了

例如:

获取b2e0001-rs节点下面status的值

Element rspcodElem = root.element("trans").element("trn-b2e0001-rs").element("status")
.element("rspcod");
rspcodElem.getStringValue()//节点的值
rspcodElem.getName()//节点名称

想要获取其他节点值也与上面方法一样

2.报文中含有规律重复节点处理

例如接口中的历史余额查询返回的报文

<?xml version="1.0" encoding="UTF-8"?>
<bocb2e version="120" locale="zh_CN">
<head>
<termid>E192168000105</termid>
<trnid>04051003128</trnid>
<custid>133724203</custid>
<cusopr>135989127</cusopr>
<trncod>b2e0012</trncod>
<token>PCxkDXIhAPRtlBhuqF-6A-V</token>
</head>
<trans>
<trn-b2e0012-rs>
<status>
<rspcod>B001</rspcod>
<rspmsg>ok</rspmsg>
</status>
<b2e0012-rs>
<status>
<rspcod>B001</rspcod>
<rspmsg>ok</rspmsg>
</status>
<account>
<ibknum>47504</ibknum>
<actacn>726357720234</actacn>
<curcde>CNY</curcde>
</account>
<balance>
<bokbal>199799896.54</bokbal>
<avabal>199799871.54</avabal>
</balance>
<baldat>20180102</baldat>
</b2e0012-rs>
<b2e0012-rs>
<status>
<rspcod>B001</rspcod>
<rspmsg>ok</rspmsg>
</status>
<account>
<ibknum>47504</ibknum>
<actacn>726357720234</actacn>
<curcde>CNY</curcde>
</account>
<balance>
<bokbal>199799871.54</bokbal>
<avabal>199799871.54</avabal>
</balance>
<baldat>20180103</baldat>
</b2e0012-rs>
</trn-b2e0012-rs>
</trans>
</bocb2e>

上面返回的报文中就有多个b2e0012-rs节点,这种情况就不能像上面简单的去获取,要特殊处理

1.使用递归去遍历每个节点,在遍历到b2e0012-rs时候,操作就和普通的一样

private static void   getHistoryBalanceChildNodes(Element elem){
HistoryBalanceBank historyBalanceBank=new HistoryBalanceBank();
if (("b2e0012-rs").equals(elem.getName())){
historyBalanceBank.setRspcod(elem.element("status").element("rspcod").getStringValue());
historyBalanceBank.setRspmsg(elem.element("status").element("rspmsg").getStringValue());
if (("B001").equals(elem.element("status").element("rspcod").getStringValue())){
historyBalanceBank.setIbknum(elem.element("account").element("ibknum").getStringValue());
historyBalanceBank.setActacn(elem.element("account").element("actacn").getStringValue());
historyBalanceBank.setCurcde(elem.element("account").element("curcde").getStringValue());
historyBalanceBank.setBokbal(elem.element("balance").element("bokbal").getStringValue());
historyBalanceBank.setAvabal(elem.element("balance").element("avabal").getStringValue());
historyBalanceBank.setBaldat(elem.element("baldat").getStringValue());
}
historyBalanceBanks.add(historyBalanceBank);
}
Iterator<Node> it= elem.nodeIterator();
while (it.hasNext()){
Node node = it.next();
if (node instanceof Element){
Element e1 = (Element)node;
getHistoryBalanceChildNodes(e1);
}
}
}

2.上面的historyBalanceBanks是定义了一个全局静态变量

 //历史余额List
private static List<HistoryBalanceBank> historyBalanceBanks=new ArrayList<HistoryBalanceBank>();

在调用递归方法之后将historyBalanceBanks塞入到返回的实体类中,大功告成

调用中行接口针对返回报文(xml形式)做相关处理的更多相关文章

  1. C#调用sap接口及返回数据到sap

    public class SapClass { /// <summary> /// /// </summary> /// <param name="fphm&q ...

  2. 调用WebAPI接口地址返回序列化的JSON对象中的属性都加了个k__BackingField关键字的解决办法

    1.问题现象: 2.造成此问题的原因是返回的结果对象实体上面加了个可序列号特效 [Serializable].去掉就可以了. 3.解决后的效果:

  3. 调用wsdl接口,参数是xml格式

    1.最近太累了,好困.闲话少许直奔主题吧.上代码 try{ String wsurl = "http://172.16.16.236:9999/xxx/ws/WSService?wsdl&q ...

  4. C#调用C++接口返回字符串的做法

    作者:朱金灿 来源:http://blog.csdn.net/clever101 现在有这样一种情景,假如C#调用C++接口需要返回一个字符串.因为字符串是不定长的,因此传递一个定长的字符串进去是不合 ...

  5. python3.4.3 调用http接口 解析response xml后插入数据库

    工作中需要调用一个http的接口,等不及java组开发,就试着用python去调用.Python版本3.4.3 完整的流程包括:从sqlServer取待调用的合同列表 -> 循环调用http接口 ...

  6. Python调用API接口的几种方式

    Python调用API接口的几种方式 相信做过自动化运维的同学都用过API接口来完成某些动作.API是一套成熟系统所必需的接口,可以被其他系统或脚本来调用,这也是自动化运维的必修课. 本文主要介绍py ...

  7. VB调用WebService(SOA2.0接口)(直接Post方式)并解析返回的XML

    SOA 2.0接口 Function GetDepartmentCode(reqDeptCode) Dim soaRequestXML : soaRequestXML = "" D ...

  8. httpClient调用接口的时候,解析返回报文内容

    比如我httpclient调用的接口返回的格式是这样的: 一:data里是个对象 { "code": 200, "message": "执行成功&qu ...

  9. WebService如何封装XML请求 以及解析接口返回的XML

    原 WebService如何封装XML请求 以及解析接口返回的XML 置顶 2019年08月16日 15:00:47 童子泛舟 阅读数 28 标签: XML解析WebService第三方API 更多 ...

随机推荐

  1. 部分vivo和oppo手机,使用上传图片功能,可能会出现退出webview的现象(回退到app的入口页面)

    在公司的app里面嵌入了一个h5页面,h5页面有个使用图片上传功能,上传图片出现闪退的现象 问题描述:vivo手机,在app内的wap页面使用上传图片的功能,在选择好图片点击确认按钮后,出现退出整个w ...

  2. apache(XAMPP)禁止IP访问的httpd-vhosts.conf设置

    httpd-vhosts.conf <virtualhost *:80> ServerName 123.123.123.123   ServerAlias 123.123.123.123  ...

  3. CF85E Guard Towers(二分答案+二分图)

    题意 已知 N 座塔的坐标,N≤5000 把它们分成两组,使得同组内的两座塔的曼哈顿距离最大值最小 在此前提下求出有多少种分组方案 mod 109+7 题解 二分答案 mid 曼哈顿距离 >mi ...

  4. Python对象的循环引用问题

    目录 Python对象循环引用 循环引用垃圾回收算法 容器对象 生成容器对象 追踪容器对象 结束追踪容器对象 分代容器对象链表 何时执行循环引用垃圾回收 循环引用的垃圾回收 循环引用中的终结器 pyt ...

  5. vue滚动行为

    有人问道如何记录vue页面的滚动条位置,再次载入组件的时候页面滚动到记录的位置? 思路: 记录滚动条位置我们好记 我们要在组件销毁之前也就是页面跳转的时候 需要用到生命周期beforeDistory将 ...

  6. vue2.0学习教程

    十分钟上手-搭建vue开发环境(新手教程)https://www.jianshu.com/p/0c6678671635 如何在本地运行查看github上的开源项目https://www.jianshu ...

  7. 05-数据类型转换(bool类型)

  8. 题解 P3521 【[POI2011]ROT-Tree Rotations】

    这道题采用权值线段树合并的解法. 首先讲一下解法中出现的两个概念:权值线段树与线段树合并. 所谓权值线段树,可以理解为维护的信息反过来的普通线段树,我个人认为值域线段树这个名字其实要准确一些. 举个例 ...

  9. 【转】[译]理解HTTP/304响应

    [转][译]理解HTTP/304响应 原文:http://www.telerik.com/automated-testing-tools/blog/eric-lawrence/12-11-06/und ...

  10. 七牛用户搭建c# sdk的图文讲解

    Qiniu 七牛问题解答 问题描写叙述:非常多客户属于小白类型. 可是请不要随便喷七牛的文档站.由于须要一点http的专业知识才干了解七牛的api文档.如今我给大家弄个c# sdk的搭建步骤 问题解决 ...