如何使用 Node.js 在网站接收 USDT 付款

生产级 USDT 收银台不能只展示钱包地址。您的 Node.js 服务应先创建订单,再向浏览器返回 Checkout 信息,并且只在验证链上付款 Webhook 后履约。

专为
Node.js 服务端示例
专为
资金直达商户钱包
专为
签名 Webhook 验证
Node.js 20+ 服务端模块:使用已校验的本地订单创建付款
import crypto from 'node:crypto'

// Node.js 20+ server module. Call only after authenticating the buyer.
// order must come from your database, with ownership and price checked.
// Never pass req.body directly; persist externalOrderId before calling.
export async function createUsdtCheckout(order) {
  const key = process.env.BOLTUTIL_API_KEY
  const secret = process.env.BOLTUTIL_API_SECRET
  if (!key || !secret) throw new Error('Missing server credentials')

  const payload = JSON.stringify({
    externalOrderId: order.externalOrderId,
    amount: order.amount,
    currency: 'USDT',
    network: 'TRC20',
    notifyUrl: 'https://merchant.com/webhooks/boltutil',
    returnUrl: 'https://merchant.com/orders/complete'
  })
  const timestamp = Date.now().toString()
  const signature = crypto.createHmac('sha256', secret)
    .update(`${timestamp}.${payload}`).digest('hex')

  // A timeout does not prove creation failed. Query order/status using
  // the SAME externalOrderId before deciding whether to retry.
  const response = await fetch('https://api.boltutil.com/api/v1/order/create', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'X-Bolt-Key': key,
      'X-Bolt-Timestamp': timestamp,
      'X-Bolt-Signature': signature
    },
    body: payload,
    signal: AbortSignal.timeout(10000)
  })
  const result = await response.json()
  if (!response.ok || result.code !== 200 || !result.data?.checkoutUrl) {
    throw new Error('Create order failed; reconcile the saved order')
  }
  // Save result.data on the server. Return only checkout data to the buyer.
  return result.data
}

Node.js 接入 USDT 付款的步骤

适用于 SaaS 订阅、数字商品、发票、账户充值,以及任何需要可审计 USDT 支付状态的网站。

  1. 01

    调用支付 API 前,先在自己的数据库创建并保存唯一内部订单号。

  2. 02

    由 Node.js 后端签名请求并调用 BoltUtil 创建订单接口,再把 Checkout URL 返回给浏览器。

  3. 03

    向客户明确展示 USDT 网络和精确金额;浏览器跳转或 returnUrl 不能作为付款证明。

  4. 04

    使用原始请求 body 验证 Webhook 时间戳和签名,再按订单号与交易哈希幂等履约。

  5. 05

    保存已确认的交易哈希、网络、金额、收款地址和履约结果,供客服与对账使用。

密钥只保存在服务端

从 Node.js 后端创建订单,让 API 密钥和本地购物车校验始终远离浏览器代码。

资金直接结算到商户钱包

客户向您配置的商户钱包付款,BoltUtil 监听所选 USDT 网络并报告确认结果。

付款后安全履约

签名的服务端 Webhook 让应用无需信任客户跳转,也能可靠开通权限、发货或入账。

集成说明

生产前注意事项

returnUrl 不是付款确认

客户可能提前返回,或者提交最终失败的交易。请以已验证的 Webhook 或服务端订单状态查询为准。

网络选择属于收银台体验

USDT 存在于多条网络。请明确显示 TRC20、ERC20、BEP20、Polygon 或 Solana,并只匹配创建订单时选择的网络。

保留链上事实便于支持

保存商户订单号、交易哈希、精确金额、收款地址和确认状态,可以显著缩短异常付款的排查时间。

商家上线前询问的问题

这些答案可帮助开发人员、创始人和支持团队在接受真正的 USDT 付款之前了解付款生命周期。

可以直接从浏览器 JavaScript 创建 USDT 订单吗? +

不要在浏览器代码中暴露私有 API 密钥。应从 Node.js 服务端创建订单、校验本地购物车或发票,再只把 Checkout 数据返回给前端。

Node.js 应用应该在什么时候开通付款后的权益? +

仅在签名 Webhook 验证通过,或者可信的服务端状态查询确认订单完成后开通。returnUrl 不是付款证据。

如何避免同一订单被重复履约? +

让履约逻辑保持幂等,并通过唯一约束或事务状态变更保存商户订单号和交易哈希,安全忽略重复回调。

创建订单请求超时后怎么办? +

保留已保存的 externalOrderId,由服务端使用同一订单号调用 POST /api/v1/order/status。网络超时不代表创建失败;先核对订单状态再决定重试,不要直接生成新编号,以免产生第二个收银台订单。

示例可以直接作为完整收银台上线吗? +

这是 Node.js 20+ 服务端模块,需要接入自己的登录鉴权、数据库订单及归属校验、HTTPS 回调地址和已验证的 Webhook 处理器。金额必须读取服务端订单记录,不能直接信任浏览器提交的金额。

Node.js 收银台应该选择哪条 USDT 网络? +

选择客户能够稳定使用的网络,并在页面上明确展示。BoltUtil 使用同一套订单 API 支持 TRC20、ERC20、BEP20、Polygon 和 Solana。

推出更清洁的USDT支付流程

创建订单、监控转账并通知您的后端,而无需要求客户发送屏幕截图。

创建免费帐户