php 网上支付之易宝支付

目前有两种网上支付方式:

1、直接和银行对接

* 缺点是工作量大,而且需要资格审核

* 优点安全

2、和中间公司对接

* 缺点就是安全隐患

* 优点就是开发维护方便

 

易宝支付实现过程:

 

1、前提: 需要我们商家到易宝公司去注册账号

目前我们使用yeebay公司提供了用于测试的账号和密钥

账号 :$p1_MerId ="10001126856";

密钥: $merchantKey ="69cl522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37N4y7rI4Pl";

2、开发界面

<html>
<head>
<meta http-equiv="content-type"content="text/html;charset=gb2312"/>
</head>
<form action="payConfirm.php"method="post">
<table>
<tr>
<td colspan="4">
订单号:<inputtype="text" name="p2_Order"/>
支付金额:<inputtype="text" name="p3_Amt"/></td>
</tr>
<tr><td colspan="4">请选择支付银行</td></tr>
<tr>
<td><input type="radio"name="pd_FrpId" value="CMBCHINA-NET"/>招商银行</td>
<td><input type="radio"name="pd_FrpId" value="ICBC-NET"/>工商银行</td>
<td><input type="radio"name="pd_FrpId" value="ABC-NET"/>农业银行</td>
<td><input type="radio"name="pd_FrpId" value="CCB-NET"/>建设银行</td>
</tr>
<tr>
<td colspan="4"><inputtype="submit" value="确认支付"/></td>
</tr>
</table>
</form>
</html>

3、生成一个hmac签名串.

关键代码:

function HmacMd5($data,$key){
	// RFC 2104 HMAC implementation for php.
	// Creates an md5 HMAC.
	// Eliminates the need to install mhash tocompute a HMAC
	// Hacked by Lance Rushing(NOTE: Hackedmeans written)
	//需要配置环境支持iconv,否则中文参数不能正常处理
	$key =iconv("GB2312","UTF-8",$key);
	$data =iconv("GB2312","UTF-8",$data);
	$b = 64; // byte length for md5
	if (strlen($key) > $b) {
	$key = pack("H*",md5($key));
	}
	$key = str_pad($key, $b, chr(0x00));
	$ipad = str_pad('', $b, chr(0x36));
	$opad = str_pad('', $b, chr(0x5c));
	$k_ipad = $key ^ $ipad ;
	$k_opad = $key ^ $opad;
	return md5($k_opad .pack("H*",md5($k_ipad . $data)));
}

4、开发确认支付页面

<html>
<head>
<metahttp-equiv="content-type"content="text/html;charset=gb2312"/>
</head>
<?php
       include_once'Common.php';
       //这里我们获取用户提交的信息
 
       //1.获取订单号
      
       $p0_Cmd="Buy";
       $p1_MerId="10001126856";
       $p2_Order=$_REQUEST['p2_Order'];
       $p3_Amt=$_REQUEST['p3_Amt'];
       $p4_Cur="CNY";
       //商品名称
       $p5_Pid="";
       $p6_Pcat="";//种类
       $p7_Pdesc="";//商品介绍
       //这是易宝支付成功后,给url返回信息
       $p8_Url="http://localhost:80/myNetPayment/res.php";
       $p9_SAF="0";
       $pa_MP="";
       $pd_FrpId=$_REQUEST['pd_FrpId'];
       $pr_NeedResponse="1";
 
 
      
 
       //我们把请求参数一个一个拼接(拼接的时候,顺序很重要!!!!)
       $data="";
       $data=$data.$p0_Cmd;
       $data=$data.$p1_MerId;
       $data=$data.$p2_Order;
       $data=$data.$p3_Amt;
       $data=$data.$p4_Cur;
       $data=$data.$p5_Pid;
       $data=$data.$p6_Pcat;
       $data=$data.$p7_Pdesc;
       $data=$data.$p8_Url;
       $data=$data.$p9_SAF;
       $data=$data.$pa_MP;
       $data=$data.$pd_FrpId;
       $data=$data.$pr_NeedResponse;
      
       $merchantKey ="69cl522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37N4y7rI4Pl";
 
       //hmac是签名串,是用于易宝和商家互相确认的关键字
       //这里我们需要使用算法来生成( md5-hmac算法)
       $hmac=HmacMd5($data,$merchantKey);
 
 
?>
你的订单号是<?phpecho $p2_Order; ?> 支付的金额是<?php echo $p3_Amt;?>
<!--把要提交的数据用隐藏域表示-->
<formaction="https://www.yeepay.com/app-merchant-proxy/node"method="post">
<input type="hidden"name="p0_Cmd" value="<?php echo $p0_Cmd;?>"/>
<input type="hidden"name="p1_MerId" value="<?php echo $p1_MerId; ?>"/>
<input type="hidden"name="p2_Order" value="<?php echo $p2_Order; ?>"/>
<input type="hidden"name="p3_Amt" value="<?php echo $p3_Amt; ?>"/>
<input type="hidden"name="p4_Cur" value="<?php echo $p4_Cur;?>"/>
<input type="hidden"name="p5_Pid" value="<?php echo $p5_Pid?>"/>
<input type="hidden"name="p6_Pcat" value="<?php echo $p6_Pcat;?>"/>
<input type="hidden"name="p7_Pdesc" value="<?php echo $p7_Pdesc;?>"/>
<input type="hidden" name="p8_Url"value="<?php echo $p8_Url;?>"/>
<input type="hidden"name="p9_SAF" value="<?php echo $p9_SAF;?>"/>
<input type="hidden"name="pa_MP" value="<?php echo $pa_MP;?>"/>
<input type="hidden"name="pd_FrpId" value="<?php echo $pd_FrpId;?>"/>
<input type="hidden"name="pr_NeedResponse" value="<?php echo$pr_NeedResponse;?>"/>
<input type="hidden"name="hmac" value="<?php echo $hmac;?>"/>
<input type="submit"value="确认网上支付"/>
</form>
</html>

