通过API验证TRON交易
支付系统、交易所和 dApp 必须在向用户存入资金之前以编程方式确认 TRON 交易。广播 txid 是不够的 - 您需要执行收据、成功/失败状态,对于令牌,还需要解码的 Transfer 事件。
本指南涵盖了 TronWeb 和 TronGrid REST 的确认循环。
交易生命周期
- 广播 — 签名的交易进入内存池
- 包含在块中 — 通常约为 3 秒
- 提供收据 —
getTransactionInfo已填充 - 固化 — 块被视为最终块(可配置等待)
交易失败仍会消耗费用并返回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
- 服务器验证SUCCESS + 解析Transfer
- 检查txid尚未存入数据库
- 信用用户余额
- 存储区块号、时间戳、原始日志
失败的事务诊断
读取 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指南 用于手动调试。
感谢你的反馈——帮助我们改进文档。