首頁  >  文章  >  後端開發  >  php實作異步通知

php實作異步通知

WBOY
WBOY原創
2023-05-07 14:42:08896瀏覽

在網路業務中,支付、儲值、退款、提現等涉及到資金交易的場景必不可少。這就要求系統能夠進行非同步通知,告知交易雙方交易結果。在這些場景中,PHP 作為一種非常流行的後端開發語言,有著廣泛的應用,在本文中我們將講解如何使用 PHP 實現非同步通知。

一、什麼是非同步通知?

在用戶進行交易後,付款或收款方會收到一筆交易成功的通知,以便雙方及時了解交易結果。在這個場景下,如果採用同步通知,可能會導致交易時間變長,使用者體驗差,容易造成交易失敗,影響交易的可靠性。因此,我們使用非同步通知的方式,也就是利用回呼函數方式來通知交易結果。

二、PHP 實作非同步通知的步驟

我們以支付場景為例,介紹如何使用 PHP 實作非同步通知。

  1. 發起付款請求:

當使用者在應用程式中發起付款請求時,後端會向支付平台發送支付請求,並接收到支付平台的回應,並從回應中取得支付URL。

PHP 範例程式碼:

$data = [
    'amount' => '10.00',
    'body' => '测试订单',
    'channel' => 'alipay_wap',
    'currency' => 'cny',
    'return_url' => 'http://example.com/return',
    'notify_url' => 'http://example.com/notify',
];

$result = curl_post('https://api.payment.com/payments', $data);
$payment_url = isset($result['payment_url']) ? $result['payment_url'] : '';
  1. 呼叫支付平台的介面:

透過cURL 發送POST 請求,呼叫支付平台的接口,向支付平台發送支付請求,並取得支付平台回傳的回應結果。

PHP 範例程式碼:

function curl_post($url, $data = [], $header = [])
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/json',
        'Accept: application/json',
    ) + $header);
    $response = curl_exec($ch);
    curl_close($ch);
    return json_decode($response, true);
}
  1. 在介面中設定回傳URL:

在介面中設定回傳URL,用於在付款成功或失敗的時候,將後台的付款結果通知給應用,同時也可用於查詢交易狀態。

PHP 範例程式碼:

$data = [
    'amount' => '10.00',
    'body' => '测试订单',
    'channel' => 'alipay_wap',
    'currency' => 'cny',
    'return_url' => 'http://example.com/return',
    'notify_url' => 'http://example.com/notify',
];

notify_url 參數用於傳遞接收支付結果的位址,由支付平台發送非同步通知的位址。

  1. 接收非同步通知的回呼函數

當支付平台收到使用者的付款請求並完成了交易後,會發送非同步通知到指定的notify_url,通知支付結果。因此,我們需要在回調函數中進行驗簽和處理業務邏輯,並在最後返回確認訊息。

PHP 範例程式碼:

function notify()
{
    $data = $_POST;
    $time_now = time();

    // 验证签名
    if (!openssl_verify(json_encode($data), base64_decode($data['signature']), $public_key)) {
        return 'false';
    }
    // 更新订单状态
    update_order($data['order_id']);
    return 'success';
}
  1. 驗證簽章

#由於支付平台發送的結果需要保證其可靠性,我們需要對支付平台傳回的數據進行驗簽。在驗簽過程中,我們需要使用支付平台提供的公鑰對簽名進行驗證,以確保其為支付平台發出的合法結果。

PHP 範例程式碼:

if (!openssl_verify(json_encode($data), base64_decode($data['signature']), $public_key)) {
    return 'false';
}
  1. 更新訂單狀態

支付成功後,需要更新訂單的狀態信息,以便應用了解訂單的實際情況。在此步驟中,我們可以呼叫業務邏輯進行更新。

PHP 範例程式碼:

function update_order($order_id)
{
    // 调用业务逻辑处理订单状态更新
}
  1. 返回確認訊息

在處理完成後,需向支付平台傳回確認訊息,以表示我們盡已確認處理過付款結果,以及回傳碼(如200)表示處理成功。

PHP 範例程式碼:

return 'success';

三、避免非同步通知的漏洞

在使用非同步通知的過程中,為了確保安全性,我們需要避免以下漏洞:

  1. 只處理一次非同步通知,否則會造成多次要求,並帶來不必要的安全隱患。
  2. 確保在處理非同步通知時對結果進行簽章驗證,避免被第三方竄改要求。
  3. 確保非同步通知結果處理的功能邏輯不會失敗並導致資料不一致。
  4. 確保非同步通知 URL 在提供給第三方時不被竄改,以免被攻擊者惡意篡改位址並進行 CSRF 攻擊。

四、總結

本文介紹了使用 PHP 實現非同步通知的流程,並提出了安全防範措施,希望對大家有幫助。非同步通知在資金交易場景下特別重要,尤其需要注意安全性,其中簽名、重複處理、安全隱患等問題都需要在設計時考慮周全,避免出現漏洞和錯誤。

以上是php實作異步通知的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn