Прийом USDT у WooCommerce без плагіна
Плагіна WooCommerce для ChainPay поки немає. API достатньо мале, щоб інтегрувати його приблизно шістдесятьма рядками PHP: показати адресу для депозиту на сторінці замовлення і позначити замовлення оплаченим, коли прийде вебхук.
Як це працює
- Клієнт оформлює замовлення зі способом оплати, після якого статус лишається
pendingабоon-hold(наприклад, «Прямий банківський переказ», перейменований на «USDT»). - Сторінка подяки просить у ChainPay адресу для депозиту на це замовлення й показує її.
- Клієнт платить. ChainPay переказує кошти на ваш гаманець і надсилає вебхук на ваш сайт.
- Обробник вебхука перевіряє секрет і суму та викликає
payment_complete().
mu-плагін
Збережіть як wp-content/mu-plugins/chainpay.php:
<?php
// wp-content/mu-plugins/chainpay.php
const CHAINPAY_API = 'https://api.chainpay.site';
const CHAINPAY_SECRET = 'change-me';
const CHAINPAY_WALLET = 'TYourOwnTronWallet...';
function chainpay_address(WC_Order $order): ?string {
$cached = $order->get_meta('_chainpay_address');
if ($cached) {
return $cached;
}
$res = wp_remote_post(CHAINPAY_API . '/deposit-address', [
'headers' => ['Content-Type' => 'application/json'],
'timeout' => 15,
'body' => wp_json_encode([
'ticker' => 'trc20/usdt',
'callbackUrl' => rest_url('chainpay/v1/webhook') . '?token=' . CHAINPAY_SECRET,
'forwardAddress' => CHAINPAY_WALLET,
'externalReference' => 'wc-' . $order->get_id(),
]),
]);
if (is_wp_error($res)) {
return null;
}
$address = json_decode(wp_remote_retrieve_body($res), true)['address'] ?? null;
if ($address) {
$order->update_meta_data('_chainpay_address', $address);
$order->save();
}
return $address;
}
add_action('woocommerce_thankyou', function ($order_id) {
$order = wc_get_order($order_id);
if (!$order || !$order->has_status(['pending', 'on-hold'])) {
return;
}
$address = chainpay_address($order);
if ($address) {
echo '<p>Send ' . esc_html($order->get_total()) . ' USDT (TRC20) to <code>'
. esc_html($address) . '</code></p>';
}
});
add_action('rest_api_init', function () {
register_rest_route('chainpay/v1', '/webhook', [
'methods' => 'POST',
'permission_callback' => '__return_true',
'callback' => function (WP_REST_Request $req) {
if (!hash_equals(CHAINPAY_SECRET, (string) $req->get_param('token'))) {
return new WP_REST_Response(null, 403);
}
$event = $req->get_json_params();
if (($event['status'] ?? '') !== 'confirmed') {
return ['ok' => true];
}
$order = wc_get_order((int) str_replace('wc-', '', $event['externalReference'] ?? ''));
if ($order && !$order->is_paid() && (float) $event['amount'] >= (float) $order->get_total()) {
$order->payment_complete($event['txHash']);
}
return ['ok' => true];
},
]);
});
Нотатки
- Задайте валюту магазину USD (або іншу прив'язану до долара), щоб сума замовлення дорівнювала сумі USDT. Для інших валют спершу конвертуйте, наприклад через
GET /rates/convert. - Замініть
CHAINPAY_SECRETдовгим випадковим значенням і не комітьте його. - URL вебхука має бути публічно доступним за HTTPS. Для роботи
rest_url()потрібні «красиві» постійні посилання. payment_complete()захищено перевіркоюis_paid(), тож повторні доставки не обробляють замовлення двічі.- Недоплати відсікає перевірка суми; обробляйте їх вручну або додайте в обробник нотатку до замовлення.
- Для BNB Smart Chain використовуйте
bep20/usdtі гаманець0x…замістьtrc20/usdt.