最近做网络商城的一个网银支付接口,可算给我焦死了,各种规则啊,总体来说比较麻烦,也不算难,只要搞清楚流程就好了。下面理清一下思路来说一下;
需要准备一些什么?
首先要带上银行卡和身份证去当地分行申请开发B2c第三方网银接口。然后当地银行会给你一个.pfx的文件。这其实就是一个加密的证书,然后你点击安装,输入你申请的公文阴匙,会把.pfx文件,拆分成.crt和.key的文件。这些文件的用途后面再讲,现在先不管,当地工行还会给你一个商户号,和商户代码。
业务说明?
首先要看清楚这张图,我们开发人员主要做的就是1,2,3.简单描述一下就是,从添加订单页面,填写你要添加的订单,然后提交数据到后台,然后我们使用工行的加密和签名方法对我们的数据进行封装一下,再返回到一个客户端,也就是一个视图页面,然后我们将订单数据提交到银行。剩下的都交给银行去处理就完事了,最后我们还有做一个页面取接收银行返回过来的数据,判断交易是否成功,然后我们对订单的状态进行调整。
添加订单
这个算是最简单的一个了,简单点说就是把我们的页面的表单数据提交到后台,也就是简单的添加,自己在表单里面定义好属性,然后提交到后台,不管是用struts还是spring也好,只要后台能接受到数据就完事了。
封装数据
最难最重要的就是这一步了,这一步比较麻烦,也比较复杂。首先要理解这一步是干嘛,简单的来说,就是我们要把我们的数据给封装成工行所需要的数据给提交过去。先看看工行开发文档是怎么说的:
FORM表单数据如下:
变量名称 |
变量命名 |
长度定义 |
说明 |
接口名称 |
interfaceName |
MAX(30) |
必输, 取值:“ICBC_PERBANK_B2C” |
接口版本号 |
interfaceVersion |
MAX(15) |
必输, 取值:“1.0.0.11” |
交易数据 |
tranData |
无限制 |
必输,签名; 整合所有交易数据形成的xml明文串,并做BASE64编码; 具体格式定义见下文; 注意: 需有xml头属性;整个字段使用BASE64编码; xml明文中没有回车换行和多余空格; |
订单签名数据 |
merSignMsg |
无限制 |
必输, 商户使用工行提供的签名API和商户证书将tranData的xml明文串进行签名,得到二进制签名数据,然后进行BASE64编码后得到可视的merSignMsg; 注意:签名时是针对tranData的xml明文,不是将tranData进行BASE64编码后的串; |
商城证书公钥 |
merCert |
无限制 |
必输, 商户用二进制方式读取证书公钥文件后,进行BASE64编码后产生的字符串; |
第一个,第二个都是固定的值已经定义好了,接下来看看第三个,文档里面已经说得很清楚了,我们要按照开发文档给的xml格式,去整合我们的交易数据。这里我用到了simpleframework.xml来解析xml技术,这种方法很适合哪种少重复,数据量小的,解析起来很方便。简单介绍一下他的规范。
root代表的是他的根节点,@Element标识元素,@Attribute标识元素属性。除root元素、最深一层元素,其他层元素对应的bean类都需将其子元素的bean作为属性引入。这里我们要做的就是给这些元素赋值,把我们的表单数据变成元素数据然后执行他的序列化方法序列成xml文件。
序列化后的xml文件如下图所示:
<?xml version="1.0" encoding="GBK" standalone="no"?>
<B2CReq>
<interfaceName>ICBC_PERBANK_B2C</interfaceName>
<interfaceVersion>1.0.0.11</interfaceVersion>
<orderInfo>
<orderDate>20100308141629</orderDate>
<curType>001</curType>
<merID>0200EC20001119</merID>
<subOrderInfoList>
<subOrderInfo>
<orderid>201003081416290</orderid>
<amount>1</amount>
<installmentTimes>1</installmentTimes>
<merAcct>0200026009018372212</merAcct>
<goodsID>001</goodsID>
<goodsName>威尼熊</goodsName>
<goodsNum>2</goodsNum>
<carriageAmt>20</carriageAmt>
</subOrderInfo>
<subOrderInfo>
<orderid>201003081416291</orderid>
<amount>1</amount>
<installmentTimes>1</installmentTimes>
<merAcct>0200026009018372212</merAcct>
<goodsID>001</goodsID>
<goodsName>威尼熊</goodsName>
<goodsNum>2</goodsNum>
<carriageAmt>20</carriageAmt>
</subOrderInfo>
</subOrderInfoList>
</orderInfo>
<custom>
<verifyJoinFlag>0</verifyJoinFlag>
<Language>ZH_CN</Language>
</custom>
<message>
<creditType>2</creditType>
<notifyType>AG</notifyType>
<resultType>1</resultType>
<merReference>localhost</merReference>
<merCustomIp>127.0.0.1</merCustomIp>
<goodsType>1</goodsType>
<merCustomID>123456</merCustomID>
<merCustomPhone>13466780886</merCustomPhone>
<goodsAddress>三里屯</goodsAddress>
<merOrderRemark>防欺诈接口专用</merOrderRemark>
<merHint>请保留包装</merHint>
<remark1></remark1>
<remark2></remark2>
<merURL>http://localhost:9080/EbizSimulate/emulator/Newb2c_Pay_Mer.jsp</merURL>
<merVAR>test</merVAR>
</message>
</B2CReq>
里面的数据有很多规则,这里大家一定要注意下,仔细阅读我们的开发文档,注意一定要细心,千万不要大意,不然会很麻烦;好了这里我们要读取xml的数据,对它进行加密;
好了,现在我们的tranData数据基本上都封装好了。接着再看看我们的merSignMsg数据。这里要使用我们的key和crt加上我们的密钥匙
现在我们已经得到了merSignMsg数据了,最后我们要得到merCert这个数据,下面就不举例了,这个比较简。然后我们到controller,控制层去把数据放到session里面。再跳到页面表单。
<from method="post" action="
https://mybank3.dccnet.com.cn/servlet/ICBCINBSEBusinessServlet">
<INPUT NAME="interfaceName" TYPE="text" value="ICBC_PERBANK_B2C" >
<INPUT NAME="interfaceVersion" TYPE="text" value="1.0.0.11">
<INPUT NAME="tranData" TYPE="text" value="${tranData}">
<INPUT NAME="merSignMsg" TYPE="text" value="${merSignMsg}">
<INPUT NAME="merCert" TYPE="text" value="${merCert}">
<INPUT TYPE="submit">
</from>
要注意提交时间,因为工行的测试时间是不定的,要和工行测试人员联系,在表单数据里面,时间相差要和工行测试时间保持在10分钟以内不然会报错的。好了今天就怎么多了,该睡觉了,6月份已经过去了,7月份也来到了,希望自己能在7月里收获更多,加油。吃的苦中苦,方为人上人,我始终坚信努力,就有收获,希望看到这篇文章的朋友,能够放下心中的浮躁,不要因为自己朋友的工资比自己高而暂时激发了自己的斗志,想到去学习,等到哪一天又忽然放弃了,我觉得学习java就一定要热爱他,这样才能够学好。