网银在线支付接口和应用

关键字: 网银在线支付接口和应用
  最近关注项目中在线支付,所以看一下文档,在线支付应用开发:

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

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

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



网银在线支付API接口:

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

<form method=post action="https://pay.chinaebank.cn/select_bank">

<input type=hidden name=v_mid value="1001"> 商户编号

<input type=hidden name=v_oid value="19990720-1001-000001234"> 订单编号

<input type=hidden name=v_amount value="13.45"> 订单总金额

<input type=hidden name=v_moneytype value="0"> 币种

<input type=hidden name=v_url value="http://domain/program">

支付动作完成后返回到该url,支付结果以POST方式发送

<input type=hidden name=v_md5info value="1630DC083D70A1E8AF60F49C143A7B95"> 订单MD5校验码

<input type="hidden" name="remark1 " value="">备注字段1

<input type="hidden" name="remark2" value="">备注字段2

<input type=hidden name=v_rcvname value="张三"> 收货人姓名

<input type=hidden name=v_rcvaddr value="北京海淀"> 收货人地址

<input type=hidden name=v_rcvtel value="68475566"> 收货人电话

<input type=hidden name=v_rcvpost value="100036"> 收货人邮编

<input type=hidden name=v_orderstatus value="0"> 商品信息

<input type=hidden name=v_ordername value="李四"> 订货人姓名

<input type=hidden name= v_orderemail value="test@test.com"> 订货人邮件

<input type=submit value="网银在线支付">

</form>

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

网银在线支付>>>商户


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



<form method=get action="v_url" target=_self>

<input type="hidden" name="v_oid" value="">

<input type="hidden" name="v_pstatus" value="">

<input type="hidden" name="v_pstring" value="">

<input type="hidden" name="v_pmode" value="">

<input type="hidden" name="v_md5str" value="">

<input type="hidden" name="v_amount" value="">

<input type="hidden" name="v_moneytype" value="">

<input type="hidden" name="remark1 " value="">

<input type="hidden" name="remark2" value="">

</form>





该消息格式详细解释如下: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 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<String, String> paramMaps = new HashMap<String, String>();
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;
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值