名人论坛

查看: 521|回复: 0

php 银行接口开发写法

[复制链接]

180

主题

183

帖子

1417

积分

管理员

Rank: 9Rank: 9Rank: 9

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

 提交订单(商户通过POST方式用下面代码将支付请求提交至ChinaBank)


   //4位数字,必填,由ChinaBank负责分配
   //64位字符以内,必填,两日内不重复
   //必填,单位元,小数点后保留两位,如10或12.34
   //最长25字符
   //最长32个字符
   //最长12位
   //最长128字符
   //最长61字符
   //不可为空值,长度为8位,格式为yyyymmdd
  //商户配货状态,0为未配齐,1为已配齐
  //0为人民币,1为美元
  //为消费者完成购物后返回的商户页面,URL参数是以http://开头的完整URL地址
   //数字签名,确保是商户提供的订单。
  

  说明:1.将汉字改为相应内容,编号、订单号、订单总金额为数字。

  2.商户编号为4位数字以上,由网银分配。

  2.订单号一天内不能重复,如果没有提供,ChinaEbank系统会自动生成一个订单号。

  3. 订单金额由数字组成,单位为元,如12 代表12元,不能写成12.00 。12.34代表12元3角4分。

  4.订单日期由ChinaEbank系统自动生成,以服务器时间为准(北京时间)。

  5.关于数字签名。如果提交v_ md5info, ChinaEbank系统将会启动数字签名安全检测系统,对商户提交订单数据及签名值进行校验,以保证只接受来自商户的订单,并且其内容真实可信,校验目前必须。

  6.高级用户的功能需要向ChinaEbank办理相关手续后才能使用。

  v_ md5info由开发包的新增函数实现,支持ASP/PHP/JAVA,是推荐的方式。在使用该功能前需要先在服务器上安装相关文件,详细安装法请参见README.TXT。 在开发前请到ChinaEbank管理后台上设置私钥值,这里暂为test

  MD5字符串值=md5函数(“字符串”,”私钥”),其中字符串为v_moneytype+v_ymd+v_amount+v_rcvtel+v_oid+v_mid+v_url+password (+表示连接符,起拼凑用,不是需要递交的字符”+”)

  设v_moneytype=”0”, v_ymd=”19990720”, v_amount=”13.45”, v_rcvtel=”12345678”, v_oid=” 19990720-1001-000001234”, v_mid=”1001”, v_url=” http://domain/program”,MD5函数名为md5,私钥等于 “password” ,变量ordermd5存储MD5字符串值,则调用方法如下:

  ordermd5=md5(“01999072013.451234567819990720-1001-0000012341001http://domain/programpassword”);

  注意:拼凑的字符串里不能含有中文。

  [以下仅提供参考和建议]

  如果你的系统支持php,则可以通过调用PHP内带MD5函数生成的MD5字符串,这样可以减少安装开发包的麻烦。

  设v_moneytype=”0”, v_ymd=”19990720”, v_amount=”13.45”, v_rcvtel=”12345678”, v_oid=” 19990720-1001-000001234”, v_mid=”1001”, v_url=” http://domain/program”, 函数名为md5,私钥等于 “password” ,变量ordermd5存储MD5字符串值,则调用方法如下:

  设v_mid=”0001” , v_oid=”123456” , v_amoun=”12.34” , 函数名为md5,私钥等于 “password” ,变量ordermd5存储MD5字符串值,则调用方法如下:


  [以上参考和建议结束]

  上述v_ md5info值必须提交。特别注意字符串中间不能有空格。

  二、返回结果接收与处理(ChinaEbank通过POST方式用下面代码将支付结果返至商户)


  //订单编号
  //支付方式
  //支付状态 20表示支付成功 1表示非实时卡扣款成功 30表示支付失败
  //支付结果说明,如’支付完成’ 或 ‘支付失败’
  //数字签名,用于核对上述数据真实性。
  //支付金额
  //支付货币类型
  //数字签名,用于核对支付金额及支付货币类型的数据真实性。
  //这是上面用到MD5必须的校验码,建议商户对其校验

  说 明:

  注意返回结果代码是由ChinaEbank系统自动实现的,并不需要商户实现该代码。提供该代码的用意是方便商户理解ChinaEbank返回数据的原理及变量值,以便实时接收订单支付结果。

  商户自定义返回url地址,带http头是指商户接收支付结果的网页,如果不涉及到实时销售,可以简单的设成商户域名,如http://www.domain.com ,注意要包括 http:// 。该网址在商户提交支付表单时自定义。ChinaEbank在消费者网上支付后实时的向该地址通过POST的方式发送支付结果说明。

  为了确保安全,有技术开发实力的商户,一定要通过v_md5info及v_md5money数据签名来检验接收数据的真实有效性,防止恶意行为。

  [-----------------------------------------------------------------------------------------------------------------

  v_md5info由开发包的新增函数实现,支持ASP/PHP/JAVA,是推荐的方式。在使用该功能前需要先在服务器上安装相关文件,详细安装方法请 参见README.TXT。 v_md5info字符串值=md5函数(“字符串”,”私钥”),其中字符串为v_oid+v_pstatus+v_pstring+v_pmode的 连接值。

  设v_oid=”20040415-1001-123456”,v_pstatus=”20”,v_pstring=”支付完成”,v_pmode=”工商银行”,函数名为hmac ,私钥等于 “password” ,变量pmd5存储MD5字符串值,则调用方法如下:

  pmd5 =hmac(“20040415-1001-12345620支付完成工商银行”,” password”);

  if (pmd5== v_md5info) {订单支付结果可信 ,进入支付结果处理,如果支付成功发货,不成功给提示。}

  如果使用PHP字带的MD5,上述v_md5info无须校验和使用,可对返回值v_md5进行校验。

  v_md5:其拼凑及加密是虚拟主机型用户专用,具体内容见下:

  其返回的v_md5拼接字符串的顺序为:v_oid,v_pstatus,v_amount,v_moneytype,key

  注意:上面的key值是商户与网银私下约定的密钥,在真正用户支付完毕后,网银不返回key值。

  用户需要对返回的v_oid,v_pstatus,v_amount,v_moneytype及自己掌握的key进行拼凑,具体操作见演示文档。

  实时性应用强的商户(售卡网站等),因为各平台对汉字MD5校验值存在偏差现象,请商户勿对v_pmode和v_pstring信息进行唯一确认。因以v_pstatus的值为判断对象,同时,建议商户对返回金额与商户自己数据库中记录的金额做进一步判断操作。

  定义:

  定义值=md5(v_oid+v_pstatus+v_amount+v_moneytype+key)

  在匹配的时候,如果系统对大小写有区分,请自行转换。譬如ASP函数中:LCase是将字符转换为小写; Ucase是将字符转换为大写,相关代码:大写 = Ucase(char)

  网银支付接口目前只接受大写MD5。

  实时提货的商户还需要对金额信息进一步校验,即v_md5money校验,v_md5money字符串=md5函数(“字符串”,”私钥”),其中字符串为v_amount+v_moneytype的连接值。

  设v_amount=”12.34”,v_moneytype=”0”,函数名为hmac ,私钥等于 “password” ,变量m_pmd5存储MD5字符串值,则调用方法如下:

  m_pmd5=hmac(“12.340”,” password”);

  将m_pmd5与接收的v_md5money作比较,如果是相等,刚表明该结果的金额是可信的,注意,商户要加强安全性的话,除了对支付完成及支付金额做判断处理,还需要对自己订单数据库表中的金额做判断,防止消费者支付的金额不足。

  [以下仅做开发人员参考使用]

  v_nmd5由开发包的新增函数实现,支持ASP/PHP/JAVA,该函数只对数字部分的数据进行签名,主要是解决字符集兼容性问题,使用方法与 v_pmd5类似,区别是取消了。在使用该功能前需要先在服务器上安装相关文件,详细安装方法请参见README.TXT。 MD5字符串值=md5函数(“字符串”,”私钥”),其中字符串为v_oid+v_pstatus+v_amount+v_moneytype 的连接值。

  如果你的系统支持php,则可以通过调用PHP内带MD5函数生成的MD5字符串,这样可以减少安装开发包的麻烦。设 v_oid=”20040415-1001-123456”,v_pstatus=”20”,v_amount=”20.0000”,v_moneytype=”0”, 函数名为md5 ,私钥等于 “password” ,变量phpmd5存储MD5字符串值,则调用方法如下:


  $phpmd5=md5(“20040415-1001-1234562020.00000password”); ?

  if ($phpmd5==HTTP_POST_VARS[‘v_md5’]) { //支付结果可信

  …处理支付结果 ,如果成功则发货,不成功给给予提示。

  注意,还要做支付金额判断处理,防止消费者支付的金额不足。

  //同理还需对返回的参数v_md5money值校验

  }

  ?>

  [参考内容,旨在给开发人员提供开发思路]

  三.演示代码(ASP/PHP)

  1、PHP代码


  //PHP提交程序示范,仅供参考

  $v_mid ="0001"; //商户编号,改成ChinaEbank负责分配给商户的编号

  $v_oid ="200404161001000001"; //定单号,由商户负责产生的64位之内订单编号,一天内不能重复

  $v_amount ="00.01"; //定单金额,单位元,小数点后保留两位,如10或12.34,如果为整数,则不需要小数点

  $v_rcvname ="test"; //收货人名字

  $v_rcvtel ="8008101234"; //收货人电话

  $v_rcvpost ="100000"; //收货人邮编

  $v_rcvaddr ="beijing"; //收货人地址

  $v_ordername="chinabank"; //发货人名字

  $v_ymd ="20040415"; //订单生成日期

  $v_orderstatus ="0"; //配货状态

  $v_moneytype ="0"; //支付币种

  $v_url ="http://www.test.com/receive.php"; //返回商户页面地址

  $key ="test"; //默认的私钥值,更改私钥后要修改这里

  $md5string=strtoupper(md5($v_moneytype.$v_ymd.$v_amount.$v_rcvtel.$v_oid.$v_mid.$v_url.$key));

  ?>

















  

  //PHP接收程序示范,仅供参考

  //-----------接收ChinaBank平台返回的信息--------------------------------------------------------------------

  $v_oid =trim($HTTP_POST_VARS['v_oid' ]); //支付定单号

  $v_pmode =trim($HTTP_POST_VARS['v_pmode' ]); //支付方式

  $v_pstatus=trim($HTTP_POST_VARS['v_pstatus']); //支付状态(如果为”20“,则表示支付成功,1为已对非实时支付卡扣款成功,30表示支付失败)

  $v_pstring=trim($HTTP_POST_VARS['v_pstring']); //支付结果说明,如”支付完成”或”支付失败”

  $v_amount=trim($HTTP_POST_VARS['v_amount']); //支付金额

  $v_md5info =trim($HTTP_POST_VARS['v_md5info' ]); //数字签名

  $v_moneytype =trim($HTTP_POST_VARS['v_moneytype' ]); //支付货币类型

  $v_md5money =trim($HTTP_POST_VARS['v_md5money' ]); //数字签名,核对支付金额及支付币种

  //-----------重新计算md5的值---------------------------------------------------------------------------

  $key ="test"; //默认的私钥值,更改私钥后要修改这里

  $md5string=md5($v_oid.$v_pstatus.$v_amount.$v_moneytype.$key);

  //$md5money=md5($v_amount.$v_moneytype.$key);

  //3-----------判断返回信息,如果支付成功,并且支付结果可信,则做进一步的处理----------------------------

  if(($v_pstatus=="20")&&($v_md5==$md5string)){

  // $ v_pstring="支付完成" ---- 亦可以做为判断支付成功的语句

  //do something here;

  }

  //4---------判断返回金额信息,对金额及支付币种校验

  if($v_md5money==$md5money){

  //do something here;

  }

  ?>


回复

使用道具 举报

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

本版积分规则

QQ|支付接口网

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

GMT+8, 2024-5-17 17:38 , Processed in 0.979218 second(s), 18 queries .

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

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