NAB Transact hosted payment page 未触发 reply_link_url
支付老李
结论
reply_link_url 不是让客户浏览器自动返回商户网站的地址,而是 NAB Transact 处理完交易后调用的服务器回调地址。即使回调已经成功触发,客户仍可能停留在 NAB Transact 的 receipt page。浏览器返回商户网站应由 return_link_url 或 receipt page 上的 Return 链接处理。
这两个字段应配置不同的 URL:
reply_link_url:接收交易结果、更新订单并触发后台任务。return_link_url:将客户带到支付结果页。
所以,receipt page 没有自动跳回网站,并不代表 reply_link_url 没有触发。
推荐配置
<input
type="hidden"
name="reply_link_url"
value="https://example.com/nabtrans/callback"
>
<input
type="hidden"
name="return_link_url"
value="https://example.com/checkout/success"
>
不要让两个字段指向同一个处理函数。服务器回调与浏览器返回是两条独立的流程:
NAB Transact
├── reply_link_url → 后台通知 → 验证交易并更新订单
└── return_link_url → 浏览器返回 → 展示支付结果
回调处理方式
以下是控制器伪代码。callback 只处理 NAB Transact 发来的通知:
public function callback()
{
$payload = $_POST;
if (!$this->verifyNabTransactReply($payload)) {
http_response_code(400);
return;
}
$transactionId = $payload['transaction_id'] ?? null;
$approved = $this->isApprovedTransaction($payload);
if ($approved) {
// 必须设计为幂等操作,避免重复通知造成重复处理。
$this->markOrderAsPaid($transactionId);
$this->dispatchPostPaymentTasks($transactionId);
}
http_response_code(200);
}
reply_link_url 接收的是服务器之间的请求。在这里返回 302 无法让客户浏览器跳转,因为请求来自 NAB Transact 的服务器,而不是客户浏览器。
返回页面处理方式
return_link_url 对应的处理函数负责展示支付结果:
public function success()
{
$orderId = $_GET['order_id'] ?? null;
$order = $this->findOrder($orderId);
// 不应只相信浏览器返回的参数,应以服务器保存的交易状态为准。
if ($order && $order->isPaid()) {
return $this->render('checkout/success', [
'order' => $order,
]);
}
return $this->render('checkout/payment-pending', [
'order' => $order,
]);
}
实际字段名和签名验证方法应以当前使用的 NAB Transact 接入文档为准。不要仅凭 return_link_url 收到的查询参数,就将订单标记为已支付。
为什么看起来像没有触发
reply_link_url 的请求发生在后台,不会在 receipt page 中打开,也不会改变浏览器地址。要确认回调是否触发,可以检查:
- Web 服务器 access log 是否收到了对应请求;
- 应用日志是否记录了回调参数和处理结果;
- 后台是否已经更新订单状态;
- 接口是否及时返回了表示成功的 HTTP 状态码;
- 回调地址能否从公网访问,是否受到登录、Cookie、CSRF 或 IP 限制;
- 防火墙、反向代理或 WAF 是否拦截了请求。
在浏览器中直接访问 CGI handler,只能证明浏览器可以访问并执行该 URL,无法证明它能正确处理 NAB Transact 使用的请求方法、参数格式和安全校验。
注意事项
回调接口应尽快返回响应。邮件发送、库存同步等耗时任务最好写入队列异步执行,以免 NAB Transact 因等待超时而重试。
还需要注意:
- 为两个字段使用不同的 URL,以免混淆后台通知与前端返回。
- 回调处理必须具备幂等性。同一笔交易的通知多次到达时,不能重复扣减库存或发货。
- 不要根据固定的 15 秒页面等待时间判断回调是否完成。
- 客户可能关闭 receipt page,导致
return_link_url始终没有被访问。订单更新必须依靠服务器回调或主动查询交易状态。 - 如果 NAB Transact 的 receipt page 只提供 Return 链接,不支持自动跳转,客户需要单击该链接才能返回。这不会影响
reply_link_url在后台处理订单。 - 生产环境应优先使用证书有效的 HTTPS 地址。是否允许 HTTP、有哪些端口限制以及具体的 TLS 要求,应以当前 NAB Transact 文档和账户配置为准。
备注:内容仅供参考。
