支付寶即時到帳DEMO配置與使用

支付寶網頁即時到帳功能,可以讓用戶在線向開發者的支付寶帳號支付資金,交易資金即時到帳,幫助開發者快速回籠資金。

當用戶進行支付操做時候能夠直接跳轉到支付寶支付頁面進行支付 php

準備

 關於支付寶簽約即時到帳和PID獲取、密鑰生成這裏不作敘述,官方文檔步驟也很清楚:傳送門前端

 支付寶即時到帳DEMO下載:下載json

DEMO目錄結構

 

 簡單使用須要的文件說明後端

 ./alipay.config.php --- 配置文件api

 ./alipayapi.php ------- 接口文件安全

 ./notify_url.php ------ 服務器異步通知文件服務器

 ./return_url.php ----- 服務器同步跳轉文件curl

 ./log.txt -------------- 日誌異步

配置alipay.config.php

在配置文件中有詳細的說明,主要配置有函數

$alipay_config['partner']        = '208862160xxxxxxx'; // 合做者身份ID
$alipay_config['private_key'] = "xxxxxxxxxxxxx」; // 商戶的私鑰,此處填寫原始私鑰去頭去尾
$alipay_config['notify_url'] = "http://xxxx/alipay/notify_url.php"; // 服務器異步通知頁面路徑  需http://格式的完整路徑,不能加?id=123這類自定義參數,必須外網能夠正常訪問
$alipay_config['return_url'] = "http://xxxx/alipay/return_url.php"; // 頁面跳轉同步通知頁面路徑 需http://格式的完整路徑,不能加?id=123這類自定義參數,必須外網能夠正常訪問

其餘配置按實際狀況配置

前端支付請求

請求通常都是form表單post請求alipayapi.php,涉及到金錢操做的咱們都要當心嚴謹,這種請求代碼須要封裝到後端,不能前端展現出來

例如,咱們能夠後端封裝個方法來進行處理,請求這個方法將代碼echo到頁面直接進行二次跳轉

    /**
     * 支付寶支付
     * @param string $id ID
     */
    public function getAlipayParam($id)
    {  
$form = <<<FORM
                <form style='display: none;' action='提交URL' name='payForm' method='post'>
                    <input  name='WIDout_trade_no' value='訂單編號'>
                    <input  name='WIDsubject' value='訂單名稱'>
                    <input  name='WIDtotal_fee' value='金額'>
                    <input  name='WIDbody' value='商品描述'>
                    <input  name='extra_common_param' value='公共回參'>
                </form>
                <script>
                    function submitForm() {
                      document.payForm.submit();
                    }
                    submitForm();
                </script>
FORM;
                echo $form;
    }

在DEMO中(alipay.php)接受的請求參數並很少,實際上請求參數是很全面的:請求參數列表

咱們能夠根據實際需求進行擴展,實際開發中爲了安全,請求的name能夠適當的進行改變

/**************************請求參數**************************/
        //商戶訂單號,商戶網站訂單系統中惟一訂單號,必填
        $out_trade_no = $_POST['WIDout_trade_no'];

        //訂單名稱,必填
        $subject = $_POST['WIDsubject'];

        //付款金額,必填
        $total_fee = $_POST['WIDtotal_fee'];

        //商品描述,可空
        $body = $_POST['WIDbody'];

        //公共回傳參數
        $extra_common_param = $_POST['extra_common_param'];

支付

跳轉到支付頁面進行支付

支付結果異步處理

關於異步通知的參數:服務器異步通知參數列表

前面提到異步通知請求到notify_url.php(根據我的配置)

異步通知主要負責處理支付結果的業務邏輯,這個須要本身根據項目需求更改編寫

例如

<?php
/* *
 * 功能:支付寶服務器異步通知頁面
 * 版本:3.5
 * 日期:2016-06-25
 * 說明:
 * 如下代碼只是爲了方便商戶測試而提供的樣例代碼,商戶能夠根據本身網站的須要,按照技術文檔編寫,並不是必定要使用該代碼。
 * 該代碼僅供學習和研究支付寶接口使用,只是提供一個參考。


 *************************頁面功能說明*************************
 * 建立該頁面文件時,請留心該頁面文件中無任何HTML代碼及空格。
 * 該頁面不能在本機電腦測試,請到服務器上作測試。請確保外部能夠訪問該頁面。
 * 該頁面調試工具請使用寫文本函數logResult,該函數已被默認關閉,見alipay_notify_class.php中的函數verifyNotify
 * 若是沒有收到該頁面返回的 success 信息,支付寶會在24小時內按必定的時間策略重發通知
 */

require_once("alipay.config.php");
require_once("admin.config.php");
require_once("lib/alipay_notify.class.php");
require_once("log.php");

//計算得出通知驗證結果
$alipayNotify = new AlipayNotify($alipay_config);
$verify_result = $alipayNotify->verifyNotify();

//初始化日誌
$logHandler = new CLogFileHandler('logs/'.date('y-m-d').'.log');
$log = Log::Init($logHandler, 15);

