建行E商贸通对接【1】

来源:互联网 发布:淘宝怎么查全年销售额 编辑:程序博客网 时间:2024/04/28 16:51

工作N多年了,从来没写过技术博客,最近在做建行的E商贸通对接,文档比较有限,对相关业务和名词也不是很熟悉,很多基础知识也不扎实,前面同事已经做了一部分基础工作,但是刚接手的时候确实有点蒙。幸亏在网上搜到这个博客系列,了解了一些基本概念,才顺利开发完建行的接口,也突然有冲动把相关的东西整理一下,做个记录,也方便遇到类似问题的码农。


1:业务背景


首先先介绍一下背景,我个人是这样,如果不知道一个东西的定义,就很难去学习其他方面。我个人的理解,建行的商贸通,以及其他银行类似的产品,都是依托银行的资金管理能力,为交易市场(比如大宗交易,以及各种交易所等)提供资金托管的接口,和证券公司使用的银证托管类似。目的就是为了交易资金的安全,防止跑路等。


交易所涉及到商贸通的基本业务包括:

  • 签到:即通知银行,交易所开市,开市接受会员的出入金等操作。
  • 签退:与签到相反,表示交易所收市,停止营业,打烊。
  • 绑卡:也叫签约,即会员要把自己的“”实体“银行账户和会员在银行的虚拟子账户关联起来,形成出入金关系。建行绑卡并不需要签到。
  • 入金:即资金从实体账户进入虚拟子账户。交易所,银行两边都可以发起。
  • 出金:即资金从虚拟子账户转出到实体账户。同样两边都可以发起。
  • 出入金对账:交易所和银行各自记录会员出入金的账目,每天收市后,两天要核对账目是否一致,即两个账本进行核对,对账。基本以银行为准。
  • 余额对账:也叫清算,即交易所把当日每个用户的余额变化提交到银行,银行根据提交文件对相应的会员进行调账。
其他涉及到现货的大宗交易所可能还有其他的业务,因为我们使用的是日结模式,银行文档有时候也叫中远期,所以就不清楚现货相关的流程。

其实还一个概念需要再说明一下。

  • 子账户:对于商贸通,首先需要交易所去银行申请开户,首先有一个实体账户,然后开通一个对应的总交易账户,这个交易账户分成多个虚拟子账户,前面提到的会员虚拟子账户是其中主要的一种,其他的还有利息子账户,手续费子账户,清收子账户等。这个总交易账户就对应整个市场(交易所)所有的资金,所以下面的叫子账户。 其中利息子账户用来存放资金的利息,手续费子账户用来存放交易所的手续费收入,清收子账户主要用于多银行托管的场景,即交易所对接了多家银行,比如其中一个银行所有的子账户都盈利,但是这个银行的总交易账户的实际资金并没有增加,如果所有的子账户出金,将导致总账户余额不足而出金失败,需要把总账户亏损的银行的资金转账到这个银行,这个清收账户就是负值,即所有子账户的和减去总账户的实际资金。

2:通信方式

前面接触的几家银行都是采用socket短连接进行通信,而建行使用的是HTTP协议。因为协议本身的单向性(即请求-响应),如果只有银行作为服务器,不能满足银行触发的业务需求,所以银行和交易所都作为服务器和客户端。银行的url有:
  • 业务请求:用来响应市场发起的业务,比如入金,会员绑卡信息上传等。
  • 文件上传:用来接收市场上传的对账文件等。
  • 文件下载:市场用来下载银行生成的文件,当然也可以下载市场自己已经上传的文件。
  • 秘钥交换:因为通信报文需要加密,所以首先要交换秘钥,包括RSA公钥,DES秘钥。
市场端url:
  • 业务请求:用户通过网银发起的业务,比如网银出金。
  • 消息推送:用来接收银行发送的,不需要市场反馈的消息,比如网银入金。不需要反馈是指,不需要市场具体的应答报文体,只要报文头回复成功,即可,如果银行收不到成功相应会每个20秒连续推送5次。
  • 秘钥交换:和银行端对应的url类似,用来响应银行请求的市场端公钥,用来验证报文签名。
刚开始我搞不清楚市场端 业务请求 和 消息推送的区别,后面才知道主要是是否需要市场反馈来区分的,比如网银入金,银行只会通知市场,这个事件,并不需要征求市场端的意见或反馈。相反网银出金,银行不可能直接出金,然后只是通知市场,而是需要征求市场端的意见,就需要调用市场的业务请求。市场内部自动或人工审核后,再反馈银行,该笔出金是否允许。银行根据反馈消息,在做出相应的业务操作。

报文的加密签名是为了安全考虑。其中加密使用对称加密DES,签名使用RSA私钥签名,公钥验证。既可以验证身份,也可以防止抵赖,因为只有私钥拥有者才能签名,如果收到正确签名的报文,就可以防止对方抵赖没有发送过该报文。

交换秘钥时使用的DES秘钥是双方,根据约定,也就是市场编号加日期作为秘钥,来加密交换秘钥报文。

所有报文使用GBK,GB2312编码,而不是UTF8。文档里面规定的每个字段的长度是对应的GBK编码的字节长度,而不是转成字符串后的长度。

秘钥都是用base64格式存放,base64就是以文本的形式展示二进制数据,便于一些协议的传输,存储。注:base64里面换行符,不会影响解密,spec规定75个字符左右换行。

文件还会有MD5哈希值,用来确保文件的完整性。市场上传的文件,需要在提交请求的时候提供md5,从银行下载的文件,可以从接口请求对应的MD5进行验证。
前面那个博文提到很多人卡在秘钥这块,可能就是因为这些基础概念不是太理解。通过这个对接,对这些概念的具体使用有了更多的理解。


0 0
原创粉丝点击