- 常見支付方式:微信支付、支付寶支付、銀行卡支付。
- 支付寶支付接口的類型:(商家的集成方案)
- 擔保交易接口 用戶支付的資金先進入擔保賬戶,確認收貨后才進入商家的賬戶
- 即時到帳接口 用戶支付的資金立即進入商家賬戶
- 擔保交易接口在2016年8月已經停止申請。
支付寶支付流程:
1.創建應用(企業身份正式環境)
1支付寶開放平台:https://open.alipay.com/
2使用自己的賬號登錄
3創建應用
4添加能力-電腦網站支付
5 簽約:需要審核 需要填寫 個體工商戶信息 ,個人身份無法繼續簽約。
2.沙箱應用(個人開發者測試環境)
支付寶為沒有個體商戶資質的開發測試人員提供了一個測試環境,即沙箱應用。
在沙箱環境可以看到appid、測試支付寶網關、密鑰信息
APPID:2016080500173923
支付寶網關(gateway):https://openapi.alipaydev.com/gateway.do
秘鑰(公鑰、私鑰):需要自行生成
在沙箱帳號 里邊可以看到 商家信息 和 買家信息
進行付款的時候,就使用買家帳號
3.配置秘鑰
4.SDK的下載與配置
SDK(software development kit),軟件開發工具包,簡單來說就是一些demo示例代碼文件。
支付寶提供了一套demo文件,可以通過下載SDK拿到
https://docs.open.alipay.com/270/106291/
下載解壓
config.php: 配置文件,配置支付寶參數
index.php: demo示例文件(支付寶效果體現)
notify_url.php: 異步回調地址(通知頁面),支付寶以post隱藏方式向商家發起請求,該方式請求安全,用於處理業 務邏輯:比如商家在該請求里可以修改訂單狀態
return_url.php: 同步回調地址(通知頁面),支付寶通過get顯示方式向商家發起請求,該方式請求不安全,用於頁 面展示
SDK&DEMO的使用:
把解壓后的目錄移動到項目目錄中的public/plugins目錄並改名為alipay
通過瀏覽器直接訪問
點擊付款
會跳轉頁面報錯,需要先配置支付寶參數
設置方式:
從沙箱應用頁面,獲取到APPID, 支付寶網關,支付寶公鑰
配置秘鑰時生成的商戶私鑰
配置到public/plugins/alipay/config.php中
說明:notify_url 是用來提供給支付寶服務端調用的,必須是外網可以訪問的路徑
Return_url是用來頁面同步跳轉成功頁面,是由瀏覽器跳轉,原則上必須是外網可以訪問的路徑,這里測試可以使用本地的地址,也能跳轉成功。
在瀏覽器重新訪問
點擊付款,會跳轉到支付寶支付頁面如下:
each函數過時了,被廢除了,替換成foreach
輸入賬號密碼: 沙箱測試提供的買家賬號密碼
跳轉到同步回調地址:
同時會攜帶很多參數在url中
5.項目集成支付寶
頁面編寫隱藏表單用於點擊立即支付后的頁面跳轉和數據提交
數據提交到支付處理程序
curl函數的說明
這里需要注意的是:要想以 x-www-form-urlencoded 方式發送,最關鍵是發送的數據格式。
方式from-data試發送的數據用的是array格式,而方式為 x-www-form-urlencoded 時需要用key=value&key2=value2的格式發送,發送的是string型的數據。
比如我上面from-data數據的為: $data = [ 'username' => '小明', 'age' => '18' ]; x-www-form-urlencoded時的數據則要變為 http_build_query($data);
$headers = array('Content-Type: application/x-www-form-urlencoded');
function curl($url,$data,$headers){ $curl = curl_init(); // 啟動一個CURL會話 curl_setopt($curl, CURLOPT_URL, $url); // 要訪問的地址 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 對認證證書來源的檢查 curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0); // 從證書中檢查SSL加密算法是否存在 curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模擬用戶使用的瀏覽器 curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自動跳轉 curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自動設置Referer curl_setopt($curl, CURLOPT_POST, 1); // 發送一個常規的Post請求 curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data)); // Post提交的數據包 curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 設置超時限制防止死循環 curl_setopt($curl, CURLOPT_HEADER, 0); // 顯示返回的Header區域內容 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 獲取的信息以文件流的形式返回 curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); $result = curl_exec($curl); // 執行操作 if (curl_errno($curl)) { echo 'Errno'.curl_error($curl);//捕抓異常 } curl_close($curl); // 關閉CURL會話 echo($result); }
交易完成,跳到回調頁面,修改回調地址 進行簽名驗證,數據校驗
參考return_url.php代碼
public function callback(){ require_once("./plugins/alipay/config.php"); require_once './plugins/alipay/pagepay/service/AlipayTradeService.php'; $all = request()->all(); $alipaySevice = new \AlipayTradeService($config); $result = $alipaySevice->check($all); if($result){ $total_amount = $all["total_amount"]; return view("payok",["total_amount"=>$total_amount]); }else{ return view("payfail"); } // 等着支付寶給我跳回來 get // dd(request()->all()); // $all = request()->all(); }
再次支付
alipay定義了和laravel框架意義的同名函數,建議修改Alipay函數名即可
修改文件 /plugins/alipay/aop/AopEncrypt.php 第15行,第30行
修改文件 /plugins/alipay/lotusphp_runtime/Cookie/Cookie.php
再次支付