网银在线支付接口和应用

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

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

   客户点击结帐时将关于訂單的信息和货币信息,相应的信息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="[email protected]">       订货人邮件

<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;
 }
}

时间: 2024-10-27 08:41:36

网银在线支付接口和应用的相关文章

在线支付接口详解

当我们在商城购物时,可能会用到在线支付,你会发现无论你是哪个银行的银行卡接口中都会支持,在做项目开 发时,也经常会用到支付接口,我们当然希望支持所有的网银,但这需要我们针对每个银行开发一套接口吗?不是不可以而是没必要,使用第三方的支付接口就可以 满足,第三方支付平台已经与各大银行进行签约,网站主只需要在此平台申请一个账号即可支持几乎所有的种类的银行卡信用卡的交易,当然是可能支付少量的手续 费的.什么是第三方支付呢? 所谓第三方支付,就是一些和各大银行签约.并具备一定实力和信誉保障的第三方独立机构

PHP商城网站绑定中国银联在线支付接口

PHP商城网站绑定中国银联在线支付接口用的越来越广泛,我们公司这几年给客户建立过很多的商城网站,今天就分析下怎么为自己的PHP商城网站接入中国银联在线支付端的接口.在使用前我们必须先申请成为中国银联在线支付的商户. 第一步:下载中国银联官方PHP支付接口文件 进入中国银联在线官方网站的商户服务网站,下载PHP的技术资料端口文件(https://online.unionpay.com/mer/pages/merser/index.jsp这是中国银联在线支付商户服务网站),点击右上角的“文档下载”

如何接入中国工商银行网上银行B2C在线支付接口

中国工商银行网上银行B2C在线支付接口说明,亲测可行. 工具/原料 merID:银行提供.唯一确定一个商户的代码,由商户在工行开户时,由工行告知商户. merAcct:银行提供 , 商城收费入账账号 (只能交易时指定). 懂得html代码跟PHP的程序员一名 方法/步骤 1 到银行开户,说明要做B2C在线支付接口,此时银行会提供给你 merID  .merAcct  这两个 2 由程序员按照一下步骤来做即可,在商城提交表单的页面添加以下控件. 3 <html xmlns=http://www.w

工商银行在线支付接口,php语言,在ecshop,shopex等的wap版本上完美实现移动支付

php版本各个主要银行在线支付接口开发. 1 中国银行在线支付接口2 工商银行在线支付接口3 建设银行在线支付接口+手机移动支付接口4 交通银行在线支付接口5 农业银行在线支付接口6 银联在线支付接口+手机移动支付接口7 招商银行在线支付接口+手机移动支付接口完美融合ecshop,shopex等php版本的商城系统. 其他银行的在线支付接口均能开发,详情请咨询QQ:804752009 原文:http://www.0475seo.com/tech/2dev/297.html其他接口:http://

中国银联ecshop 在线支付接口开发,php语言,在shopnc,ecshop,shopex,ecmall,xpshop,ectouch等的wap版本上完美实现移动支付

中国银联的在线支付接口PC版大家应该不在话下,但是中国银联手机移动支付接口做过的人就很少了.本人有幸和中国银联手机移动支付接口的开发者孙晨岚有过几个小时的讨论,也为客户做了几个中国银联手机移动支付接口.php语言开发的接口,在普遍流行的ecshop,shopex,ecmall等的wap版本上完美实现移动支付.    function get_code($order, $payment) { // 订单相关时间        // echo "yigang";        $order

在线支付接口之PHP支付宝接口开发简单介绍

php100:92:在线支付接口之PHP支付宝接口开发 支付接口一般是第三方提供的代收款.付款的平台,可以通过支付接口帮助企业或个人利用一切可以使用的支付方式.常见支付平台:支付宝.快钱.云网支付.财付通. 支付宝页面:订单页面.状态页面.返回页面.---->支付宝平台-->收款人账户 1.首先到支付宝申请账户:2.商家服务-->网站继承支付宝-->选择申请接口类型-->等待合同生效3.生效后下载开发集成文档. 在线申请特约商家(申请实时到账)合作者身份id:这是不会变的.交

nopcommerce 3.6网银在线支付插件(源码)

网银在线支付插件,下载后通过后台插件管理安装.配置即可使用. 下载:网银在线支付插件3.1.3.6版.rar (106.3KB) 源代码放在\Plugins目录下,用vs打开重新生成. 源地址:http://www.nopcn.com/post/nopcommerce-pay-chinaBank36.aspx

天下支付ecshop,thinkphp,shopnc在线支付接口,支付插件(payment plugin含源码)

最近应一个客户的要求,给他的一个ecshop网站开发天下支付(www.tfb8.com)在线支付接口和代付接口.天下有自己的收银台,集成了各类银行,也是不错.但是天下支付对接的时候很是麻烦,先要在测试环境下测试,有专门的测试商户号,测试通过需要把测试参数和提交的返回结果发给他们的技术支持,天下支付的技术验证通过的才会正式开通.其他的接口,比如代付API接口也需要发送测试参数才会开通.基本上还是比较正规. $reqHandler->setParameter ( "spid", $s

九派ecshop,thinkphp,shopnc在线支付接口,支付插件(payment plugin含源码)

最近应一个客户的要求,给他的一个ecshop网站开发九派在线支付接口和代付接口.九派有自己的收银台,集成了各类银行,也是不错. 九派原来采用MD5私钥认证,后来采用RAS认证.首先,对报文中出现签名域( merchantS S ign /serverSign )和证书域( merchantCert /serverCert )之外的所有数据元采用 key=value 的形式按照名称排序 ,然后以&作为连接符拼接成待签名串(value 为空的域,不参与待签名串).再使用九派支付颁发给商户的商户 RS