5、供易宝回调的页面

<?php
       //echo"支付成功!";
 
       include_once'Common.php';
       //获取从易宝支付网关返回的信息
       //$p1_MerId=
 
       $p1_MerId="10001126856";//就是自己的商号.
        
       $r0_Cmd=$_REQUEST['r0_Cmd'];
       $r1_Code=$_REQUEST['r1_Code'];
       $r2_TrxId=$_REQUEST['r2_TrxId'];
       $r3_Amt=$_REQUEST['r3_Amt'];
       $r4_Cur=$_REQUEST['r4_Cur'];
       $r5_Pid=$_REQUEST['r5_Pid'];
       $r6_Order=$_REQUEST['r6_Order'];
       $r7_Uid=$_REQUEST['r7_Uid'];
       $r8_MP=$_REQUEST['r8_MP'];
       $r9_BType=$_REQUEST['r9_BType'];
       $hmac=$_REQUEST['hmac'];
 
       //拼接
       $res_src="";
       $res_src=$res_src.$p1_MerId;
       $res_src=$res_src.$r0_Cmd;
       $res_src=$res_src.$r1_Code;
       $res_src=$res_src.$r2_TrxId;
       $res_src=$res_src.$r3_Amt;
       $res_src=$res_src.$r4_Cur;
       $res_src=$res_src.$r5_Pid;
       $res_src=$res_src.$r6_Order;
       $res_src=$res_src.$r7_Uid;
       $res_src=$res_src.$r8_MP;
       $res_src=$res_src.$r9_BType;
       $merchantKey = "69cl522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37N4y7rI4Pl";
       //对返回的结果进行md5-hmac加密处理,和返回的hmac签名串比较
       if(HmacMd5($res_src,$merchantKey)==$hmac){
              if($r1_Code==1){
                     if($r9_BType==1){
                            echo'交易成功!';
                            echo'订单号为'.$r6_Order.'支付成功!'.'所付金额是'.$r3_Amt."易宝支付订单号".$r2_TrxId;
                            echo'<br/>浏览器重定向';
                     }elseif($r9_BType==2){
 
                            echo'success';
                            echo'<br/>交易成功!';
                            echo'<br/>服务器点对点通讯';
                     }
              }
       }else{
              echo"签名被篡改";
       }
?>

强调:

防止用户反复刷新回调页面

方法很多,这里我就抛砖一个

/*//假设我们点卡充值
                            //order表
                            //id    status
                              14567   未付款
                            //----gameCard表
                            //  id     pwd     balance余钱
                            //  12345  ????    12
                            $sql="updategameCard set banlance
=balance+10 where id=12345";
                            //更新数据库
 
                            //1.根据订单的状态看看该订单是否付款
                            if(订单付款否==false){
                                   $sql="updategameCard set banlance
=balance+10 where id=12345";
                    $sql="update order setstatus=已付款 whereid=14567"
                            }else{
                                   //不搭理
                            }*/

☞ 特别注意 易宝支付把各个银行用一个确定值,来表示(支付通道编码,具体如下)

 

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
1.文件列表说明 |-----------YeePayCommon.php(共通函数文件,不需要进行任何修改) |-----------merchantProperties.php(商家属性文件,商家可以在此文件中修改商家的ID和密钥和支付返回地址等信息) |-----------req.php (支付请求文件,通过此文件发起支付请求,商家可以在此文件中写入自己的订单信息等,然后把请求提交给易宝支付) |-----------callback.php(支付结果返回文件,通过此文件商家判断对应订单的支付成功状态,并且根据结果修改自己数据库中的订单状态) |-----------QueryOrder.php (易宝支付查询接口主程序) |-----------HttpClient.class.php (共通函数文件,用于服务器通讯) 2.商家测试可以先用易宝支付的测试商家测试成功再在merchantProperties.php文件中修改成自己的商家ID和密钥信息 $p1_MerId = "10001126856"; $merchantKey = "69cl522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37N4y7rI4Pl"; 商家ID和密钥需要同时修改才有效 3.支付成功的返回URL请在merchantProperties.php文件中进行修改 $merchantCallbackURL = "http://localhost/callback.php"; 商家正式运行时,必须把自己的服务器部署在公网上的服务器上,这样支付成功后易宝支付的服务器才能支付结果及时返回给商家 为了商家技术工程师开发的方便,如果测试服务器在工程师自己的服务器上,可以把URL设定为localhost的方式,浏览器可以正式返回。 4.共通文件采用服务器包含的方式进行处理

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值