名人论坛

查看: 540|回复: 0

网银在线支付接口和应用示例

[复制链接]

180

主题

183

帖子

1417

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1417
发表于 2018-7-23 00:12:28 | 显示全部楼层 |阅读模式

最近关注项目中在线支付,所以看一下文档,在线支付应用开发:

  基本所有的在线支付均采用以下方式:

  客户点击结帐时将关于訂單的信息和货币信息,相应的信息URL,经过md5或其他方式发送(可能Socket和Http或Https)支付平台(块钱,paypal或支付宝等),支付平臺处理完毕时根据相应URL,返回相关的信息(付款信息,訂單信息,验证信息).

  在实际操作Money的问题人们一向关注他的安全性等问题,同时本人习惯在通过http方式访问非外网时采用Commons-httpclient的post发送实现,简单方便,所以采用此种实现:具体看以下API和原代码:

  网银在线支付API接口:

  商户>>>>>>网银在线支付:


   商户编号
   订单编号
   订单总金额
   币种

  支付动作完成后返回到该url,支付结果以POST方式发送
   订单MD5校验码
  备注字段1
  备注字段2
   收货人姓名
   收货人地址
   收货人电话
   收货人邮编
   商品信息
   订货人姓名
   订货人邮件
  

  MD5校验串生成方法:当消费者在商户端生成最终订单的时候,将订单中的v_amount v_moneytype v_oid v_mid v_url key六个参数的value值拼成一个无间隔的字符串(顺序不要改变)。参数key是商户的MD5密钥(该密匙可在登陆商户管理界面后自行更改。)

  网银在线支付>>>商户

  支付完成后页面转到商户,从网银在线支付返回的消息格式为:












  该消息格式详细解释如下:v_url是该笔订单提交时参数v_url 的值,即网银返回到商户的接口地址。

  变量名称变量命名返回值说明

  订单编号v_oid商户发送的v_oid定单编号。

  支付状态v_pstatus20(表示支付成功)

  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订单实际支付币种

  备注字段1remark1

  备注字段2remark2

  表3

  package cn.com.vnvtrip.china.pay.proxy;

  import static cn.com.vnvtrip.china.pay.commons.ChinaPayConstants.CHINABANK_NOTIFY_URL_HTTP; import static cn.com.vnvtrip.china.pay.commons.ChinaPayConstants.CHINABANK_PAY_HTTPS; import static cn.com.vnvtrip.china.pay.commons.ChinaPayConstants.CHINABANK_PAY_MD5_KEY;

  import java.util.HashMap; import java.util.Map; import java.util.Properties;

  import org.apache.commons.codec.digest.DigestUtils;

  import cn.com.vnvtrip.china.pay.commons.Env; import cn.com.vnvtrip.china.pay.commons.HTTPClient;

  /** * * 网银接口服务的代理 * * @author longgangbai * */ public class ChinaPayProxy { /** * 在下訂單時采用的的Md5加密的信息: MD5校验串生成方法:当消费者在商户端生成最终订单的时候, 将订单中的v_amount * v_moneytype v_oid v_mid v_url key六个参数的value值拼成一个无间隔的字符串(顺序不要改变)。 * 参数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 = 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; }

  /** * 调用支付网关接口网址 银行结帐的接口代理 (本人习惯采用Commons-httpclient实现) * 用途:用来接受商户发给网银在线服务支付的订单信息 * * @param v_mid * 商户编号(非空) * @param v_oid * 订单编号(非空)(格式:订单生成日期(yyyymmdd)-商户编号-商户流水号)字段不可超过64位 * @param v_amount * 订单总金额 (非空) * @param v_moneytype * 货币类型 (非空) 0:RMB 1美元 * @param v_url * (非空) 支付的动作完成时返回的该url,支付结果以post方式发送 * @param v_md5info * 订单md5校验码 * @param remark1 * 备注字段1(可选字段) * @param remark2 * 备注字段2 (可选字段) * @param v_vmd * yyyymmdd 备注字段2 (不可为空字段) * @param v_rcvname * 收货人姓名 (自定义非网银必须字段) * @param v_rcvaddr * 收货人地址(自定义非网银必须字段) * @param v_rcvtel * 收货人电话(自定义非网银必须字段) * @param v_rcpost * 收货人邮编(自定义非网银必须字段) * @param v_orderstatus * 商品信息(自定义非网银必须字段) * @param v_ordername * 订货人姓名(自定义非网银必须字段) * @param v_orderemail * 订货人邮件(自定义非网银必须字段) * @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_orderemail) { 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_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); return HTTPClient.executeHttp(CHINABANK_PAY_HTTPS, paramMaps, null); }

  /** * result为支付完毕接受的结果的map 校验检测在网银支付数据是否被拦截的 * * @param v_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) { Properties 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_moneytype * @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.md5(sb.toString()); String md5info = new String(bytes).toUpperCase(); return md5info; } }


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|支付接口网

拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表本站立场!

GMT+8, 2024-5-17 19:22 , Processed in 0.989057 second(s), 18 queries .

Powered by Discuz! X3.4 © 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表