网银在线支付接口和应用_第1页
网银在线支付接口和应用_第2页
网银在线支付接口和应用_第3页
网银在线支付接口和应用_第4页
网银在线支付接口和应用_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、网银在线支付接口和应用 (转载)关键字:网银在线支付接口和应用最近关注项目中在线支付,所以看一下文档,在线支付应用开发:基本所有的在线支付均采用以下方式:客户点击结帐时将关于訂單的信息和货币信息,相应的信息URL ,经过 md5或其他方式发送(可能Socket和Http或Https)支付平台(块钱,paypal或支付宝等),支付平臺处理完毕时根据相应URL ,返回相 关的信息(付款信息,訂單信息,验证信息).在实际操作Money的问题人们一向关注他的安全性等问题,同时本人习惯在 通过http方式访问非外网时采用 Commons-httpclient的post发送实现,简 单方便,所以采用此种实

2、现:具体看以下API和原代码:网银在线支付API接口 :商户网银在线支付:vform method=post actio n=https:/pay.chi naeba nk.c n/select_ba nk商户编号in put type=hidde n n ame=v_oid value=19990720- 1001-000001234订单编号订单总金额_币种in put type=hidde n n ame=v_url value=http:/doma in/program支付动作完成后返回到该url,支付结果以POST方式发送订单 MD5 校验码备注字段 1备注字段 2收货人姓名_收货人地

3、址vin put type=hidden name=v_rcvtel value=68475566收货人电话_收货人邮编商品信息丿 111、订货人姓名一订货人邮件一MD5校验串生成方法:当消费者在商户端生成最终订单的时候,将订单中的 v_amount v_moneytype v_oid v_mid v_url key六个参数的 value 值拼成一个无间隔的字符串(顺序不要改变)。参数key是商户的MD5密钥(该密匙可在登陆 商户管理界面后自行更改。)网银在线支付 商户支付完成后页面转到商户,从网银在线支付返回的消息格式为:该消息格式详细解释如下:v_url是该笔订单提交时参数v_url的值,

4、即网 银返回到商户的接口地址。变量名称变量命名返回值说明订单编号v oid商户发送的v oid定单编号。支付状态v_pstatus20 (表示支付成功)30 (表示支付失败)支付结果信息v_pstri ng 支付完成 支付完成支付方式v pmode支付银行,例如工商银行订单MD5校验 码v_md5str该参数的MD5字符串的顺序为:v_oid,v_pstatus,v_amount,v_moneytype, keyMD5字符串示例:20050320- 1001-000001234 2012.340key 用MD5函数加密上述字符串后得到的值 如果和v_md5str值相等即表明返回的信 息没有被纂

5、改订单总金额v amount订单实际支付金额币种v mon eytype订单实际支付币种备注字段1remarkl备注字段2remark2表3package .xy;import staticmons.ChinaPayConstants.CHINABANK_NOTIF Y_URL_HTTP;import static mons.ChinaPayConstants.CHINABANK_PAY_H TTPS;import static mons.ChinaPayConstants.CHINABANK_PAY_M D5_KEY;import java.util

6、.HashMap;import java.util.Map;import java.util.Properties;import mons.codec.digest.DigestUtils;import mons.Env;import mons.HTTPClient;/author longgangbai* */public class ChinaPayProxy *网银接口服务的代理*在下訂單時采用的的Md5加密的信息:MD5校验串生成方法:当消费者在 商户端生成最终订单的时候, 将订单中的 v_amount* v_moneytype v_oid v_mid v_url key六个参数的 v

7、alue值拼成一个无间隔的 字符串 (顺序不要改变 )。*参数key是商户的MD5密钥(该密匙可在登陆商户管理界面后自行更改。)* param v_amount* param v_moneytype* param v_oid* param v_mid* param v_url* param key* return*/private static String getMd5Sign(String v_amount, String v_moneytype, String v_oid, String v_mid, String v_url, String key) StringBuffer sb =

8、 new StringBuffer();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();String md5info = new String(bytes).toUpperCase();return md5info;/param v_mid* 商户编号 (非空)* param v_oid* 订单编号(非空)(格式:订单生成日期(yyyy mm

9、dd)-商户编号-商户 流水号)字段不可超过6 4位* param v_amount* 订单总金额 (非空)* param v_moneytype* 货币类型(非空)0 :RMB 1美元* param v_url * (非空)支付的动作完成时返回的该url ,支付结果以post方式*调用支付网关接口网址 银行结帐的接口代理(本人习惯采用Common s -httpclient 实现)* 用途:用来接受商户发给网银在线服务支付的订单信息发送* param v_md5info* 订单md5校验码* param remark1* 备注字段1 (可选字段)* param remark2* 备注字段2

10、(可选字段)* param v _vmd* yyyy mmdd备注字段2 (不可为空字段)* param v_rcvname* 收货人姓名 (自定义非网银必须字段 )* param v_rcvaddr* 收货人地址 (自定义非网银必须字段 )* param v_rcvtel* 收货人电话 (自定义非网银必须字段)* param v_rcpost* 收货人邮编 (自定义非网银必须字段)* param v_orderstatus* 商品信息 (自定义非网银必须字段 )* param v_ordername* 订货人姓名 (自定义非网银必须字段 )* param v_orderemail* 订货人邮

