PHP代碼篇(七)--ThinkPHP5.1使用支付寶-電腦網站支付


一、說明

  1、整體流程

    :之前沒有做過支付,所以對於支付,還是有點迷糊,這次主要是記錄下“支付寶電腦網站支付”的一個完成開發流程。說明(本身支付寶支付,微信支付其實有很多類型,比如支付寶有,當面付,APP支付,手機網站支付,微信JSAPI支付,付款碼支付,Native支付,H5支付,我們根據公司業務需求,選擇對應的官網開發文檔,進行引入即可)。本次開發使用的是thinkPHP5.1版本。

  2、涉及步驟

    :支付寶支付流程說明

    :支付寶官方damo的使用

    :支付寶回調notify_url異步通知的書寫

    :集成thinkPHP框架下引入支付寶damo的流程

二、支付業務及支付寶流程說明

  1、首先我們的業務需求及支付寶流程如下:

  2、實際中大多頁面場景如下:

 

 三、開發准備步驟:

  1、查看支付寶“支付寶支付開放平台”地址https://open.alipay.com/developmentDocument.htm

 

   2、文檔里面有非常詳細的介紹,這邊我們不做具體展開說明,實際開發中我們需要了解下,注意接口說明。這里我們點擊下載 官方的PHP Demo

 

   3、下載后應該是一個壓縮包 alipay.trade.page.pay-PHP-UTF-8.zip,我們對其解壓,然后重命名為 alipayPc。

 

   4、上面的准備工作做好了后,我們接下來進入實際的開發步驟。

 四、實際開發流程,在框架中使用demo

  1、涉及步驟

    :將解壓后的文件夾alipayPc復制到框架中

    :對官方寫的支付,回調,業務代碼進行分離,分離出一個自定義的AliPayPc()類

    :配置config.php支付相關參數,

    :在控制器中調用AliPayPc()類,進行支付

    :新增回調文件,書寫回調代碼

  2、解壓后我們可以看到,demo文件如下,文件具體我這邊就不做說明,只說下本次需要參考的文件,具體自己可以看下官網手冊。

 

 

   3、上面的return_url.php 為官方寫的回調文件,主要是進行驗證

$arr=$_POST;
$alipaySevice = new AlipayTradeService($config); 
$alipaySevice->writeLog(var_export($_POST,true));
$result = $alipaySevice->check($arr);//驗簽方法

 

   4、然后是pagepay文件夾里面,有進行支付,查詢交易,關閉交易,退款,退款查詢,的官方參看代碼,待會我們書寫自己的 AliPayPc()類,基本是參考這樣寫。

 

 

   5、這里說明下,解壓的文件我們是放在thinkPHP的 extend 目錄,有些人可能習慣放到 vendor 目錄,thinkPHP官網有說過,vendor 作為 使用 composer安裝的擴展文件目錄,而extend是手動引入的第三方文件目錄,所以我們開發,還是需要准守規范比較好。

   6、下面我們在extend下的lib目錄,沒有新建一個lib文件夾,新建一個剛才說的自定義支付類 AliPayPc.php 文件。

 

 

 

   7、代碼如下,這里面我們進行分離出剛才說的官方支付代碼

 <?php
/**
 * Created by PhpStorm.
 * User: WuYan
 * Date: 2020/4/28
 * Time: 20:00
 * 支付寶電腦網站支付
 */
namespace lib;
class AliPayPc
{
    /**
     * 支付寶收款
     */
    public static function setAilPay()
    {
        
    }
}

 

   8、直接復制和修改pagepay目錄下的pagepay.php文件,主要是修改下文件引入路徑,和參數傳入的方式

<?php

/**
 * Created by PhpStorm.
 * User: WuYan
 * Date: 2020/4/28
 * Time: 20:00
 * 支付寶電腦網站支付
 */

namespace lib;

