CChainPay
Увійти

Прийом USDT у WooCommerce без плагіна

Плагіна WooCommerce для ChainPay поки немає. API достатньо мале, щоб інтегрувати його приблизно шістдесятьма рядками PHP: показати адресу для депозиту на сторінці замовлення і позначити замовлення оплаченим, коли прийде вебхук.

Як це працює

  1. Клієнт оформлює замовлення зі способом оплати, після якого статус лишається pending або on-hold (наприклад, «Прямий банківський переказ», перейменований на «USDT»).
  2. Сторінка подяки просить у ChainPay адресу для депозиту на це замовлення й показує її.
  3. Клієнт платить. ChainPay переказує кошти на ваш гаманець і надсилає вебхук на ваш сайт.
  4. Обробник вебхука перевіряє секрет і суму та викликає 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];
        },
    ]);
});

Нотатки

Дивіться також