Thinkphp5開發電腦網站支付寶支付詳細流程(線上測試篇)

在沙箱測試篇講過的我在這裏就再也不作重複,詳情請見上一篇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能夠在帳戶信息中查看)

創建一個支付的控制器,引入文件,具體代碼以下

 
  1. <?php

  2. namespace app\index\controller;

  3. use think\Controller;

  4. //支付控制器

  5. class Pay extends Controller{

  6. //發起電腦網站支付請求

  7. public function pagePay(){

  8. //商戶訂單號,商戶網站訂單系統中惟一訂單號,必填

  9. $out_trade_no = trim($_POST['out_trade_no']);

  10. //訂單名稱,必填

  11. $subject = trim($_POST['subject']);

  12. //付款金額,必填

  13. $total_amount = trim($_POST['total_amount']);

  14. //商品描述,可空

  15. //$body = trim($_POST['body']);

  16. //構造參數

  17. $payRequestBuilder = new \alipay\AlipayTradePagePayContentBuilder();

  18. // $payRequestBuilder->setBody($body);

  19. $payRequestBuilder->setSubject($subject);

  20. $payRequestBuilder->setTotalAmount($total_amount);

  21. $payRequestBuilder->setOutTradeNo($out_trade_no);

  22. $aop = new \alipay\AlipayTradeService();

  23. /**

  24. * pagePay 電腦網站支付請求

  25. * @param $builder 業務參數,使用buildmodel中的對象生成。

  26. * @param $return_url 同步跳轉地址,公網能夠訪問

  27. * @param $notify_url 異步通知地址,公網能夠訪問

  28. * @return $response 支付寶返回的信息

  29. */

  30. $response = $aop->pagePay($payRequestBuilder,config('alipay.return_url'),config('alipay.notify_url'));

  31. }

  32.  
  33. //回調地址

  34. public function notify_url(){

  35. $arr=$_POST;

  36. $alipaySevice = new \alipay\AlipayTradeService();

  37. $alipaySevice->writeLog(var_export($_POST,true));

  38. $result = $alipaySevice->check($arr);

  39. /* 實際驗證過程建議商戶添加如下校驗。

  40. 一、商戶須要驗證該通知數據中的out_trade_no是否爲商戶系統中建立的訂單號,

  41. 二、判斷total_amount是否確實爲該訂單的實際金額(即商戶訂單建立時的金額),

  42. 三、校驗通知中的seller_id(或者seller_email) 是否爲out_trade_no這筆單據的對應的操做方(有的時候,一個商戶可能有多個seller_id/seller_email)

  43. 四、驗證app_id是否爲該商戶自己。

  44. */

  45. if($result) {//驗證成功

  46. //請在這裏加上商戶的業務邏輯程序代

  47. //——請根據您的業務邏輯來編寫程序(如下代碼僅做參考)

  48. //獲取支付寶的通知返回參數,可參考技術文檔中服務器異步通知參數列表

  49. //商戶訂單號

  50. $out_trade_no = $_POST['out_trade_no'];

  51. //支付寶交易號

  52. $trade_no = $_POST['trade_no'];

  53. //交易狀態

  54. $trade_status = $_POST['trade_status'];

  55. if($_POST['trade_status'] == 'TRADE_FINISHED') {

  56. //判斷該筆訂單是否在商戶網站中已經作過處理

  57. //若是沒有作過處理,根據訂單號(out_trade_no)在商戶網站的訂單系統中查到該筆訂單的詳細,並執行商戶的業務程序

  58. //請務必判斷請求時的total_amount與通知時獲取的total_fee爲一致的

  59. //若是有作過處理,不執行商戶的業務程序

  60. //注意:

  61. //退款日期超過可退款期限後(如三個月可退款),支付寶系統發送該交易狀態通知

  62. }

  63. else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {

  64. //判斷該筆訂單是否在商戶網站中已經作過處理

  65. //若是沒有作過處理,根據訂單號(out_trade_no)在商戶網站的訂單系統中查到該筆訂單的詳細,並執行商戶的業務程序

  66. //請務必判斷請求時的total_amount與通知時獲取的total_fee爲一致的

  67. //若是有作過處理,不執行商戶的業務程序

  68. //注意:

  69. //付款完成後,支付寶系統發送該交易狀態通知

  70. }

  71. //——請根據您的業務邏輯來編寫程序(以上代碼僅做參考)——

  72. echo "success";//請不要修改或刪除

  73. }else {

  74. //驗證失敗

  75. echo "fail";

  76.  
  77. }

  78.  
  79.  
  80. }

  81. }


在生成訂單後,訪問pagePay這個函數,發起電腦網站的支付請求

在請求迴應後跳轉到回調地址notify_url,如果支付正常,則更新數據庫的信息,具體代碼就再也不這裏進行展現了(若是實在須要能夠私聊我)

注意:return_url 和 notify_url 的區別

notify_url爲服務器通知,支付寶能夠保證99.9999%的通知到達率,前提是您的網絡通暢。 

return_url爲網頁重定向通知,是由客戶的瀏覽器觸發的一個通知,若客戶去網銀支付,也會受銀行接口影響,因爲各類影響因素特別多,因此該種類型的通知支付寶不保證其到達率。 

相關文章
相關標籤/搜索