PHP對接支付寶支付的時候,異步回調和同步回調是非常重要的功能,用于確認支付結果和更新訂單狀態。本文將詳細介紹異步回調和同步回調的作用,并提供具體的案例代碼。
一、異步回調的作用
異步回調(也稱為服務器通知)是支付寶支付過程中最重要的一步,主要用于確認支付結果。當用戶支付成功后,支付寶服務器會向商戶服務器發送一個HTTP POST請求,通知支付結果。商戶服務器接收到該回調消息后,需要驗證消息的合法性,確認支付結果,并更新訂單狀態。
具體步驟如下:
- 商戶服務器接收到支付寶服務器發送的異步回調請求,并獲取請求參數。
- 驗證參數的合法性。通過驗簽方式,校驗請求參數是否被篡改。商戶需要將請求參數按照一定的規則進行加密,并將加密結果與支付寶提供的公鑰進行比對,以確定參數的真實性和完整性。
- 驗證通過后,商戶服務器處理回調請求,包括更新訂單狀態、發送郵件通知等。
- 商戶服務器將處理結果返回給支付寶服務器。需要返回一個字符串 "success",表示接收成功。如果不返回或者返回其他字符串,支付寶服務器會間隔一段時間內重復發送回調請求。
- 通過異步回調,商戶服務器可以確保支付結果的真實性,及時更新訂單狀態,避免訂單的丟失或錯誤。異步回調是支付過程中必不可少的一環,它的主要作用是與支付寶服務器進行雙向通信,確認支付結果,并進行后續處理。
具體案例代碼如下:
<?php
// 驗證參數的合法性
function verifySign($params, $publicKey) {
$sign = $params['sign']; // 簽名參數
unset($params['sign']); // 剔除簽名參數
ksort($params); // 按照參數名進行升序排序
$data = '';
foreach ($params as $key => $value) {
$data .= $key . '=' . $value . '&';
}
$data = rtrim($data, '&');
// 使用openssl_verify函數驗簽
$result = openssl_verify($data, base64_decode($sign), $publicKey, OPENSSL_ALGO_SHA256);
return $result == 1;
}
// 更新訂單狀態
function updateOrderStatus($orderNo, $status) {
// 更新訂單狀態的邏輯代碼
}
// 處理支付寶異步回調請求
function handleAlipayNotify() {
$params = $_POST; // 獲取回調參數
$publicKey = '支付寶提供的公鑰';
// 驗證參數的合法性
if (verifySign($params, $publicKey)) {
// 驗簽通過
$orderNo = $params['out_trade_no']; // 商戶訂單號
$tradeStatus = $params['trade_status']; // 支付狀態
if ($tradeStatus == 'TRADE_SUCCESS') {
// 支付成功,更新訂單狀態為已支付
updateOrderStatus($orderNo, 'paid');
}
echo 'success'; // 返回接收成功的標識
} else {
// 驗簽失敗,可能存在安全風險
echo 'fail'; // 返回接收失敗的標識
}
}
// 入口函數
handleAlipayNotify();
?>
二、同步回調的作用
同步回調(也稱為前臺通知)的主要作用是給用戶展示支付結果頁面。當用戶支付成功后,支付寶會跳轉回商戶指定的同步回調地址,攜帶支付結果參數。商戶服務器接收到該回調后,需要驗證參數的合法性,并根據支付結果展示對應的頁面。
具體步驟如下:
- 商戶服務器接收到支付寶跳轉的同步回調請求,并獲取請求參數。
- 驗證參數的合法性。通過驗簽方式,校驗請求參數是否被篡改,確保參數的真實性和完整性。
- 需要判斷支付結果的具體狀態,根據支付狀態展示對應的頁面,如支付成功頁面、支付失敗頁面等。
- 同步回調通常用于展示支付結果給用戶查看,不作為最終支付結果的判斷依據。因為同步回調是在前端完成的,可能會被偽造或篡改。驗證參數的合法性只是為了避免被惡意攻擊,不能作為支付結果的唯一判斷依據。
具體案例代碼如下:
<?php
// 驗證參數的合法性
function verifySign($params, $publicKey) {
$sign = $params['sign']; // 簽名參數
unset($params['sign']); // 剔除簽名參數
ksort($params); // 按照參數名進行升序排序
$data = '';
foreach ($params as $key => $value) {
$data .= $key . '=' . $value . '&';
}
$data = rtrim($data, '&');
// 使用openssl_verify函數驗簽
$result = openssl_verify($data, base64_decode($sign), $publicKey, OPENSSL_ALGO_SHA256);
return $result == 1;
}
// 處理支付寶同步回調請求
function handleAlipayReturn() {
$params = $_GET; // 獲取回調參數
$publicKey = '支付寶提供的公鑰';
// 驗證參數的合法性
if (verifySign($params, $publicKey)) {
// 驗簽通過
$tradeStatus = $params['trade_status']; // 支付狀態
if ($tradeStatus == 'TRADE_SUCCESS') {
// 支付成功,展示支付成功頁面
echo '支付成功!';
} else {
// 支付失敗,展示支付失敗頁面
echo '支付失敗!';
}
} else {
// 驗簽失敗,可能存在安全風險
echo '驗簽失?。?;
}
}
// 入口函數
handleAlipayReturn();
?>
總結
以上是PHP對接支付寶支付時異步回調和同步回調的具體作用以及案例代碼。異步回調用于確認支付結果和更新訂單狀態,同步回調用于展示支付結果給用戶查看。通過驗證參數的合法性,可以確保支付結果的真實性和完整性,避免安全風險。在實際開發中,需要根據具體業務需求,結合支付寶提供的接口文檔,進行相應的編碼和調試。