PHP網上支付

1,網上支付方式兩類:企業與銀行對接和經過中間公司間接與銀行對接。php

(1),企業與銀行對接,優勢:由於直接與銀行進行財務結算,交易資金結算比較安全。適合資金流量比較大的企業,這種方案適合於,每個月結算金額百萬以上的企業。缺點:開發工做量比較大,並且銀行不按期升級系統,隨着銀行系統的升級,企業也須要做相應改動,因此維護工做量比較大,並且企業每一年須要向銀行交納必定數量的接口使用費。html

(2),經過中間公司間接與銀行對接,優勢:開發工做量少,由於使用的是中間企業提供的接入規範,因此銀行升級系統不須要企業做相應修改,除非中間企業的接入規範發生改變,企業才作修改,相對於前一種,這種方案的維護工做量比較少,由於只與一家企業對接,因此接入費用相對比較低,這種方案適合於:每個月結算金額在幾十萬如下的中小企業。缺點:由於是與中間企業進行資金結算,目前全部中間企業都是私企,資金安全是個大問題。node

2,易寶和支付寶不一樣的算法

買家經過易寶直接把錢轉帳給賣家的銀行帳號;sql

買家把錢打給支付寶,在確認賣家發貨後,支付寶再把錢轉到賣家的銀行帳號;centos

3,易寶支付協議介紹瀏覽器

(1)     支付請求時HTTPS協議請求(https協議是http協議的安全版本),商戶以GET或POST方式發送到易寶支付。安全

(2)     易寶支付平臺統一使用GBK/GB2312編碼方式。服務器

(3)    參數名稱和參數說明中規定的固定值必須與列表中徹底一致(大小寫敏感)。app

4,學習下php經過易寶支付過程,其流程以下:

(1)使用測試帳號做爲易寶的商家,假設測試帳號是」賣家1「。最好下載一個易寶支付產品接口文檔。

$p1_MerId = "10001126856";
$merchantKey = "69cl522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37N4y7rI4Pl";

(2)程序框架以下圖所示:

(3)代碼頁內容

① pay.php購買頁面,其中「pd_FrpId」表示支付通道列表,須要去易寶幫助文檔的「支付通道編碼列表」查看每一個銀行的相應代碼。

<html>
<body>
    <form method="post" action="payConfirm.php">
        訂單號:<input type="text" name="p2_Order" /><br/>
        支付金額:<input type="text" name="p3_Amt" /><br/>
        請選擇支付銀行:<br/>
        <input type="radio" name="pd_FrpId" value="CMBCHINA-NET" />招商銀行<br/>
        <input type="radio" name="pd_FrpId" value="ICBC-NET" />工商銀行<br/>
        <input type="radio" name="pd_FrpId" value="ABC-NET" />農業銀行<br/>
        <input type="radio" name="pd_FrpId" value="CCB-NET" />建設銀行<br/>
        <input type="radio" name="pd_FrpId" value="GDB-NET" />廣發銀行<br/>
        <input type="submit" value="確認支付" />
    </form>
</body>
</html>

② payConfirm.php,支付確認頁面,此頁面須要根據易寶文檔中」支付請求參數「部分,將各參數賦值,同時請求頁面是「https://www.yeepay.com/app-merchant-proxy/node」。

<?php
require_once "common.php";
$p0_Cmd ="Buy";
$p1_MerId = "10001126856";

$p2_Order = $_POST['p2_Order'];
$p3_Amt = $_POST['p3_Amt'];
$p4_Cur = "CNY";
$p5_Pid = "";  //商品名稱
$p6_Pcat = ""; //商品種類
$p7_Pdesc = ""; //商品描述

$p8_Url = "http://www.lhycentos.com:2080/myNetpayment/res.php"; //支付成功頁面
$p9_SAF = "0"; //送貨地址
$pa_MP = ""; //商品擴展信息

$pr_NeedResponse = "1"; //商家是否返回易寶成功信息

$pd_FrpId = $_POST['pd_FrpId']; //各類銀行卡支付通道

//把請求參數拼接
$data = $p0_Cmd.$p1_MerId.$p2_Order.$p3_Amt.$p4_Cur.$p5_Pid.$p6_Pcat.$p7_Pdesc.$p8_Url.$p9_SAF.$pa_MP.$pd_FrpId.$pr_NeedResponse;

