文件
freeshop/pay_notify.php
T
2026-08-16 16:52:43 +08:00

55 行
1.9 KiB
PHP

<?php
require __DIR__ . '/includes/init.php';
ob_clean();
$gateway = trim($_GET['gateway'] ?? $_POST['gateway'] ?? '');
if (empty($gateway)) {
http_response_code(400);
exit('missing gateway param');
}
Payment::initGateways();
$gw = Payment::get($gateway);
if (!$gw) {
http_response_code(404);
exit('unknown gateway');
}
Logger::info('收到支付通知', ['gateway' => $gateway, 'raw_input' => file_get_contents('php:
$params = array_merge($_GET, $_POST);
unset($params['gateway']);
if (!$gw->verifyNotify($params)) {
Logger::warn('支付通知验签失败', ['gateway' => $gateway]);
http_response_code(403);
exit('signature mismatch');
}
$tradeNo = $gw->getTradeNo($params);
$isPaid = $gw->isPaid($params);
$outTradeNo = $params['out_trade_no'] ?? '';
$stmt = db()->prepare('SELECT id,order_id,status FROM ' . tn('pay_logs') . ' WHERE order_id=? AND pay_method=? ORDER BY id DESC LIMIT 1');
$stmt->execute([$outTradeNo, $gateway]);
$payLog = $stmt->fetch();
if (!$payLog) {
Logger::error('支付通知:未找到支付记录', ['out_trade_no' => $outTradeNo]);
$gw->respondSuccess();
exit;
}
if ($payLog['status'] === 'paid') {
$gw->respondSuccess();
exit;
}
if ($isPaid) {
db()->beginTransaction();
try {
Payment::updatePayStatus($payLog['id'], 'paid', $tradeNo);
db()->prepare('UPDATE ' . tn('orders') . ' SET status=\'paid\', paid_at=NOW() WHERE id=?')
->execute([$payLog['order_id']]);
db()->commit();
Logger::info('支付成功', ['order_id' => $payLog['order_id'], 'trade_no' => $tradeNo, 'gateway' => $gateway]);
} catch (Exception $e) {
db()->rollBack();
Logger::error('支付成功后更新订单失败', ['error' => $e->getMessage()]);
}
} else {
Logger::warn('支付未成功', ['trade_status' => $params['trade_status'] ?? '']);
}
$gw->respondSuccess();
exit;