在網路業務中,支付、儲值、退款、提現等涉及到資金交易的場景必不可少。這就要求系統能夠進行非同步通知,告知交易雙方交易結果。在這些場景中,PHP 作為一種非常流行的後端開發語言,有著廣泛的應用,在本文中我們將講解如何使用 PHP 實現非同步通知。
一、什麼是非同步通知?
在用戶進行交易後,付款或收款方會收到一筆交易成功的通知,以便雙方及時了解交易結果。在這個場景下,如果採用同步通知,可能會導致交易時間變長,使用者體驗差,容易造成交易失敗,影響交易的可靠性。因此,我們使用非同步通知的方式,也就是利用回呼函數方式來通知交易結果。
二、PHP 實作非同步通知的步驟
我們以支付場景為例,介紹如何使用 PHP 實作非同步通知。
當使用者在應用程式中發起付款請求時,後端會向支付平台發送支付請求,並接收到支付平台的回應,並從回應中取得支付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'] : '';
透過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); }
在介面中設定回傳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 參數用於傳遞接收支付結果的位址,由支付平台發送非同步通知的位址。
當支付平台收到使用者的付款請求並完成了交易後,會發送非同步通知到指定的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'; }
#由於支付平台發送的結果需要保證其可靠性,我們需要對支付平台傳回的數據進行驗簽。在驗簽過程中,我們需要使用支付平台提供的公鑰對簽名進行驗證,以確保其為支付平台發出的合法結果。
PHP 範例程式碼:
if (!openssl_verify(json_encode($data), base64_decode($data['signature']), $public_key)) { return 'false'; }
支付成功後,需要更新訂單的狀態信息,以便應用了解訂單的實際情況。在此步驟中,我們可以呼叫業務邏輯進行更新。
PHP 範例程式碼:
function update_order($order_id) { // 调用业务逻辑处理订单状态更新 }
在處理完成後,需向支付平台傳回確認訊息,以表示我們盡已確認處理過付款結果,以及回傳碼(如200)表示處理成功。
PHP 範例程式碼:
return 'success';
三、避免非同步通知的漏洞
在使用非同步通知的過程中,為了確保安全性,我們需要避免以下漏洞:
四、總結
本文介紹了使用 PHP 實現非同步通知的流程,並提出了安全防範措施,希望對大家有幫助。非同步通知在資金交易場景下特別重要,尤其需要注意安全性,其中簽名、重複處理、安全隱患等問題都需要在設計時考慮周全,避免出現漏洞和錯誤。
以上是php實作異步通知的詳細內容。更多資訊請關注PHP中文網其他相關文章!