Полная интеграция с PHP с использованием iexbase/tron-api Библиотека. Каждый шаг представляет собой отдельный блок кода, который вы можете скопировать в свой проект. Работает с любым PHP-фреймворком или обычным PHP.
Предварительные требования: PHP 7.4+, Composer, ext-gmp и ext-bcmath включены, кошелек Tron пополнен.
О подписи в PHP: Для работы API TronEnergy требуется подпись кошелька. tronWeb.trx.signMessageV2(). The iexbase/tron-api Библиотека не предоставляет доступ к этому конкретному примитиву подписи, поэтому в этом руководстве для этапа подписи используется небольшой вспомогательный код Node.js. Все остальное (отправка TRX , вызов API , отправка USDT ) остается на PHP. Если у вас есть решение для подписи на чистом PHP, которое генерирует действительную подпись signMessageV2, вы можете заменить вспомогательный код, не меняя никаких других шагов.
Поток
API ключ не требуется. Регистрация не нужна. Ваш код отправляет TRX в блокчейне на платежный адрес TronEnergy , подписывает сообщение, подтверждающее право собственности, а затем запрашивает делегирование. Energy поступает примерно через 3 секунды. Затем ваш код отправляет USDT , используя делегированную энергию.
1
Отправить TRX
Отправьте 4 или более TRX на платежный адрес в блокчейне (минимум 4, максимум 1000).
2
Знак
Подпишите tx_hash:delegate_to, чтобы подтвердить, что вы являетесь отправителем.
3
Требовать
Отправьте POST-запрос /delegate с хешем транзакции и подписью. Energy поступит примерно через 3 секунды.
Ценообразование линейное: 16 250 Energy за TRX . Минимальный заказ 4 TRX (65 000 Energy — один стандартный перевод USDT ), максимальный 1000 TRX (16,25 млн Energy ). Сумма, которую вы отправляете, точно определяет, сколько Energy будет возвращено — без уровней и пакетов. Для одного стандартного перевода используйте $trxAmount = 4Для перевода средств на новый кошелек используйте 8Для пакетной обработки используйте больше. Приведенный ниже код использует $trxAmount переменная, чтобы вы могли изменить ее в одном месте.
Шаг за шагом
1. Установите
composer require iexbase/tron-api
2. Настройка
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.
3. Получение платежной информации (необязательно)
// Get pricing and payment address (optional, energy is always available)
$supply = json_decode(
file_get_contents("${api}/supply"),
true
);
echo "Pay to: " . $supply['pay_to'] . "\n";
echo "Energy per TRX: " . $supply['energy_per_trx'] . "\n";
4. Отправьте 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-файлом:
// 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:
// 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
// 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');
}
Полный пример
<?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";
}