开发者文档
PHP 集成
使用 iexbase/tron-api 在 PHP 中集成TronEnergy能量委托。Composer 安装、复制粘贴即用的代码示例。
API 支付地址
TFqUiCu1JwLHHnBNeaaVKH7Csm4aA3YhZx
向此地址发送 TRX。您的交易哈希用于领取能量委托。
使用以下方式进行完整的 PHP 集成 iexbase/tron-api 库。每个步骤都是一个独立的代码块,您可以将其复制到您的项目中。适用于任何 PHP 框架或纯 PHP。
前置条件: PHP 7.4+、Composer、已启用 ext-gmp 和 ext-bcmath、一个已充值的 Tron 钱包。
关于 PHP 中的签名: TronEnergy API 需要使用
tronWeb.trx.signMessageV2() 进行钱包签名。iexbase/tron-api 库不公开此签名原语,因此本指南在签名步骤中使用一个微小的 Node.js 辅助工具。其他所有内容(发送 TRX、调用 API、发送 USDT)都保留在 PHP 中。如果您有可生成有效 signMessageV2 签名的纯 PHP 签名解决方案,可以直接替换辅助工具,而无需更改任何其他步骤。
流程
无需 API 密钥。无需注册。您的代码向 TronEnergy 支付地址链上发送 TRX,签名证明所有权,然后领取委托。能量在约 3 秒内到达。然后您的代码使用委托能量发送 USDT。
1
发送 TRX
链上向支付地址发送 4 个或更多 TRX(最少 4 个,最多 1000 个)。
2
签名
签名 tx_hash:delegate_to 以证明您是发送者。
3
领取
用交易哈希和签名 POST /delegate。能量在约 3 秒内到达。
定价采用线性算法:1 TRX 可获得 16,250 能量。 最小订单 4 TRX(65,000 能量——相当于一次标准 USDT 转账),最大 1,000 TRX(1,625 万能量)。您发送的金额直接决定了委托回来的能量数量——没有分层,没有套餐。单次标准转账请使用
$trxAmount = 4。新钱包转账请使用 8。批量操作请使用更多能量。下方代码使用了 $trxAmount 变量,您可以在一处修改。
分步指南
1. 安装
composer
composer require iexbase/tron-api
2. 配置
setup.php
require_once 'vendor/autoload.php';
use IEXBase\TronAPI\Tron;
$tron = new Tron();
$tron->setPrivateKey('YOUR_PRIVATE_KEY');
$tron->setAddress('YOUR_WALLET_ADDRESS');
$api = 'https://api.tronnrg.com';
$addr = 'TFqUiCu1JwLHHnBNeaaVKH7Csm4aA3YhZx'; // API payment address
$usdt = 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t'; // USDT contract
切勿硬编码凭证。 从环境变量或密钥管理器加载您的私钥。切勿将密钥提交到 git。
4. 发送 TRX
发送 TRX
// Send TRX to the API payment address — pricing is linear.
// 16,250 energy per TRX. Min 4 TRX, max 1,000 TRX.
// $trxAmount = 4 → 65,000 energy (standard USDT transfer)
// $trxAmount = 8 → 130,000 energy (new wallet transfer)
// $trxAmount = 40 → 650,000 energy (10 standard transfers)
// $trxAmount = 1000 → 16,250,000 energy (max)
$trxAmount = 4;
$payment = $tron->sendTrx($addr, $trxAmount);
if (!isset($payment['result']) || !$payment['result']) {
throw new Exception('TRX transfer failed');
}
$txHash = $payment['txid'];
echo "Payment sent: ${txHash}\n";
5. 签署消息
API 需要一个签名,用来证明发送 TRX 的钱包就是请求委托的钱包。我们用一个小型 Node.js 辅助脚本来实现。请将其保存为 sign.js,放在您的 PHP 文件旁边:
sign.js
// Usage: node sign.js <tx_hash> <delegate_to>
// Outputs the signature to stdout. Reads private key from TRON_PRIVATE_KEY env var.
const { TronWeb } = require('tronweb');
const [, , txHash, delegateTo] = process.argv;
const tronWeb = new TronWeb({
fullHost: 'https://api.trongrid.io',
privateKey: process.env.TRON_PRIVATE_KEY,
});
tronWeb.trx.signMessageV2(`${txHash}:${delegateTo}`)
.then(sig => process.stdout.write(sig))
.catch(e => { console.error(e.message); process.exit(1); });
在同一文件夹中安装 TronWeb:npm install tronweb。然后从 PHP 调用它:
从 PHP 签名
// Both the sender (in $tron) and the signer must be the SAME wallet.
// Make sure TRON_PRIVATE_KEY in your environment matches the wallet that sent the TRX.
$delegateTo = 'TWalletThatNeedsEnergy';
$signature = trim(shell_exec(
sprintf('node sign.js %s %s',
escapeshellarg($txHash),
escapeshellarg($delegateTo)
)
));
if (!$signature) {
throw new Exception('Signing failed. Check that node and tronweb are installed and TRON_PRIVATE_KEY is set.');
}
echo "Signed: " . substr($signature, 0, 20) . "...\n";
6. 领取委托
领取委托
// $txHash, $delegateTo, and $signature are all defined in the previous steps.
$ch = curl_init("${api}/delegate");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode([
'tx_hash' => $txHash,
'delegate_to' => $delegateTo,
'signature' => $signature,
]),
]);
$result = json_decode(curl_exec($ch), true);
curl_close($ch);
echo "Energy: " . $result['energy'] . "\n";
echo "Ref: " . $result['ref'] . "\n";
7. 发送 USDT
发送 USDT
// Energy is now delegated. Send USDT.
$contract = $tron->contract($usdt);
$transfer = $contract->transfer($delegateTo, 10 * pow(10, 6));
echo "USDT sent: " . $transfer . "\n";
错误处理
将领取调用包装在一个简单的重试辅助函数中。最常见的错误是 payment_verification_failed——这表示交易还未在链上被索引,请等待几秒钟后重试一次。
错误处理
function claimDelegation($api, $txHash, $delegateTo, $signature, $retries = 3) {
for ($i = 0; $i < $retries; $i++) {
$ch = curl_init("${api}/delegate");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode([
'tx_hash' => $txHash,
'delegate_to' => $delegateTo,
'signature' => $signature,
]),
]);
$result = json_decode(curl_exec($ch), true);
curl_close($ch);
if (!isset($result['error'])) {
return $result; // Success
}
switch ($result['error']) {
case 'payment_verification_failed':
// Most common: tx not yet indexed. Wait and retry.
sleep(3);
continue 2;
case 'hash_already_used':
throw new Exception('This tx hash has already been claimed');
case 'signature_mismatch':
throw new Exception('Signer does not match payment sender. Sign with the same wallet that sent TRX.');
case 'delegation_failed':
// Refund queued automatically if payment was verified
throw new Exception('Delegation failed: ' . $result['message']);
default:
throw new Exception($result['message'] ?? 'Unknown error');
}
}
throw new Exception('Transaction not found after retries');
}
完整示例
delegate-energy.php
<?php
require_once 'vendor/autoload.php';
use IEXBase\TronAPI\Tron;
$tron = new Tron();
$tron->setPrivateKey(getenv('TRON_PRIVATE_KEY'));
$tron->setAddress(getenv('TRON_WALLET_ADDRESS'));
$api = 'https://api.tronnrg.com';
$addr = 'TFqUiCu1JwLHHnBNeaaVKH7Csm4aA3YhZx';
try {
$delegateTo = 'TRecipientWallet';
$trxAmount = 4; // min 4, max 1000 — energy = trxAmount × 16,250
// 1. Send TRX (linear pricing: 16,250 energy per TRX)
$payment = $tron->sendTrx($addr, $trxAmount);
$txHash = $payment['txid'];
echo "Payment: ${txHash}\n";
// 2. Sign via Node helper (see Step 5 above)
$signature = trim(shell_exec(
sprintf('node sign.js %s %s',
escapeshellarg($txHash),
escapeshellarg($delegateTo)
)
));
if (!$signature) throw new Exception('Signing failed');
// 3. Claim delegation (with retry)
$result = claimDelegation($api, $txHash, $delegateTo, $signature);
echo "Energy: " . $result['energy'] . "\n";
echo "Ref: " . $result['ref'] . "\n";
// 4. Send USDT (energy is now available)
$contract = $tron->contract('TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t');
$transfer = $contract->transfer($delegateTo, 10 * pow(10, 6));
echo "USDT sent: ${transfer}\n";
} catch (Exception $e) {
echo "Error: " . $e->getMessage() . "\n";
}