通过API验证TRON交易 — TRON Wiki

通过API验证TRON交易

10 分钟阅读 · ⌘K 搜索

支付系统、交易所和 dApp 必须在向用户存入资金之前以编程方式确认 TRON 交易。广播 txid 是不够的 - 您需要执行收据、成功/失败状态,对于令牌,还需要解码的 Transfer 事件。

本指南涵盖了 TronWeb 和 TronGrid REST 的确认循环。

交易生命周期

  1. 广播 — 签名的交易进入内存池
  2. 包含在块中 — 通常约为 3 秒
  3. 提供收据getTransactionInfo 已填充
  4. 固化 — 块被视为最终块(可配置等待)

交易失败仍会消耗费用并返回FAILED收据。

通过 ID 获取交易 (TronWeb)

代码
async function waitForTx(txid, maxAttempts = 30, delayMs = 2000) {
  for (let i = 0; i < maxAttempts; i++) {
    const info = await tronWeb.trx.getTransactionInfo(txid);
    if (info && Object.keys(info).length > 0) {
      return info;
    }
    await new Promise((r) => setTimeout(r, delayMs));
  }
  throw new Error('Transaction info not found — timeout');
}

async function isTxSuccess(txid) {
  const info = await waitForTx(txid);
  return info.receipt?.result === 'SUCCESS';
}

TronGrid 休息

代码
GET /v1/transactions/{txid}
GET /wallet/gettransactioninfobyid?value={txid}

根据 TronGrid 指南 添加 TRON-PRO-API-KEY 标头。

验证USDT转账详情{#validate-usdt}

不要仅相信客户提供的金额。解析日志:

代码
const USDT = 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t';

function parseUsdtTransferFromInfo(txInfo) {
  const logs = txInfo.log || [];
  for (const log of logs) {
    if (tronWeb.address.fromHex(log.address) !== USDT) continue;
    // Transfer(address,address,uint256) topic0 = 0xddf252ad...
    // Decode topics[1] from, topics[2] to, data value
    // Use tronWeb.utils.abi.decodeLog or ethers ABI decoder
  }
}

确认:

  • 代币合约=官方USDT
  • to = 您的充值地址
  • value = 预期金额(6 位小数)

待处理和缺失的交易

情况意义
getTransactionInfo 空尚未开采——继续投票
收据失败恢复、OUT_OF_ENERGY 等
未找到发送txid 错误或从未广播

用户指南:待处理交易

块凝固

对于大额存款:

代码
const block = await tronWeb.trx.getBlockByNumber(info.blockNumber);
// Optionally wait N more blocks via getCurrentBlock()

TRON 终结速度快;很多商家使用单SUCCESS。

匹配业务记录

幂等信用流:

1.用户提交txid

  1. 服务器验证SUCCESS + 解析Transfer
  2. 检查txid尚未存入数据库
  3. 信用用户余额
  4. 存储区块号、时间戳、原始日志

失败的事务诊断

读取 resMessage / 合约结果十六进制以了解恢复原因。常见:

  • OUT_OF_ENERGY
  • 代币余额不足
  • 合同暂停

故障排除:交易失败

Webhook 集成模式

每 3 秒轮询一次 gettransactioninfobyid,直到 blockNumber > 0 或超时(5 分钟)。在 SUCCESS 上,发出内部 Webhook。在REVERT或超时时,标记支付失败并提醒运营团队。

处理 REVERT 和误报

如果执行失败,getTransactionInfo 返回 receipt.result = REVERT — 不记入付款。一些索引器在确认之前会短暂返回空——区分空收据(待处理)和REVERT(失败)。对不明确的情况实施 5-10 分钟后超时和人工审核队列。

相关指南 {#相关}

常见问题解答

TRON需要多少次确认?

TRON 快速使用固化块 - 大多数应用程序将一张 SUCCESS 收据视为最终收据。高价值应用程序可能会等待额外的区块固化。

getTransaction 和 getTransactionInfo 有什么区别?

getTransaction返回广播数据; getTransactionInfo 包括收据、费用、使用的能量以及执行后的合约结果。

tx 可以显示SUCCESS 但金额错误吗?

始终解析事件日志 - 验证金额和收件人匹配顺序。

投票需要多长时间?

通常不到 10 秒。 60-120 秒后超时,并询问用户TronScan 链接。

TronScan 与 API?

同链数据。用于自动化的 API; TronScan指南 用于手动调试。