PAYATHON 2026

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 文档和账户配置为准。

备注:内容仅供参考。