11、件 (自定义非网银必须字段 )* return*/public static boolean chinaBankPayCheck(String v_mid, String v_oid,String v_amount, String v_moneytype, String v_url, String remark1,String remark2, String v_rcvname, String v_rcvaddr,String v_rcvtel, String v_rcpost, String v_orderstatus,String v_ordername, String v_orderem

12、ail) Properties p = Env.getEnv().getProperties();String md5key = p.getProperty(CHINABANK_PAY_MD5_KEY);String v_md5info = getMd5Sign(v_amount, v_moneytype, v_oid, v_mid, v_url, md5key);Map paramMaps = new HashMap(); paramMaps.put(v_mid, v_mid);paramMaps.put(v_oid, v_oid); paramMaps.put(v_amount, v_am

13、ount);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_r

14、cvtel, 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);return HTTPClient.executeHttp(CHINABANK_PAY_HTTPS, paramMaps, null);* result 为支付完毕接受的结果的 的map 校验检测在网银支付数据是否被拦截* param v

15、_oid*获取结果中的訂單编号* param v_pstatus*获取訂單的支付状态* param v_pstring*支付的结果* param v_amount*实际支付的金额* param v_moneytype*实际支付的币种* param v_md5str*获取訂單校验的MD5验证* return*/public static boolean checkPayOff(String v_oid, String v_pstatus,String v_pstring, String v_amount, String v_moneytype,String v_md5str) Propertie

16、s p = Env.getEnv().getProperties();String md5key = p.getProperty(CHINABANK_PAY_MD5_KEY);String checkmd5 = getCheckMd5(v_oid, v_pstatus, v_amount, v_moneytype, md5key);if (checkmd5.equals(v_md5str) return true;return false;/*得到网银訂單付款后Md5加密检查* param v_oid* param v_pstatus* param v_amount* param v_mone

17、ytype* param key* return*/private static String getCheckMd5(String v_oid. String v_pstatus, String v_amount, String v_moneytype. String key) StringBuffer sb = new StringBuffer();sb.append(v_oid);sb.append(v_pstatus);sb.append(v_amount);sb.append(v_moneytype);sb.append(key);byte bytes = DigestUtils.m

18、d5(sb.toString();String md5info = new String(bytes).toUpperCase();return md5info;来自 2010-02-09建设银行对接(一)文章分类:Java编程这几天 项目需要对接建设银行的支付和查询功能,在支付和查询的时候将系统链接到建行指定的页面上,由于这些页面是基于互联网的, 开放的,所以需 要对数据加密和数字签名。 我来实现这个数据加密解密模块,功能已经完成了, 唉,不过让我晕死的是,建行其实一并提供了 jar包,已经实现了数据加密解密, 校验数字签名的功能,只不过同事没注意到,只发接口文档给我,没发jar包给 我,害

19、我白着急了几天,不过工作也没算浪费,自己实现的还是比较放心些吧。 这些页面的跳转没什么技术,主要在于数据加密和数字签名,在链接到建行页面 之前,先将参数加密,在收到建行跳转过来的链接参数后,取出参数里的签名, 将签名和原始参数进行校验,以确认目前跳转过来的的确是建行。 页面跳转没什 么好说的,我所感兴趣的在于加密这些地方,以及对建行文档的理解。按照建行的规定,我们发送的数据需要进行 MD5加密,建行对返回的数据 进行了数字签名,我们需要校验签名的有效性。以下是建行的两项约定:建行附录1 : MAC算法说明Html代码咛曲-肖1. 建设银行家居银行项目组决定对商户向网上银行系统提交的交易内容进行

20、MAC校验,校验算法采用标准MD5算法,不带密钥。该算法的详 细说明请参见RFC 1321文档。2.2. 商户实行标准的MD5算法对向网上银行系统提交的交易内容进行 MAC 校验,产生128位(bit )的MAC吉果。输入为字符串,输出为16进制字 符表示的字符串。4.3. 下面是对MAC吉果的显示方式的描述:6.4. 对128位的交易结果按4位为一个单位进行划分,共获得 32段8.5. 将每段看成一个16进制数,如0011为0X3, 1101为0Xd。10.6. 将这个数映射到ASCII码表,形成相应的字符,如0X2为“2”,0Xd为“ d”。12.7. 将这些字符连成一个字符串,长度为 3

21、2。7.果:下面是一些字符串进行MAC并按上述方法进行转换后获得的结18.19. MD5 () = d41d8cd98f00b204e9800998ecf8427e20.20. MD5 (a) = 0cc175b9c0f1b6a831c399e26977266122.23.MD5 (abc) = 900150983cd24fb0d6963f7d28e17f72建行附录2 :数字签名算法说明Html代码眩丙卜第1. 银行将客户支付信息实时通知给商户时,使用的数字签名算法是 MD5withRSAf法。商户验证签名的公钥在商户在网银系统开户,获取数字证书后,登录到网银系统中,通过

22、下载公钥交易获取。(下载后需妥善管理并及时更新商户公钥,以防公私钥不匹配造成验签不通过)。(目前家居银行项目组采用静态密钥对,上线前生成一对,发给合作商户。)2.2. 商户获取的公钥用X.509格式表示,并且将其按照每4位(bit ) 转换为一个16进制数的方式表示,产生16进制的字符串。家居银行使用 标准MD5withRSA法对给商户的响应进行签名,产生 1024位(bit )的 签名结果,并且将其按照每4位(bit )转换为一个16进制数的方式表示, 形成16进制的字符串,长度为256。. 下面是对签名结果的表示方式的描述:8.4. 对1024位的交易结果按4位为一个单位进行

23、划分,共获得 256段10.5. 将每段看成一个16进制数,如0011为0X3, 1101为0Xd。12.6. 将这个数映射到ASCII码表,形成相应的字符,如0X2为“2”,0Xd为“ d”。14.7. 将这些字符连成一个字符串,长度为 256。. 例如:20.9. 待签名的字符串为:22.10. POSIt=00000000Q&BRANCHEI100000008ORDER=)l9991101234&PAYMENT 500.00& CURCODE1 &REMARK1199911013REMARKmercha ntn ame&SUCCESS24.11. 签名结果为:26.2

24、7.4b3ef029516193b7d969ac1840083635a3e0901b8cd526caa44c1a072f496d7 f0d4bca3942c0d9030bede37c7809b835cec787eb39e18b7596a724fba9805b 24714dfbb0f4a3fb430b32e075254a114d4c38a0ac52ef46a0ad33dec3fbfc1 5417402a1399e65e46996c0cf49fc7ffca9222f8cd693c8376b6f928828967b ec41. 当商户收到银行传来的CGI串后,从中获取签名(格式

25、如上)和需 签名的原文。商户端程序(商户自行开发 MD5withRSA签名校验程序)将 签名和商户端的公钥转换成二进制格式,与签名的原文一起对签名的正确 性进行校验,校验步骤如下:32.32. 使用公钥进行签名的逆运算34.33. 使用标准MD5算法运算原文36.34. 比较1)、2)结果。仔细看上面两项约定,无论是MD5加密还是RSA加密,都有一个基础工 作,就是将二进制数据分割,换算成 16进制字符,还需要进行逆运算。将结果 按4位为一个单位进行划分,共获得32段,将每段看成一个16进制数,如 0011为0X3,1101为0Xd 。将这个数映射到 ASCII码表,形成相应的字符,如0X2为