class AliPayPc
{
    /**
     * 支付寶收款
     * @param [type] $out_trade_no 商戶訂單號
     * @param [type] $subject 訂單名稱
     * @param [type] $total_amount 付款金額
     * @param [type] $body 商品描述,可空
     * @param [type] $config_data 支付參數,數組類型;為空則取默認參數
     * @return void
     */
    public static function setAilPay($out_trade_no,$subject,$total_amount,$body,$config_data = [])
    {
        require_once env('extend_path').'/alipayPc/config.php';//引入路徑參考自己的實際存放路徑
        require_once env('extend_path').'/alipayPc/pagepay/service/AlipayTradeService.php';
        require_once env('extend_path').'/alipayPc/pagepay/buildermodel/AlipayTradePagePayContentBuilder.php';

        //構造參數
        $payRequestBuilder = new \AlipayTradePagePayContentBuilder();//類名前面加 \ 調用外部類,需要在類名前加 \ 
        $payRequestBuilder->setBody($body);
        $payRequestBuilder->setSubject($subject);
        $payRequestBuilder->setTotalAmount($total_amount);
        $payRequestBuilder->setOutTradeNo($out_trade_no);

        $aop = new \AlipayTradeService($config);

        /**
         * pagePay 電腦網站支付請求
         * @param $builder 業務參數,使用buildmodel中的對象生成。
         * @param $return_url 同步跳轉地址,公網可以訪問
         * @param $notify_url 異步通知地址,公網可以訪問
         * @return $response 支付寶返回的信息
         */
        $response = $aop->pagePay($payRequestBuilder,$config['return_url'],$config['notify_url']);
    
        //輸出表單
        var_dump($response);
    }
}

 

   9、如上,我們支付的類就創建好了,現在我們配置下config.ph文件。

 

 

   10、這里主要是配置,應用id,商戶私鑰,支付寶公鑰,支付寶網關(注意下是正式賬號,還是沙箱測試賬號)。

    補充說明,支付寶如何開通支付和如何申請沙箱賬號,這里不做說明,不會的話看下期講解,然后生成密鑰這里也不做介紹,下期。

 

 

   11、寫好支付類AliPayPc(),和配置好config.php后,我們在控制器controller中開始調用。

<?php
namespace app\admin\controller;

use lib\AliPayPc;//引入支付類

class User extends Base
{


