1. 程式人生 > >php 網上支付之易寶支付

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{
                                   //不搭理
                            }*/

☞ 特別注意 易寶支付把各個銀行用一個確定值,來表示(支付通道編碼,具體如下)