中信银行银企通对接

对接准备工作:

          1.官网下载银企直联系统的客户端和Ukey,官网地址:https://enterprise.bank.ecitic.com/corporbank/DownloadcenterNew.do#

 中信银行银企通对接_第1张图片

          2.准备对接参数,一般是中信通过邮件将相关证书和文档发到邮箱,相关接口文档可以去官网下载,其他证书需要实际对接才能去获取。

 

搭建中信银企通客户端环境:

        1.流程示意图简介:其实我们搭建的类似于银联的本地仿真系统,通过搭建中信银企通客户端进而和中信银企通直联服务器产生交互。

中信银行银企通对接_第2张图片

    2.搭建流程:大家按照邮件中提供的步骤安装即可,该下载下载,该禁用禁用。这里需要说明一点,上面图片中的单一002(或者单一001)压缩包,里面的证书需要安装到个人目录下,才能在客户端登录的时候找到相应的证书对应登录名

    中信银行银企通对接_第3张图片

3.客户端登录,环境搭建完成(登录后左下角显示联机状态即为登录成功,登陆成功后界面和未登录前是一致的,不用诧异)

中信银行银企通对接_第4张图片

中信银行银企通对接_第5张图片

具体接口对接开发:

     准备工作:

            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 电子回单下载

具体开发(Java):

    以中信余额查询接口为例:

 中信银行银企通对接_第6张图片

  请求地址: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;
    }

测试报告提交部署:

 中信银行银企通对接_第7张图片

中信银行银企通对接_第8张图片

     最终就是后续联机测试啥的了,感觉xml对接的还是不怎么方便,返回参数的不同也无法直接做大量的公共处理,当做经验和记录吧。

      后续有相关改动再更新(相关接口文档测试报告可以去资源类里面下载:)

你可能感兴趣的:(中信银企通)