PHP接入支付寶 即時到賬接口

payment 項目2.0版本 php

特別聲明:html

如下文檔均針對 payment 2.0 以上版本,而且PHP須要5.5以上(含)。
代碼中全部編碼均使用 utf-8 。git

經過幾天的時間,終於把payment 2.0的基本結構搭好了。今天剛完成支付寶 即時到賬 接口的開發。趕忙把使用文檔給補上。請你們必定仔細查看文檔,實在還不行就來問我吧!(我期待你問我,反正我收錢的,哈哈)github

即時到賬 接口簽約

在你使用這個接口時,請先確認你是否在支付寶商戶中心簽約了該接口。數據庫

image

在商戶中心,看到 即時到賬(已添加),說明你已簽約該接口,可正常使用。若是還不知道如何簽約,請 查看支付寶即時到賬簽約教程數組

OK!完成簽約後,服務器

須要把 payment項目導入本身的項目中 安裝方法,請參考Payment項目簡介微信

調用示例

在項目的 examples 文件夾中,我已提供完整的示例。爲了便於你們理解,這裏對代碼再進行說明。異步

支付寶的配置文件

在1.x版本中,配置文件被固定寫在了sdk中,這種作法太流氓了。爲了避免繼續流氓下去,在2.x版本中,將配置信息獨立出來,讓你們能夠根據本身的實際狀況自定義,靈活程度大大增長。函數

調用時,僅須要提供給我以下的一個數組,至於配置信息寫在哪裏,徹底由你本身決定。

我在示例中,是將配置信息寫在 examples/aliconfig.php 中,而後使用 require_once 包含進來。你徹底能夠寫cache中、db中。

return [
    'partner'   => '2088xxxxxxxxxxx',
    'md5_key'   => 'xxxxxxxxxxxxxxxxxx',
    'rsa_private_key'   => './rsa_private_key.pem',
    "notify_url"    => 'http://test.helei.com/pay-notify.html',
    "return_url"    => 'http://test.helei.com/return-url.html',
    "time_expire"    => '14',
];

參數介紹

參數 參數名 參數說明 是否必須
partner 合做者身份ID 簽約的支付寶帳號對應的支付寶惟一用戶號。以2088開頭的16位純數字組成。 必須
md5_key MD5密鑰 點擊這裏 必須
rsa_private_key RSA私鑰 點擊這裏 必須
notify_url 服務器異步通知URI 支付寶服務器主動通知商戶網站裏指定的頁面http路徑。(建議使用https) 可選
return_url 頁面跳轉同步通知頁面路徑 支付寶處理完請求後,當前頁面自動跳轉到商戶網站裏指定頁面的http路徑。 可選
time_expire 超時時間 設置未付款交易的超時時間,一旦超時,該筆交易就會自動被關閉。單位默認爲分鐘 可選

特別說明:

  • 若是上述配置文件必須的key的值爲空,會拋出 PayException 異常

  • 若是 notify_url 爲空,雖然可支付成功,可是客戶端將沒法收到支付寶的回調結果。

  • 建議採用https協議

調用支付

項目中的示例代碼,參見 examples/charge.php

//  生成訂單號 便於測試
function createPayid()
{
    return date('Ymdhis', time())
            .substr(floor(microtime()*1000),0,1)
            .rand(0,9);
}

// 訂單信息
$orderData = [
    "orderTradeNo"    => createPayid(),
    "totalFee"    => '1',
    "clientIp"    => '127.0.0.1',
    "subject"    => '我是即時到賬',
    "body"    => '支付測試即時到賬接口',
    "extraCommonParam"    => '',
];

$aliconfig = require_once __DIR__ . '/aliconfig.php';


// 實例化支付環境類,進行支付建立
$charge = new ChargeContext();

try {
    $charge->initCharge(Config::ALI_CHANNEL_WEB, $aliconfig);
    $url = $charge->charge($payData);
} catch (PayException $e) {
    echo $e->errorMessage();exit;
}

// 請求alipay
header("Location:{$url}");

以上代碼就完成了即時到賬的所有調用,下面分步驟來講明下代碼含義:

訂單信息

此部分的key部分,必須採用如下值,不然SDK沒法識別。

// createPayid(); 函數是爲了演示方便,隨手寫的一個生成訂單號的函數

$orderData = [
    "order_no"    => createPayid(),
    "amount"    => '1',// 單位爲元
    "client_ip"    => '127.0.0.1',
    "subject"    => '測試支付',
    "body"    => '支付接口測試',
    "extra_param"    => '',
];

參數說明

參數 參數名 參數說明 是否必須
order_no 訂單號 平臺根據規則生成的訂單號,最長64位,要在商戶數據庫中惟一 必須
amount 交易總金額 該筆訂單的資金總額,單位爲RMB-Yuan。取值範圍爲[0.01,100000000.00],精確到小數點後兩位。 必須
client_ip 客戶端IP 用戶在建立交易時,該用戶當前所使用機器的IP。 必須
subject 商品名稱 商品的標題/交易標題/訂單標題/訂單關鍵字等。該參數最長爲128個漢字。 必須
body 商品描述 對一筆交易的具體描述信息。若是是多種商品,請將商品描述字符串累加傳給body。 必須
extra_param 公用回傳參數 若是用戶請求時傳遞了該參數,則返回給商戶時會回傳該參數。 可選

簽名數據

如下是真正實現數據簽名的地方,返回的數據可直接用於發起支付寶支付。你們能夠對比下支付寶自身信息,是否是已經大大簡化了?
固然簡化帶來的另一個意思就是:放棄了不少咱們正常狀況下用不到的功能,好比:花唄分期

// 實例化支付環境類,進行支付建立
$charge = new ChargeContext();

try {
    $charge->initCharge(Config::ALI_CHANNEL_WEB, $aliconfig);
    $url = $charge->charge($payData);
} catch (PayException $e) {
    echo $e->errorMessage();exit;
}

這裏對於調用者,僅僅須要知道 ChargeContext 這一個類,這裏使用了 策略模式 + 簡單工廠模式 兩種方法來進行調用的簡化。這種方式也很是方便後期進行擴展,對於客戶端與複雜的邏輯進行了隔離。

跳轉支付寶

經過上一步返回的是請求支付寶的url。因爲在頁面上可能須要經過js調用支付寶或者還有其餘邏輯,由於我並無直接重定向到支付寶,而把控制權交到了客戶端手中。

如下代碼,示例的是簡單的利用返回的url,重定向到支付寶,完成支付。

header("Location:{$url}");

本次支付寶的即時到賬接口到這裏就完成了調用。下一節把回調通知部分完成,這樣一個基本的支付流程就完成了。

技術支持

若是須要協助集成到項目,可付費得到個人服務!

  • 微信:helei543345

  • 郵箱: dayugog@gmail.com

  • 支持我:

image

相關文章
相關標籤/搜索