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; }