1.官网下载银企直联系统的客户端和Ukey,官网地址:https://enterprise.bank.ecitic.com/corporbank/DownloadcenterNew.do#
2.准备对接参数,一般是中信通过邮件将相关证书和文档发到邮箱,相关接口文档可以去官网下载,其他证书需要实际对接才能去获取。
1.流程示意图简介:其实我们搭建的类似于银联的本地仿真系统,通过搭建中信银企通客户端进而和中信银企通直联服务器产生交互。
2.搭建流程:大家按照邮件中提供的步骤安装即可,该下载下载,该禁用禁用。这里需要说明一点,上面图片中的单一002(或者单一001)压缩包,里面的证书需要安装到个人目录下,才能在客户端登录的时候找到相应的证书对应登录名
3.客户端登录,环境搭建完成(登录后左下角显示联机状态即为登录成功,登陆成功后界面和未登录前是一致的,不用诧异)
1.确认和获取当前最新版的接口文档(截止20.4.16,官网获取的为4.0版本,对接人员提供的是6.0版本)
2.确认开发demo包和请求方式(Java语言目前没有demo包,所以我是手敲,均为post方式以xml格式请求中信服务器)
我对接的几个接口如下:
3.1.1 余额查询
3.1.3 账户明细信息查询
3.2.2 财务报销
3.6.5 交易状态查询
3.5.1 回单信息查询
3.5.2 电子回单下载
以中信余额查询接口为例:
请求地址:http://本机ip:银企直联客户端系统设置端口号/余额查询代码(http://127.0.0.1:6793/DLBALQRY(示例))
请求方式:post方式,参数体为xml(注意头文件,必须为双引号,否则会报报文格式错误)
xml格式解析:我是通过遍历我这边的map进行设置(接口文档中涉及多个账号的案例我做了特殊处理,此处只演示寻常案例)
private String mapToXml(Map map,Integer rowIndex) {
Element stream = DocumentHelper.createElement("stream");
for (Map.Entry entry : map.entrySet()) {
Element mapElement = stream.addElement(entry.getKey());
mapElement.addCDATA(entry.getValue());
}
String xmlInfo = "" + stream.asXML();
logger.info("请求中信组装xml原文为{}",new Object[] {xmlInfo});
return xmlInfo;
}
http请求装载:(注意接口文档描述,编码格式为GBK,故所有的编码格式需保持一致,才不会出现乱码)
//ZX_URL=http://127.0.0.1:6793/
//DLEXPENS=DLEXPENS
private String requestString(String xmlInfo) {
RequestEntity entity = null;
try {
entity = new StringRequestEntity(xmlInfo, "text/plain","GBK");
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
HttpClient client = new HttpClient();
PostMethod post = new PostMethod(ZX_URL+DLEXPENS);
post.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, "GBK");
post.setRequestEntity(entity);
String info = "";
try
{
client.executeMethod(post);
info = new String(post.getResponseBody(), "GBK");
logger.info("请求返回信息:"+info);
}
catch (Exception e)
{
e.printStackTrace();
}
return info;
}
涉及到相关的多账号遍历装载xml如下(涉及xml节点判断和遍历):
//rowIndex=0/1 代表是否为多账号遍历
private String mapToXml(Map map,Integer rowIndex) {
Element stream = DocumentHelper.createElement("stream");
for (Map.Entry entry : map.entrySet()) {
if(ACCOUNT_NO.equals(entry.getKey())&&"1".equals(rowIndex.toString())) {
String [] strArray = entry.getValue().split(",");
Element mapElement = stream.addElement("list").addAttribute("name", "userDataList");
for(String str : strArray) {
Element rowElement = mapElement.addElement("row");
rowElement.addElement(entry.getKey()).addCDATA(str);
}
}else if((BRSEQNO.equals(entry.getKey())||BILLTYPE.equals(entry.getKey()))&&"1".equals(rowIndex.toString())) {
Element childEle =(Element)stream.selectSingleNode("list");
Element rowElement = null;
if (null != childEle && childEle.hasContent()) {
stream.element("list").element("row").addElement(entry.getKey()).addCDATA(entry.getValue());
}else{
Element mapElement = stream.addElement("list").addAttribute("name", "userDataList");
rowElement = mapElement.addElement("row");
rowElement.addElement(entry.getKey()).addCDATA(entry.getValue());
}
}else {
Element mapElement = stream.addElement(entry.getKey());
mapElement.addCDATA(entry.getValue());
}
}
String xmlInfo = "" + stream.asXML();
logger.info("请求中信组装xml原文为{}",new Object[] {xmlInfo});
return xmlInfo;
}
涉及实体转map类(实体中不允许有null,否则会转换失败,该参数后的参数都会转换失败导致参数丢失)
public static Map object2Map(Object obj) {
Map map = new HashMap<>();
if (obj == null) {
return map;
}
Class clazz = obj.getClass();
Field[] fields = clazz.getDeclaredFields();
try {
for (Field field : fields) {
field.setAccessible(true);
map.put(field.getName(), field.get(obj).toString());
}
} catch (Exception e) {
e.printStackTrace();
}
return map;
}
最终就是后续联机测试啥的了,感觉xml对接的还是不怎么方便,返回参数的不同也无法直接做大量的公共处理,当做经验和记录吧。
后续有相关改动再更新(相关接口文档测试报告可以去资源类里面下载:)