$merchantKey = "69cl522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37N4y7rI4Pl";
//hmac是簽名單,是用於易寶和商家互相確認的關鍵字
//這裏須要咱們使用算法來生成(md5-hmac算法)
$hmac = HmacMd5($data,$merchantKey);
?>

<html>
<body>
您的訂單號是<?=$p2_Order ?>,訂單金額是<?=$p3_Amt ?>
<form method="post" action="https://www.yeepay.com/app-merchant-proxy/node">
    <input type="hidden" name="p0_Cmd" value="<?=$p0_Cmd?>" />
    <input type="hidden" name="p1_MerId" value="<?=$p1_MerId?>" />
    <input type="hidden" name="p2_Order" value="<?=$p2_Order?>" />
    <input type="hidden" name="p3_Amt" value="<?=$p3_Amt?>" />
    <input type="hidden" name="p4_Cur" value="<?=$p4_Cur?>" />
    <input type="hidden" name="p5_Pid" value="<?=$p5_Pid?>" />
    <input type="hidden" name="p6_Pcat" value="<?=$p6_Pcat?>" />
    <input type="hidden" name="p7_Pdesc" value="<?=$p7_Pdesc?>" />
    <input type="hidden" name="p8_Url" value="<?=$p8_Url?>" />
    <input type="hidden" name="p9_SAF" value="<?=$p9_SAF?>" />
    <input type="hidden" name="pa_MP" value="<?=$pa_MP?>" />
    <input type="hidden" name="pd_FrpId" value="<?=$pd_FrpId?>" />
    <input type="hidden" name="pr_NeedResponse" value="<?=$pr_NeedResponse?>" />
    <input type="hidden" name="hmac" value="<?=$hmac?>" />
    <input type="submit" value="確認支付" />
</form>
</body>
</html>

③ payConfirm.php頁面中使用到編碼函數,此函數放在common.php中,common.php內容以下:

<?php

function HmacMd5($data,$key){

    $key = iconv("GB2312","UTF-8",$key);
    $data = iconv("GB2312","UTF-8",$data);
    $b = 64;
    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)));
}
?>

④ payConfirm.php將支付數據發送到「https://www.yeepay.com/app-merchant-proxy/node」後,進入支付頁面,易寶從用戶的網銀中把錢轉到「賣家1」的帳戶中,若是操做成功,返回到res.php頁面,此頁面是在payConfirm.php中$p8_Url = "http://www.lhycentos.com:2080/myNetpayment/res.php"; 指定的。

<?php
echo "支付成功!":
?>

(4)如今實現了支付,可是存在一個漏洞,若是有黑客攻擊,修改了支付頁面,會將錢打到錯誤的人帳號中。在res.php頁面中根據收到的參數,從新編碼和支付頁面發送過來的參數進行比較,若是相同表示支付成功,若是不相同,表示支付失敗。res.php的代碼能夠修改爲以下方式:

<?php
require_once "common.php";
$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 = $p1_MerId.$r0_Cmd.$r1_Code.$r2_TrxId.$r3_Amt.$r4_Cur.$r5_Pid.$r6_Order.$r7_Uid.$r8_MP.$r9_BType;
$merchantKey = "69cl522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37N4y7rI4Pl";

//對返回的結果進行md5-hmac加密處理,和返回的hmac簽名串比較
if(HmacMd5($res_src,$merchantKey) == $hmac){
    if($r1_Code == 1){  //支付結果,1表明成功
        if($r9_BType == 1){
            echo "交易成功!";
            echo "訂單號爲".$r6_Order."支付成功!所付金額是".$r3_Amt."易寶支付訂單號是".$r2_TrxId."。";
            echo "<br/>瀏覽器重定向";
        }elseif($r9_BType == 1){
            echo "success";
            echo "<br/>交易成功!";
            echo "<br/>服務器點對點通信";
        }
    }
}else{
    echo "簽名被篡改";
}
?>

4,支付過程存在的問題, 有個頁面執行sql語句,若是sql語句這樣:update 數據表 set 字段+100,必須對sql的執行加限制條件。由於反覆刷新頁面,能夠致使sql語句屢次執行。好比:

if(數據表1的status = 0){

update 數據表1 set 字段+100;

update 數據表2 set status=1;

}
相關文章
相關標籤/搜索