if($verify_result) {//驗證成功
    Log::DEBUG(json_encode($_POST));
    // 操做類型
    $extra_common_param = $_POST['extra_common_param'];
    // 訂單編號
    $code = $_POST['out_trade_no'];
    // 支付寶交易號
    $trade_no = $_POST['trade_no'];
    // 交易狀態
    $trade_status = $_POST['trade_status'];

    /**
     * 判斷交易狀態
     * ------------------------------------------------------------------------
     * 判斷該筆訂單是否在商戶網站中已經作過處理
     * 若是沒有作過處理,根據訂單號(out_trade_no)在商戶網站的訂單系統中查到該筆訂單的詳細,並執行商戶的業務程序
     * 請務必判斷請求時的total_fee、seller_id與通知時獲取的total_fee、seller_id爲一致的
     * 若是有作過處理,不執行商戶的業務程序
     * ------------------------------------------------------------------------
     * 調試用,寫文本函數記錄程序運行狀況是否正常
     * logResult("這裏寫入想要調試的代碼變量值,或其餘運行的結果記錄");
     */
    if ($trade_status == 'TRADE_FINISHED') {

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


    } elseif ($trade_status == 'TRADE_SUCCESS') {
                
        //注意:付款完成後,支付寶系統發送該交易狀態通知

        switch ($extra_common_param) {
            case AdminConfig::OPER_PLACE_ORDER:
                // 判斷該訂單是否處理過
                $url = AdminConfig::BACKOFFICE_URL . 'xxx/xxx/xxx/' . $code . '/outtradeNo/' . $trade_no;
                $is_order = request($url);
                if ($is_order == 'success') { // 訂單未處理
                    // 修改訂單的相關狀態爲已支付
                    $url = AdminConfig::BACKOFFICE_URL . 'xxx/xxx/xxx/' . $code . '/outtradeNo/' . $trade_no;
                    request($url);
                }
                break;
            case AdminConfig::OPER_RECHARGE:
                //修改充值訂單支付狀態爲已支付
                $id = $_POST['out_trade_no'];
                $outtrade_no = $_POST['trade_no'];
                $money = $_POST['total_fee'];
                $url = AdminConfig::ORDER_URL . 'xxx/xxx/id/'.$id.'/money/'.$money.'/outtradeno/'.$outtrade_no;
                request($url);
                break;
        }
    }
        
    echo "success";        //請不要修改或刪除
}
else {
    //驗證失敗
    echo "fail";
}

/**
 * 發送請求
 * @param  string  $url  請求地址
 * @param  array   $data 請求數據
 * @param  string  $type 請求類型
 * @param  boolean $ssl  是不是HTTPS請求
 * @return string  響應主體Content
 */
function request($url, $data=array(), $type='get', $ssl=false)
{
    // curl請求
    $curl = curl_init();
    // 設置curl選項
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_AUTOREFERER, true); // referer 請求來源
    curl_setopt($curl, CURLOPT_TIMEOUT, 10); // 設置超時時間
    // SSL相關
    if ($ssl) {
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 是否在服務端進行驗證
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, '2'); // 檢查服務器SSL證書中是否存在一個公用名
    }
    // POST請求
    if ($type == 'post') {
        curl_setopt($curl, CURLOPT_POST, true); // 是否爲post請求
        curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // 處理請求數據
    }
    // 處理響應結果
    curl_setopt($curl, CURLOPT_HEADER, false); // 是否處理響應頭
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // 是否返回響應結果
    // 發送請求
    $response = curl_exec($curl);
    if (false === $response) {
        return false;
    }
    return $response;
}

?>

支付結果同步處理

關於同步通知的參數:服務器同步通知參數列表

前面提到同步通知請求到return_url.php(根據我的配置)

同步通知主要負責處理支付結果的結果展現,這個須要本身根據項目需求更改編寫

例如

    /**
     * 判斷該筆訂單是否在商戶網站中已經作過處理
     * 若是沒有作過處理,根據訂單號(out_trade_no)在商戶網站的訂單系統中查到該筆訂單的詳細,並執行商戶的業務程序
     * 若是有作過處理,不執行商戶的業務程序
     */
    if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') {
        // 交易成功或交易成功且訂單結束
        switch ($extra_common_param) {
            case AdminConfig::OPER_PLACE_ORDER: // 訂單支付
                $url = AdminConfig::ORDER_URL . 'xxx/orderPaySuccessShow';
                header("Location:$url");
                break;
            case AdminConfig::OPER_RECHARGE:
                $url = AdminConfig::ORDER_URL . 'xxx/rechargeSuccessShow';
                header("Location:$url");
                break;
            default:
                echo 'Undefined operation type!!';
                break;
        }
    }
    else {
        // 交易狀態未成功
        switch ($extra_common_param) {
            case AdminConfig::OPER_PLACE_ORDER: // 訂單支付
                $url = AdminConfig::ORDER_URL . 'xxx/orderPayFailShow';
                header("Location:$url");
                break;
            case AdminConfig::OPER_RECHARGE:
                $url = AdminConfig::ORDER_URL . 'xxx/rechargeFailShow';
                break;
            default:
                echo 'Undefined operation type!!';
                break;
        }
    }

關於交易狀態

 其餘一些細節性問題請你們參閱官方文檔,文檔永遠是最好的教程!

相關文章
相關標籤/搜索