    public function MtAliPay(Request $request)
    {
        $out_trade_no = "19982019121202021000";//訂單號
        $subject = "測試商品000";//商品名稱
        $total_amount = 0.1;//商品金額 元
        $body = "這是用於測試";//商品描述
        $config_data = [
            'return_url'=>$request->domain().'/index.php/admin/user/return_url',//同步跳轉 待寫
            'notify_url'=>$request->domain().'/index.php/admin/callback/notify_url',//異步跳轉 待寫
        ];
     //-------------
      書寫業務代碼,比如生成訂單記錄
     //-------------
//因為聲明為靜態類,所以直接調用 AliPayPc::setAilPay($out_trade_no,$subject,$total_amount,$body,$config_data = []); } }

 

   12、點擊 你的域名/index.php/admin/user/userAliPay發現,如果沒有問題,就可以直接掉轉到支付寶付款頁面,如果是可以直接掃碼支付,也可以登錄你的賬戶進行支付,如果支付成功,頁面就會跳轉到,你寫的同步地址index.php/admin/login/return_url處。

 

 

   13、當然上面的支付成功后,還有一個最重要的異步回調,如下是支付寶官方說明:https://opendocs.alipay.com/open/270/105902

:程序執行完后必須打印輸出“success”(不包含引號)。如果商戶反饋給支付寶的字符不是 success 這7個字符,支付寶服務器會不斷重發通知,直到超過24小時22分鍾。
一般情況下,25小時以內完成8次通知(通知的間隔頻率一般是:4m,10m,10m,1h,2h,6h,15h);

:程序執行完成后,該頁面不能執行頁面跳轉。
如果執行頁面跳轉,支付寶會收不到 success 字符,會被支付寶服務器判定為該頁面程序運行出現異常,而重發處理結果通知;

 

  14、回調的意思就是,通過你設置的 notify_url回調地址,支付寶在支付成功后,會帶參(比如業務參數類:交易號,交易金額,公共參數:授權appid,簽名)來請求你這個地址,告訴你,這一單,我們支付寶收到款了,怎么,怎么的,然后這里肯定有可能會有第三方的惡意請求(偽造請求)。所以你對這些進行驗證,然后識別出是支付寶的回調,然后進行業務處理。比如修改訂單支付狀態。

  15、最后,我們書寫回調,當然還是先寫一個回調的類,在之前的AliPayPc()類里面新增setNotify_url()//這個主要是進行驗簽

<?php

/**
 * Created by PhpStorm.
 * User: WuYan
 * Date: 2020/4/20
 * Time: 10:59
 * 支付寶
 */

namespace lib;

class AliPay
{
    /**
     * 支付寶收款
     *
     * @param [type] $out_trade_no 商戶訂單號
     * @param [type] $subject 訂單名稱
     * @param [type] $total_amount 付款金額
     * @param [type] $body 商品描述,可空
     * @param [type] $config_data 支付參數,數組類型;為空則取默認參數
     *
     * @return void
     */
    public static function setAilPay($out_trade_no,$subject,$total_amount,$body,$config_data = [])
    {
        require_once env('extend_path') . '/alipayPc/config.php';
        require_once env('extend_path'). '/alipayPc/pagepay/service/AlipayTradeService.php';
        require_once env('extend_path') .'/alipayPc/pagepay/buildermodel/AlipayTradePagePayContentBuilder.php';
        $config = array_merge($config, $config_data);
        //構造參數
        $payRequestBuilder = new \AlipayTradePagePayContentBuilder();
        if(!empty($body)){
            $payRequestBuilder->setBody($body);
        }
        $payRequestBuilder->setSubject($subject);
        $payRequestBuilder->setTotalAmount($total_amount);
        $payRequestBuilder->setOutTradeNo($out_trade_no);
        $aop = new \AlipayTradeService($config);
        /**
         * pagePay 電腦網站支付請求
         * @param $builder 業務參數,使用buildmodel中的對象生成。
         * @param $return_url 同步跳轉地址,公網可以訪問
         * @param $notify_url 異步通知地址,公網可以訪問
         * @return $response 支付寶返回的信息
         */
        $response = $aop->pagePay($payRequestBuilder,$config['return_url'],$config['notify_url']);
        //輸出表單
        // var_dump($response);
    }

    /**
     * 支付寶服務器異步通知頁面
     *
     * @param [type] $arr 支付成功返回信息post
     *
     * @return void
     */
    public static function setNotify_url($arr)
    {
        require_once env('extend_path') . '/alipayPc/config.php';
        require_once env('extend_path'). '/alipayPc/pagepay/service/AlipayTradeService.php';

        $alipaySevice = new \AlipayTradeService($config);
        $alipaySevice->writeLog(var_export($arr,true));
        $result = $alipaySevice->check($arr);//進行驗簽
        if($result) {//驗證成功
            //交易狀態
            if($arr['trade_status'] == 'TRADE_FINISHED' || $arr['trade_status'] == 'TRADE_SUCCESS') {
                return true;
            }else {
                return false;
            }
        }else {
            return false;
        }
    }
}

  16、然后在控制器里面新增回調方法

<?php
/**
 * 第三方請求,不需要驗證
 */
namespace app\api\controller;

use think\Controller;
use lib\AliPayPc;

class callback extends Controller
{
    /**
     * 支付寶商戶收款異步回調
     */
    public function notify_url()
    {
        $arr = $_POST;
        $result = AliPayPc::setNotify_url($arr);//進行驗簽
        //驗簽成功后
        //判斷訂單號是否存在數據庫
        //進行業務處理----------------------
    }
}

 

五、結束語

  1、支付寶電腦網頁支付,整體來說,由於支付寶官方文檔和本身集成,還是相對容易的,主要是在實際中,對於支付日志,回調日志,防止重復提交,防止偽造請求,和重復回調這些代碼業務端的進行合理書寫。

  2、如果大家還是有疑問,可以留言,或是頁面左上角二維碼咨詢。

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM