密钥只保存在服务端
从 Node.js 后端创建订单,让 API 密钥和本地购物车校验始终远离浏览器代码。
操作步骤
适合已有 Node.js 后端的商户。示例使用 USDC 与 Base,也可选择已启用的其他网络与币种组合。
在数据库保存商户订单号,从服务端读取价格并校验买家归属。
选择已启用的网络与币种,用 API Key、时间戳和原始 JSON 签名创建订单。
向客户展示返回的收银台与完整应付金额,不把 returnUrl 当作付款证明。
验证 Webhook 的原始请求体、时间戳与签名,核对订单和付款信息后幂等交付。
BoltUtil 核对付款并发送签名回调。您的服务端验签、核对订单状态并去重后,再交付商品、开通服务或入账。
接入要点
从 Node.js 后端创建订单,让 API 密钥和本地购物车校验始终远离浏览器代码。
客户向您配置的商户钱包付款,BoltUtil 监听所选 USDT / USDC 网络并报告确认结果。
签名的服务端 Webhook 让应用无需信任客户跳转,也能可靠开通权限、发货或入账。
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
}示例仅供接入和排查参考,不会发送请求。请结合您的订单数据、网络配置与当前接口文档使用。
查看开发文档客户可能提前返回,或者提交最终失败的交易。请以已验证的 Webhook 或服务端订单状态查询为准。
保存商户订单号、交易哈希、精确金额、收款地址和确认状态,可以显著缩短异常付款的排查时间。
接入指南
不要在浏览器代码中暴露私有 API 密钥。应从 Node.js 服务端创建订单、校验本地购物车或发票,再只把 Checkout 数据返回给前端。
仅在签名 Webhook 验证通过,或者可信的服务端状态查询确认订单完成后开通。returnUrl 不是付款证据。
让履约逻辑保持幂等,并通过唯一约束或事务状态变更保存商户订单号和交易哈希,安全忽略重复回调。
保留已保存的 externalOrderId,由服务端使用同一订单号调用 POST /api/v1/order/status。网络超时不代表创建失败;先核对订单状态再决定重试,不要直接生成新编号,以免产生第二个收银台订单。
这是 Node.js 20+ 服务端模块,需要接入自己的登录鉴权、数据库订单及归属校验、HTTPS 回调地址和已验证的 Webhook 处理器。金额必须读取服务端订单记录,不能直接信任浏览器提交的金额。
不完全相同。TRON 仅支持 USDT,其他可用组合以启用配置和收款钱包为准。示例使用 USDC / Base;修改时需同时核对币种、网络与对应配置。