接入指南

Node.js 接入稳定币收款

在服务端创建 USDT / USDC 订单,向客户展示收银台。BoltUtil 核对链上付款,您的系统验证签名回调后,再开通服务或交付商品。

操作步骤

从创建订单,到确认付款

适合已有 Node.js 后端的商户。示例使用 USDC 与 Base,也可选择已启用的其他网络与币种组合。

  1. 01

    在数据库保存商户订单号,从服务端读取价格并校验买家归属。

  2. 02

    选择已启用的网络与币种,用 API Key、时间戳和原始 JSON 签名创建订单。

  3. 03

    向客户展示返回的收银台与完整应付金额,不把 returnUrl 当作付款证明。

  4. 04

    验证 Webhook 的原始请求体、时间戳与签名,核对订单和付款信息后幂等交付。

BoltUtil 核对付款并发送签名回调。您的服务端验签、核对订单状态并去重后,再交付商品、开通服务或入账。

接入要点

把关键步骤,做准确

密钥只保存在服务端

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

资金直接结算到商户钱包

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

付款后安全履约

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

Node.js 20+ · 创建 USDC / Base 订单
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 createStablecoinCheckout(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: 'USDC',
    network: 'BASE',
    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
}

示例仅供接入和排查参考,不会发送请求。请结合您的订单数据、网络配置与当前接口文档使用。

查看开发文档

returnUrl 不是付款确认

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

保留链上事实便于支持

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

接入指南

常见问题

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

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

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

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

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

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

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

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

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

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

USDT 和 USDC 可以选择同样的网络吗?

不完全相同。TRON 仅支持 USDT,其他可用组合以启用配置和收款钱包为准。示例使用 USDC / Base;修改时需同时核对币种、网络与对应配置。

为您的业务,接上稳定币收款

创建订单、核对付款,确认后通知您的系统。