TRC-20 USDT 商户 API

API 版本 v1 · 文档修订 v1.1.0

接入配置

后台创建并查询订单,付款人通过收银台使用 TronLink,链上固化后平台按订单发出到账通知。

从管理员取得商户号、API 密钥和回调验签密钥。可在下单时指定 HTTPS 回调地址,也可在门户配置商户默认地址。密钥保存在业务后台。

API 地址 https://pay-api.ignitions.ai。鉴权使用 Authorization: Bearer <API_KEY>。平台根据密钥识别商户。

创建支付订单

POST /v1/payments · Content-Type: application/json

同一商户以相同商户订单号和相同参数重试时返回原订单,包括保持 callback_url 的值及是否传入。保存 payment_id,把付款人带到 checkout_url。

请求字段要求含义
merchant_order_id必填本商户内唯一,重试使用同一值。
amount_atomic必填USDT 最小单位的正整数字符串。12500000 表示 12.5 USDT。
expires_at必填带时区的未来截止时间。
return_url条件或可选付款后返回商户的预登记 HTTPS URL。仅用于导航。
callback_url条件或可选这笔订单的异步到账回调。须为使用域名和 443 端口的 HTTPS URL,支持不同路径。省略时使用商户当时的默认地址,两处都未填则返回 400。下单后该地址固定,修改默认地址只影响新订单。
curl https://pay-api.ignitions.ai/v1/payments -H "Authorization: Bearer ${MERCHANT_API_KEY}" -H 'Content-Type: application/json' --data-binary '{
  "merchant_order_id": "ORDER-1001",
  "amount_atomic": "12500000",
  "expires_at": "2030-01-01T12:00:00Z",
  "callback_url": "https://merchant.example.com/v1/webhooks/tron",
  "return_url": "https://merchant.example.com/wallet"
}'

响应示例

{
  "payment_id": "24c21b5f-78b7-404a-9b76-f0a610d182db",
  "merchant_order_id": "ORDER-1001",
  "amount_atomic": "12500000",
  "expires_at": "2030-01-01T12:00:00Z",
  "status": "PENDING",
  "checkout_url": "https://checkout.example.com/pay/#EXAMPLE_CHECKOUT_TOKEN"
}
HTTP说明
200幂等重试,返回原支付订单和 checkout_url
201订单已创建
400订单字段无效、返回地址未登记,或请求与商户配置都没有回调地址
401API 密钥无效
403商户暂停创建新订单
409订单号已用于不同参数
413请求正文超过 32 KiB
415需要 application/json
429接入限流,退避后使用原订单号重试
503服务暂时不可用,可使用原订单号重试

查询支付订单

GET /v1/payments/{payment_id}

payment_id 是下单接口返回的 UUID。只查询本商户订单。已确认订单附带确认时间及交易 ID 列表。

curl https://pay-api.ignitions.ai/v1/payments/24c21b5f-78b7-404a-9b76-f0a610d182db -H "Authorization: Bearer ${MERCHANT_API_KEY}"
响应字段要求含义
payment_id必填支付平台订单 ID。
merchant_order_id必填商户订单号。
amount_atomic必填订单应收金额,PAID 时也是经确认的商户入账金额。
expires_at必填付款截止时间。
status必填平台订单状态,见下文。
paid_at条件或可选PAID 时的确认时间。
txids条件或可选PAID 时用于确认的链上交易 ID。

响应示例

{
  "payment_id": "24c21b5f-78b7-404a-9b76-f0a610d182db",
  "merchant_order_id": "ORDER-1001",
  "amount_atomic": "12500000",
  "expires_at": "2030-01-01T12:00:00Z",
  "status": "PAID",
  "paid_at": "2030-01-01T11:55:00Z",
  "txids": [
    "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
  ]
}
HTTP说明
200查单成功
401API 密钥无效
404订单不存在或不属于本商户
429接入限流,退避后重试
503服务暂时不可用

订单状态

状态含义
PENDING等待钱包付款。
CONFIRMING等待固化扫描确认。
PAID已确认,可按订单幂等入账。
REVIEW_REQUIRED少付、多付、迟到或其他异常,等待人工处理。
EXPIRED订单已到期,当前未发现符合条件的付款。

以查单或已验签通知的 PAID 为入账依据。收银台跳转用于返回业务页面。

到账回调 payment.paid

平台通过 HTTPS POST 向下单时保存的地址投递,使用该商户的验签密钥签名。成功持久化后返回 204,重复事件同样返回 204。平台重试超时、HTTP 408、429 和 5xx,沿用地址、event_id 和原始正文,每次重新签名。管理员可重发最终失败的事件。投递时验证 DNS 和 HTTPS 证书,拒绝重定向及未经平台放行的 VPC 目标。

请求头含义
X-Tron-TimestampUnix 秒,允许五分钟时差
X-Tron-Signaturesha256= 加 64 位小写十六进制 HMAC
{
  "event_id": "payment.paid:24c21b5f-78b7-404a-9b76-f0a610d182db",
  "api_version": "v1",
  "type": "payment.paid",
  "occurred_at": "2030-01-01T11:55:00Z",
  "data": {
    "merchant_id": "holdem",
    "payment_id": "24c21b5f-78b7-404a-9b76-f0a610d182db",
    "merchant_order_id": "ORDER-1001",
    "amount_atomic": "12500000",
    "txids": [
      "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
    ]
  }
}

保留原始 HTTP 请求正文。使用独立回调密钥计算 HMAC-SHA256(timestamp + "." + rawBody),验签后再解析 JSON。核对商户号、支付 ID、商户订单号和金额,使用 event_id 和本地订单唯一约束,在同一事务中去重和入账。

Node.js 验签示例

import { createHmac, timingSafeEqual } from 'node:crypto';

function verifyWebhook(rawBody, timestamp, signature, secret, now = Date.now()) {
  if (typeof timestamp !== 'string' || !/^\d{1,12}$/.test(timestamp) ||
      typeof signature !== 'string' || !/^sha256=[0-9a-f]{64}$/.test(signature) ||
      Math.abs(now - Number(timestamp) * 1000) > 300_000) return false;
  const expected = createHmac('sha256', secret)
    .update(timestamp).update('.').update(rawBody).digest();
  return timingSafeEqual(expected, Buffer.from(signature.slice(7), 'hex'));
}

版本记录

API文档修订说明
v1v1.1.0下单可通过 callback_url 指定到账回调,商户默认回调为可选。
v1v1.0.0下单、查单、统一收银台及分商户到账回调。

不兼容变更使用新的 API 主版本路径,旧版文档单独保留。