支付寶即時到賬接入的最小可行代碼集:前端表單、配置文件、同步跳轉頁、異步通知驗證頁。基於官方 PHP SDK,精簡去冗餘,適合快速集成到現有項目。
$alipay_config = [
'partner' => '2088xxxxxxxxxxxx', // PID
'seller_id' => '2088xxxxxxxxxxxx', // 收款賬號
'key' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', // MD5密鑰
'sign_type' => 'MD5',
'input_charset' => 'utf-8',
'cacert' => getcwd() . '/cacert.pem',
'transport' => 'https', // 強制HTTPS
'notify_url' => 'https://your.com/pay/notify_url.php', // 異步通知(關鍵)
'return_url' => 'https://your.com/pay/return_url.php', // 同步跳轉
'service' => 'create_direct_pay_by_user',
'payment_type' => '1',
];
require_once "alipay.config.php";
require_once "lib/alipay_notify.class.php";
$alipayNotify = new AlipayNotify($alipay_config);
$verifyResult = $alipayNotify->verifyNotify(); // 簽名驗證 + 遠程驗證 notify_id
if ($verifyResult) {
$outTradeNo = $_POST['out_trade_no'];
$tradeNo = $_POST['trade_no'];
$tradeStatus = $_POST['trade_status'];
$totalFee = $_POST['total_fee'];
// 解析擴展參數
$extra = $_POST['extra_common_param'] ?? '';
[$uid, $code, $tags] = explode('.', $extra);
if (in_array($tradeStatus, ['TRADE_FINISHED', 'TRADE_SUCCESS'])) {
// 幂等性檢查
$order = Order::where('order_sn', $outTradeNo)->first();
if ($order && $order->status === 'pending') {
DB::transaction(function() use ($order, $tradeNo, $totalFee, $uid, $code, $tags) {
$order->update([
'status' => 'paid',
'trade_no' => $tradeNo,
'paid_at' => now(),
'pay_amount' => $totalFee,
]);
// 觸發業務事件
event(new OrderPaid($order, $uid, $code, $tags));
});
}
}
echo 'success'; // 必須輸出 success 結束通知
} else {
Log::error('Alipay verify failed', $_POST);
echo 'fail';
}
require_once "alipay.config.php";
require_once "lib/alipay_notify.class.php";
$alipayNotify = new AlipayNotify($alipay_config);
$verifyResult = $alipayNotify->verifyReturn(); // 僅驗證簽名
if ($verifyResult && in_array($_GET['trade_status'], ['TRADE_SUCCESS', 'TRADE_FINISHED'])) {
$outTradeNo = $_GET['out_trade_no'];
$totalFee = $_GET['total_fee'];
$extra = $_GET['extra_common_param'] ?? '';
[$uid, $code, $tags] = explode('.', $extra);
// 跳轉到業務訂單詳情頁
header("Location: /user/order/$outTradeNo?pay_success=1&uid=$uid&code=$code&tags=$tags&amount=$totalFee");
exit;
} else {
header("Location: /pay/failed?msg=" . urlencode('支付驗證失敗'));
exit;
}
require_once "alipay.config.php";
require_once "lib/alipay_submit.class.php";
$parameter = [
'service' => $alipay_config['service'],
'partner' => $alipay_config['partner'],
'seller_id' => $alipay_config['seller_id'],
'payment_type' => $alipay_config['payment_type'],
'notify_url' => $alipay_config['notify_url'],
'return_url' => $alipay_config['return_url'],
'_input_charset' => $alipay_config['input_charset'],
'out_trade_no' => $_POST['WIDout_trade_no'],
'subject' => $_POST['WIDsubject'],
'total_fee' => $_POST['WIDtotal_fee'],
'body' => $_POST['WIDbody'],
'show_url' => 'https://your.com/order/' . $_POST['WIDout_trade_no'],
'extra_common_param' => $_POST['uid'] . '.' . $_POST['codes'] . '.' . $_POST['tags'],
];
$alipaySubmit = new AlipaySubmit($alipay_config);
$html = $alipaySubmit->buildRequestForm($parameter, 'post', '正在跳轉...');
echo $html; // 輸出自動提交表單 HTML
openssl genrsa -out app_private_key.pem 2048 → openssl rsa -in app_private_key.pem -pubout -out app_public_key.pem'sign_type' => 'RSA2', 'private_key_path' => '...', 'alipay_public_key_path' => '...'這套代碼結構清晰、職責單一,可直接複製到項目 /pay 目錄,修改配置即可運行。建議將驗證/業務處理封裝為 AlipayService,控制器僅做調度。