26、“ 2 ”, 0Xd为“ d ”。将这些字符连成一个字符串,长度 为32。我先实现这个功能,代码如下:ByteUtil.javaJava代码咛茜匸肖1. package cn.ipanel.payment.business.bank.ccb.encryption;2.3. /*4. *字节运算工具,其作用和背景请见建行接口文档的附录1:MAC算法说 明5. *6. * author wangxiaoxue7. *8. */9. public class ByteUtil 10. / 用来将字节转换成 16 进制表示的字符11. private static char hexDigits = 0

27、, 1, 2, 3, 4 , 5, 6, 7,12.13. 8, 9, a, b, c, d, e, f ;14.15. /*16. * 找到字符在数组中的位置17. *18. * param c19. * return20. */21. private static int getIndex(char c) 22. int p = - 1;23. for (int i = 0; i hexDigits.length; i+) 24. if (hexDigitsi =c) 25. p = i;26. break;27. 28. 29. return p;30.31.32./*33.34.* 1

28、:35.* 2:1,0x0d36.* 3:将字节转化成字符串,转换算法如下 :每个字节长度为 8 位,分割为两个 4 位,高四位和低四位 将每个四位换算成 16 进制,并且对应 ascii 码,如 0x01 对应 对应 d, 具体对应关系请见数组 hexDigits 将得到的字符拼成字符串37. *35. * param bytes36. * return37. */38. public static String byteToChar(byte bytes) 39. / 每个字节用 16 进制表示的话, 使用两个字符, 所以字符数组 长度是字节数字长度的 2 倍40. char str =

29、new charbytes.length *2;41. / 表示转换结果中对应的字符位置42. int = 0;43. / 每一个字节转换成 16 进制字符44. for (int i = 0; i 为逻辑右移, 右移后,高四位变成低四位,需要对低四位之外的值进行消零运算47. strk+ = hexDigitsbyte0 4 & 0xf ;48. / 取字节中低 4 位( 右边四位 ) 的数字转换,并且和 0xf 进行逻辑与运算,以消除高位的值,得到纯净的低四位值49. strk+ = hexDigitsbyte0 & 0xf ;50. 51. return new String(str);52. 56.57. /*58. * 将字节转换成二进制数组, 是 byteToChar 方法的逆运算, 转换算 法如下 :59. * 1:将字符按顺序每两个分为一组,分别找出每个字符在映射表hexDigits 中的索引值,请见 getIndex(char c) 方法 60. * 2:每两个字符一组进行运算 ,将第一个字符的索引值逻辑左移四位,并和 0xf 进行逻辑或 运算,目的是将

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论