网银在线支付接口和应用.docx
- 文档编号:30368916
- 上传时间:2023-08-13
- 格式:DOCX
- 页数:23
- 大小:30.16KB
网银在线支付接口和应用.docx
《网银在线支付接口和应用.docx》由会员分享,可在线阅读,更多相关《网银在线支付接口和应用.docx(23页珍藏版)》请在冰豆网上搜索。
网银在线支付接口和应用
网银在线支付接口和应用(转载)
关键字:
网银在线支付接口和应用
最近关注项目中在线支付,所以看一下文档,在线支付应用开发:
基本所有的在线支付均采用以下方式:
客户点击结帐时将关于訂單的信息和货币信息,相应的信息URL,经过md5或其他方式发送(可能Socket和Http或Https)支付平台(块钱,paypal或支付宝等),支付平臺处理完毕时根据相应URL,返回相关的信息(付款信息,訂單信息,验证信息).
在实际操作Money的问题人们一向关注他的安全性等问题,同时本人习惯在通过http方式访问非外网时采用Commons-httpclient的post发送实现,简单方便,所以采用此种实现:
具体看以下API和原代码:
网银在线支付API接口:
商户>>>>>>网银在线支付:
//domain/program"> 支付动作完成后返回到该url,支付结果以POST方式发送 MD5校验串生成方法: 当消费者在商户端生成最终订单的时候,将订单中的v_amountv_moneytypev_oidv_midv_urlkey六个参数的value值拼成一个无间隔的字符串(顺序不要改变)。 参数key是商户的MD5密钥(该密匙可在登陆商户管理界面后自行更改。 ) 网银在线支付>>>商户 支付完成后页面转到商户,从网银在线支付返回的消息格式为: 该消息格式详细解释如下: v_url是该笔订单提交时参数v_url的值,即网银返回到商户的接口地址。 变量名称 变量命名 返回值说明 订单编号 v_oid 商户发送的v_oid定单编号。 支付状态 v_pstatus 20(表示支付成功) 30(表示支付失败) 支付结果信息 v_pstring 支付完成 支付完成 支付方式 v_pmode 支付银行,例如工商银行 订单MD5校验码 v_md5str 该参数的MD5字符串的顺序为: v_oid,v_pstatus,v_amount,v_moneytype,key MD5字符串示例: 20050320-1001-0000012342012.340key 用MD5函数加密上述字符串后得到的值如果和v_md5str值相等即表明返回的信息没有被纂改 订单总金额 v_amount 订单实际支付金额 币种 v_moneytype 订单实际支付币种 备注字段1 remark1 备注字段2 remark2 表3 package.vnvtrip.china.pay.proxy; importstaticmons.ChinaPayConstants.CHINABANK_NOTIFY_URL_HTTP; importstaticmons.ChinaPayConstants.CHINABANK_PAY_HTTPS; importstaticmons.ChinaPayConstants.CHINABANK_PAY_MD5_KEY; importjava.util.HashMap; importjava.util.Map; importjava.util.Properties; importmons.codec.digest.DigestUtils; importmons.Env; importmons.HTTPClient; /** * *网银接口服务的代理 * *@authorlonggangbai * */ publicclassChinaPayProxy{ /** *在下訂單時采用的的Md5加密的信息: MD5校验串生成方法: 当消费者在商户端生成最终订单的时候,将订单中的v_amount *v_moneytypev_oidv_midv_urlkey六个参数的value值拼成一个无间隔的字符串(顺序不要改变)。 *参数key是商户的MD5密钥(该密匙可在登陆商户管理界面后自行更改。 ) * *@paramv_amount *@paramv_moneytype *@paramv_oid *@paramv_mid *@paramv_url *@paramkey *@return */ privatestaticStringgetMd5Sign(Stringv_amount,Stringv_moneytype, Stringv_oid,Stringv_mid,Stringv_url,Stringkey){ StringBuffersb=newStringBuffer(); sb.append(v_amount); sb.append(v_moneytype); sb.append(v_oid); sb.append(v_mid); sb.append(v_url); sb.append(key); byte[]bytes=DigestUtils.md5(sb.toString()); Stringmd5info=newString(bytes).toUpperCase(); returnmd5info; } /** *调用支付网关接口网址银行结帐的接口代理(本人习惯采用Commons-httpclient实现) *用途: 用来接受商户发给网银在线服务支付的订单信息 * *@paramv_mid * 商户编号(非空) *@paramv_oid * 订单编号(非空)(格式: 订单生成日期(yyyymmdd)-商户编号-商户流水号)字段不可超过64位 *@paramv_amount * 订单总金额(非空) *@paramv_moneytype * 货币类型(非空)0: RMB1美元 *@paramv_url * (非空)支付的动作完成时返回的该url,支付结果以post方式发送 *@paramv_md5info * 订单md5校验码 *@paramremark1 * 备注字段1(可选字段) *@paramremark2 * 备注字段2(可选字段) *@paramv_vmd * yyyymmdd备注字段2(不可为空字段) *@paramv_rcvname * 收货人姓名(自定义非网银必须字段) *@paramv_rcvaddr * 收货人地址(自定义非网银必须字段) *@paramv_rcvtel * 收货人电话(自定义非网银必须字段) *@paramv_rcpost * 收货人邮编(自定义非网银必须字段) *@paramv_orderstatus * 商品信息(自定义非网银必须字段) *@paramv_ordername * 订货人姓名(自定义非网银必须字段) *@paramv_orderemail * 订货人邮件(自定义非网银必须字段) *@return */ publicstaticbooleanchinaBankPayCheck(Stringv_mid,Stringv_oid, Stringv_amount,Stringv_moneytype,Stringv_url,Stringremark1, Stringremark2,Stringv_rcvname,Stringv_rcvaddr, Stringv_rcvtel,Stringv_rcpost,Stringv_orderstatus, Stringv_ordername,Stringv_orderemail){ Propertiesp=Env.getEnv().getProperties(); Stringmd5key=p.getProperty(CHINABANK_PAY_MD5_KEY); Stringv_md5info=getMd5Sign(v_amount,v_moneytype,v_oid,v_mid, v_url,md5key); Map paramMaps.put("v_mid",v_mid); paramMaps.put("v_oid",v_oid); paramMaps.put("v_amount",v_amount); paramMaps.put("v_moneytype",v_moneytype); paramMaps.put("v_url",p.getProperty(CHINABANK_NOTIFY_URL_HTTP)); paramMaps.put("v_md5info",v_md5info); paramMaps.put("remark1",remark1); paramMaps.put("remark2",remark2); paramMaps.put("v_rcvname",v_rcvname); paramMaps.put("v_rcvaddr",v_rcvaddr); paramMaps.put("v_rcvtel",v_rcvtel); paramMaps.put("v_rcpost",v_rcpost); paramMaps.put("v_orderstatus",v_orderstatus); paramMaps.put("v_ordername",v_ordername); paramMaps.put("v_orderemail",v_orderemail); returnHTTPClient.executeHttp(CHINABANK_PAY_HTTPS,paramMaps,null); } /** *result为支付完毕接受的结果的map校验检测在网银支付数据是否被拦截的 * *@paramv_oid * 获取结果中的訂單编号 *@paramv_pstatus * 获取訂單的支付状态 *@paramv_pstring * 支付的结果 *@paramv_amount * 实际支付的金额 *@paramv_moneytype * 实际支付的币种 *@paramv_md5str * 获取訂單校验的MD5验证 *@return */ publicstaticbooleancheckPayOff(Stringv_oid,Stringv_pstatus, Stringv_pstring,Stringv_amount,Stringv_moneytype, Stringv_md5str){ Propertiesp=Env.getEnv().getProperties(); Stringmd5key=p.getProperty(CHINABANK_PAY_MD5_KEY); Stringcheckmd5=getCheckMd5(v_oid,v_pstatus,v_amount,v_moneytype, md5key); if(checkmd5.equals(v_md5str)){ returntrue; } returnfalse; } /** *得到网银訂單付款后Md5加密检查 * *@paramv_oid *@paramv_pstatus *@paramv_amount *@paramv_moneytype *@paramkey *@return */ privatestaticStringgetCheckMd5(Stringv_oid,Stringv_pstatus, Stringv_amount,Stringv_moneytype,Stringkey){ StringBuffersb=newStringBuffer(); sb.append(v_oid); sb.append(v_pstatus); sb.append(v_amount); sb.append(v_moneytype); sb.append(key); byte[]bytes=DigestUtils.md5(sb.toString()); Stringmd5info=newString(bytes).toUpperCase(); returnmd5info; } } 来自 2010-02-09 建设银行对接 (一) 文章分类: Java编程 这几天项目需要对接建设银行的支付和查询功能,在支付和查询的时候将系统链接到建行指定的页面上,由于这些页面是基于互联网的,开放的,所以需要对数据加密和数字签名。 我来实现这个数据加密解密模块,功能已经完成了,唉,不过让我晕死的是,建行其实一并提供了jar包,已经实现了数据加密解密,校验数字签名的功能,只不过同事没注意到,只发接口文档给我,没发jar包给我,害我白着急了几天,不过工作也没算浪费,自己实现的还是比较放心些吧。 这些页面的跳转没什么技术,主要在于数据加密和数字签名,在链接到建行页面之前,先将参数加密,在收到建行跳转过来的链接参数后,取出参数里的签名,将签名和原始参数进行校验,以确认目前跳转过来的的确是建行。 页面跳转没什么好说的,我所感兴趣的在于加密这些地方,以及对建行文档的理解。 按照建行的规定,我们发送的数据需要进行MD5加密,建行对返回的数据进行了数字签名,我们需要校验签名的有效性。 以下是建行的两项约定: 建行附录1: MAC算法说明 Html代码 1. 建设银行家居银行项目组决定对商户向网上银行系统提交的交易内容进行MAC校验,校验算法采用标准MD5算法,不带密钥。 该算法的详细说明请参见RFC 1321文档。 2. 3. 商户实行标准的MD5算法对向网上银行系统提交的交易内容进行MAC校验,产生128位(bit)的MAC结果。 输入为字符串,输出为16进制字符表示的字符串。 4. 5.下面是对MAC结果的显示方式的描述: 6. 7.对128位的交易结果按4位为一个单位进行划分,共获得32段 8. 9.将每段看成一个16进制数,如0011为0X3,1101为0Xd。 10. 11.将这个数映射到ASCII码表,形成相应的字符,如0X2为“2”,0Xd为“d”。 12. 13.将这些字符连成一个字符串,长度为32。 14. 15. 16. 17. 下面是一些字符串进行MAC并按上述方法进行转换后获得的结果: 18. 19.MD5 ("") = d41d8cd98f00b204e9800998ecf8427e 20. 21.MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661 22. 23.MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72 建设银行家居银行项目组决定对商户向网上银行系统提交的交易内容进行MAC校验,校验算法采用标准MD5算法,不带密钥。 该算法的详细说明请参见RFC1321文档。 商户实行标准的MD5算法对向网上银行系统提交的交易内容进行MAC校验,产生128位(bit)的MAC结果。 输入为字符串,输出为16进制字符表示的字符串。 下面是对MAC结果的显示方式的描述: 对128位的交易结果按4位为一个单位进行划分,共获得32段 将每段看成一个16进制数,如0011为0X3,1101为0Xd。 将这个数映射到ASCII码表,形成相应的字符,如0X2为“2”,0Xd为“d”。 将这些字符连成一个字符串,长度为32。 下面是一些字符串进行MAC并按上述方法进行转换后获得的结果: MD5("")=d41d8cd98f00b204e9800998ecf8427e MD5("a")=0cc175b9c0f1b6a831c399e269772661 MD5("abc")=900150983cd24fb0d6963f7d28e17f72 建行附录2: 数字签名算法说明 Html代码 1. 银行将客户支付信息实时通知给商户时,使用的数字签名算法是MD5withRSA算法。 商户验证签名的公钥在商户在网银系统开户,获取数字证书后,登录到网银系统中,通过下载公钥交易获取。 (下载后需妥善管理并及时更新商户公钥,以防公私钥不匹配造成验签不通过)。 (目前家居银行项目组采用静态密钥对,上线前生成一对,发给合作商户。 ) 2. 3. 商户获取的公钥用X.509格式表示,并且将其按照每4位(bit)转换为一个16进制数的方式表示,产生16进制的字符串。 家居银行使用标准MD5withRSA算法对给商户的响应进行签名,产生1024位(bit)的签名结果,并且将其按照每4位(bit)转换为一个16进制数的方式表示,形成16进制的字符串,长度为256。 4. 5. 6. 7.下面是对签名结果的表示方式的描述: 8. 9.对1024位的交易结果按4位为一个单位进行划分,共获得256段
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 在线 支付 接口 应用
![提示](https://static.bdocx.com/images/bang_tan.gif)