在沙箱測試篇講過的我在這裏就再也不作重複,詳情請見上一篇PHP開發電腦網站支付寶支付詳細流程(沙箱測試篇)php
在沙箱測試的時候使用的是沙箱環境中的配置,如今進行線上測試,須要建立應用數據庫
登陸螞蟻金服開放平臺商戶帳號,進入管理中心數組
選擇開發者中心->網頁&移動應用瀏覽器
選擇支付接入服務器
根據開發需求填寫基本信息網絡
建立完成後,完善基本信息app
上傳應用圖標框架
選擇須要的功能(注:功能須要簽約)異步
在開發配置這裏,按照沙箱測試的時候同樣,生成密鑰,設置受權回調地址等,而後提交審覈(審覈須要1個工做日)函數
審覈經過後會顯示狀態已上線,一樣也能夠看到appid
能夠點擊查看->應用信息查看你須要的信息和配置
官方建立應用詳細流程請見(https://docs.open.alipay.com/399/106843/)
二、封裝類庫,選擇須要的功能放入框架
我本身選擇了支付模塊的功能,找到付款須要的類庫,所有放入extend
(須要的能夠下載https://pan.baidu.com/s/17A2YMahZX6nNmS2sCwJKzQ)
我拿出配置文件放入application/extra目錄下,格式改爲return的數組形式
注意:我在配置文件里加入了seller_id的配置(seller_id能夠在帳戶信息中查看)
創建一個支付的控制器,引入文件,具體代碼以下
<?php
namespace app\index\controller;
use think\Controller;
//支付控制器
class Pay extends Controller{
//發起電腦網站支付請求
public function pagePay(){
//商戶訂單號,商戶網站訂單系統中惟一訂單號,必填
$out_trade_no = trim($_POST['out_trade_no']);
//訂單名稱,必填
$subject = trim($_POST['subject']);
//付款金額,必填
$total_amount = trim($_POST['total_amount']);
//商品描述,可空
//$body = trim($_POST['body']);
//構造參數
$payRequestBuilder = new \alipay\AlipayTradePagePayContentBuilder();
// $payRequestBuilder->setBody($body);
$payRequestBuilder->setSubject($subject);
$payRequestBuilder->setTotalAmount($total_amount);
$payRequestBuilder->setOutTradeNo($out_trade_no);
$aop = new \alipay\AlipayTradeService();
/**
* pagePay 電腦網站支付請求
* @param $builder 業務參數,使用buildmodel中的對象生成。
* @param $return_url 同步跳轉地址,公網能夠訪問
* @param $notify_url 異步通知地址,公網能夠訪問
* @return $response 支付寶返回的信息
*/
$response = $aop->pagePay($payRequestBuilder,config('alipay.return_url'),config('alipay.notify_url'));
}
//回調地址
public function notify_url(){
$arr=$_POST;
$alipaySevice = new \alipay\AlipayTradeService();
$alipaySevice->writeLog(var_export($_POST,true));
$result = $alipaySevice->check($arr);
/* 實際驗證過程建議商戶添加如下校驗。
一、商戶須要驗證該通知數據中的out_trade_no是否爲商戶系統中建立的訂單號,
二、判斷total_amount是否確實爲該訂單的實際金額(即商戶訂單建立時的金額),
三、校驗通知中的seller_id(或者seller_email) 是否爲out_trade_no這筆單據的對應的操做方(有的時候,一個商戶可能有多個seller_id/seller_email)
四、驗證app_id是否爲該商戶自己。
*/
if($result) {//驗證成功
//請在這裏加上商戶的業務邏輯程序代
//——請根據您的業務邏輯來編寫程序(如下代碼僅做參考)
//獲取支付寶的通知返回參數,可參考技術文檔中服務器異步通知參數列表
//商戶訂單號
$out_trade_no = $_POST['out_trade_no'];
//支付寶交易號
$trade_no = $_POST['trade_no'];
//交易狀態
$trade_status = $_POST['trade_status'];
if($_POST['trade_status'] == 'TRADE_FINISHED') {
//判斷該筆訂單是否在商戶網站中已經作過處理
//若是沒有作過處理,根據訂單號(out_trade_no)在商戶網站的訂單系統中查到該筆訂單的詳細,並執行商戶的業務程序
//請務必判斷請求時的total_amount與通知時獲取的total_fee爲一致的
//若是有作過處理,不執行商戶的業務程序
//注意:
//退款日期超過可退款期限後(如三個月可退款),支付寶系統發送該交易狀態通知
}
else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {
//判斷該筆訂單是否在商戶網站中已經作過處理
//若是沒有作過處理,根據訂單號(out_trade_no)在商戶網站的訂單系統中查到該筆訂單的詳細,並執行商戶的業務程序
//請務必判斷請求時的total_amount與通知時獲取的total_fee爲一致的
//若是有作過處理,不執行商戶的業務程序
//注意:
//付款完成後,支付寶系統發送該交易狀態通知
}
//——請根據您的業務邏輯來編寫程序(以上代碼僅做參考)——
echo "success";//請不要修改或刪除
}else {
//驗證失敗
echo "fail";
}
}
}
在生成訂單後,訪問pagePay這個函數,發起電腦網站的支付請求
在請求迴應後跳轉到回調地址notify_url,如果支付正常,則更新數據庫的信息,具體代碼就再也不這裏進行展現了(若是實在須要能夠私聊我)
注意:return_url 和 notify_url 的區別
notify_url爲服務器通知,支付寶能夠保證99.9999%的通知到達率,前提是您的網絡通暢。
return_url爲網頁重定向通知,是由客戶的瀏覽器觸發的一個通知,若客戶去網銀支付,也會受銀行接口影響,因爲各類影響因素特別多,因此該種類型的通知支付寶不保證其到達率。