通过 TronWeb 在 TRON 上以编程方式发送 USDT
在 TRON 上自动化支付USDT — 工资、提款、商家退款 — 需要通过 TronWeb 或原始 HTTP API 构建签名的 TRC-20 transfer 交易。当您正确处理能源和安全性时,TRON 的约 3 秒最终确定性使程序化 USDT 成为高吞吐量结算的理想选择。
本指南涵盖从后端服务的端到端 USDT 发送。
先决条件{#先决条件}
- TronWeb + TronGrid API 密钥
- 带有USDT余额+TRX或冻结能量的热钱包
- 官方USDT合约:
TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t - 每次发送前进行地址验证
金额换算
USDT 使用 6 位小数:
function toUsdtBaseUnits(humanAmount) {
return Math.round(Number(humanAmount) * 1e6);
}
function fromUsdtBaseUnits(base) {
return Number(base) / 1e6;
}
对于大值,首选 BigInt。
使用 TronWeb 进行基本传输
const TronWeb = require('tronweb');
const tronWeb = new TronWeb({
fullHost: 'https://api.trongrid.io',
privateKey: process.env.PAYOUT_PRIVATE_KEY,
headers: { 'TRON-PRO-API-KEY': process.env.TRONGRID_KEY },
});
const USDT = 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t';
async function sendUsdt(toAddress, amountHuman) {
if (!tronWeb.isAddress(toAddress)) {
throw new Error('Invalid TRON address');
}
const contract = await tronWeb.contract().at(USDT);
const amount = toUsdtBaseUnits(amountHuman);
const txid = await contract.transfer(toAddress, amount).send({
feeLimit: 100_000_000,
callValue: 0,
shouldPollResponse: true,
});
return txid;
}
能量和费用限制
- 将
feeLimit设置得足够高以避免OUT_OF_ENERGY(100个TRX太阳单位共同起点 - 根据经验进行调整)。 - 监控发送器能量:
tronWeb.trx.getAccountResources(address) - 冻结支付钱包上的 TRX 以获取可预测的费用
面向用户的费用上下文:如何发送USDTTRC-20。
幂等性和安全性
生产支付系统需要:
| 控制 | 目的 |
|---|---|
| 幂等键 | 防止重试时重复发送 |
| 余额预检 | 转账前【查询余额】(/zh/articles/query-trc20-balance-api/) |
| 允许名单 | 可选的收件人验证 |
| 每日最大交易量 | 限制热钱包暴露 |
| 发送日志 | 存储每个付款请求的 txid |
确认发货
播出后:
const info = await tronWeb.trx.getTransactionInfo(txid); // info.receipt.result === 'SUCCESS'
完整模式:验证交易 API。
TransferFrom 模式(托管){#transferfrom}
如果用户批准了您的合同/支出者:
await contract.transferFrom(userAddress, toAddress, amount).send({ feeLimit: 100_000_000 });
需要用户事先提供approve——这在 DeFi 中很常见,在简单支付中很少见。
错误处理
| 错误 | 行动 |
|---|---|
| OUT_OF_ENERGY | 充值TRX或冻结更多TRX |
| REVERT | 查看余额、合约暂停、黑名单 |
| 重复 | 幂等性 — tx 可能已经存在 |
| 地址无效 | 在 API 验证层拒绝 |
在 Shasta {#shasta} 上测试
在 Shasta 上部署带有 6 位小数的模拟 TRC-20 或使用测试代币。切勿使用存储库中的主网私钥进行测试。
合规说明
自动USDT转移可能会触发反洗钱义务,具体取决于司法管辖区。这是技术文档,而不是法律建议。
生产中的错误处理
将 .send() 包裹在 try/catch 中。失败时,在重试之前获取getTransactionInfo——部分广播在TRON上很少见,但幂等性很重要。记录调整热钱包上冻结的 TRX 金额所消耗的能量。
TronLink 与服务器签名
浏览器应用程序应使用 TronLink window.tronWeb 作为用户控制的按键。服务器支付扫描在TronWeb构造函数中使用私钥——隔离在VPC中,永远不会暴露给前端。多重签名金库需要帐户权限工作流程而不是单密钥TronWeb。
相关指南 {#相关}
常见问题解答
一次USDT传输需要多少能量?
当接收者已经持有 USDT 时,主网上约 65,000 能量用于标准 TRC-20 传输。首次接收者的费用可能会更高。
我可以在同一个钱包中发送USDT而不发送TRX吗?
发送账户需要能量或TRX来燃烧费用。单独USDT无法支付网络资源。
如何批量付款?
具有速率限制的循环 - TRON 没有本机 ERC-4337 批处理。考虑具有并发上限的队列工作线程。
服务器发送是否需要TronLink?
不需要。服务器直接通过TronWeb使用私钥。
以编程方式发送的地址错误?
不可逆转。验证 tronWeb.isAddress() 并可选择确认校验和模式。
感谢你的反馈——帮助我们改进文档。