php 網上支付之易寶支付
阿新 • • 發佈:2019-02-14
目前有兩種網上支付方式:
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{
//不搭理
}*/
☞ 特別注意 易寶支付把各個銀行用一個確定值,來表示(支付通道編碼,具體如下)