支付接入

USDT / USDC 支付接口 · 订单 API 与回调验签

从商户后端创建 USDT / USDC 支付订单、获取收银台、查询付款状态并验证签名 Webhook。支持钱包快捷支付与手动转账,提供金额匹配和回调重发文档,密钥保留在服务端。

支持的支付网络

TRON 暂不支持 USDC。支付组合需要后台启用并配置有效的收款钱包。USDbC、USDC.e 及其他合约不能替代此处列出的币种。

Ethereum、Polygon、Solana 和 Base 使用 Circle 发行的原生 USDC。 BNB Smart Chain 使用 Binance-Peg USDC,精度为 18 位,并非 Circle 发行的原生 USDC。 Base 主网支持原生 USDC 与桥接 USDT。是否可收款取决于后台启用状态和有效的收款钱包。

操作步骤

四个接入步骤,各自有检查点

适合自定义网站、SaaS 与数字商品后端。示例使用 USDC / Base;网络与币种需要同时匹配启用配置。

  1. 01

    先在自己的数据库保存订单号、价格、买家与币种网络。服务端使用同一商户的 API Key 和当前 Webhook 密钥,对实际发送的 JSON 原文签名。

  2. 02

    创建成功后保存 checkoutUrl 与 payment 返回值。向客户展示完整应付金额;发生超时先按原 externalOrderId 查询,重复编号被拒绝不代表应新建付款。

  3. 03

    回调先验证原始请求体、时间戳与签名,再核对保存的本地订单、网络、币种、收款地址、应付及实付信息。浏览器返回页面不作为支付依据。

  4. 04

    在事务或持久队列中可靠记录有效通知,确保同一订单只交付一次,再返回 2xx。CONFIRMED 已表示付款确认,不必只等待 COMPLETED。

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

接入要点

把关键步骤,做准确

原文签名,服务端调用

API Key 与签名密钥保留在后端,对时间戳、点号和实际发送的 JSON 原文计算 HMAC-SHA256。

超时后,查询原订单

请求超时不代表创建失败。保留 externalOrderId,先查询状态,再决定重试,避免盲目生成新编号。

付款确认后,只处理一次

BoltUtil 核对付款并发送签名回调。您的服务端需要验签、核对本地订单和付款信息、去重,再执行开通、发货或入账。

Node.js 22+ · 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
}

此处为服务端接入示例,不会发送请求。实际调用需 API Key、时间戳与请求原文签名,并校验本地订单和价格。

查看开发文档

支付接入

常见问题

GitHub 示例可以直接作为生产收款服务吗?

示例用于验证建单协议、金额和原文签名,不包含您的订单数据库与持久去重。默认回调返回 503,避免未保存通知就确认接收。完成本地协议测试后,再接入自己的订单事务与履约流程;WooCommerce 应使用官方插件对应的集成接口。

同一个商户订单号可以重复创建吗?

同一商户下的 externalOrderId 必须唯一,重复创建会被拒绝。请求超时后先查询原订单,不要直接生成新编号。

资金会经过 BoltUtil 平台吗?

不会。客户直接转入您配置的收款钱包。BoltUtil 负责订单与链上付款核对,不托管资金,不需要私钥、助记词或提现权限。

所有网络都支持 USDT 和 USDC 吗?

TRON 仅支持 USDT。其他网络支持配置的 USDT / USDC 版本,实际可用组合取决于渠道启用状态与商户钱包。请以接口和收银台返回为准。

客户返回网站后可以发货吗?

returnUrl 只是页面跳转。请以已验证的签名回调或可信的服务端查询为依据,核对订单后幂等处理。

少付或多付如何处理?

免费商户可查看自己的待核对记录。手动转账的金额差异符合规则时可生成核对记录;多个候选须先核实归属。接受或拒绝关联需要有效会员,接受后确认付款并按配置发送回调。

客户可以连接钱包,自动填写金额吗?

可以。支持的网络与设备可使用钱包快捷支付,自动填写收款地址、代币和完整应付金额,客户在钱包中核对并确认。首次使用可能需要解锁、授权连接或切换网络;也可扫码或复制地址手动转账,付款后仍需链上确认。

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

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