Интеграция криптоплатежей в WooCommerce
WooCommerce не имеет нативной поддержки крипты, поэтому интеграция строится через один из двух подходов: готовый плагин платёжного процессора (CoinGate, NOWPayments, Coinbase Commerce) или кастомный WooCommerce payment gateway для работы с собственным кошельком. Выбор определяется тем, нужна ли вам кастодиальная или некастодиальная схема.
Вариант 1: платёжный процессор (быстро, с комиссиями)
Наиболее распространённые варианты:
CoinGate WooCommerce Plugin — официальный плагин, поддерживает 70+ монет, выплаты в EUR/USD. Установка через wp-admin → Plugins. Настройка занимает 15 минут если аккаунт CoinGate уже верифицирован.
NOWPayments — аналогичный сервис, акцент на privacy coins (XMR, ZCash). Плагин на WordPress.org.
BTCPay Server — self-hosted процессор, некастодиальный (вы контролируете ключи). Больше DevOps работы, зато 0% комиссий процессора. Рекомендую для проектов с серьёзным объёмом транзакций.
Вариант 2: кастомный WooCommerce gateway
Если нужна интеграция с собственной инфраструктурой (собственный узел, специфическая монета, особая логика), пишем кастомный payment gateway.
Структура WooCommerce Payment Gateway
class WC_Crypto_Gateway extends WC_Payment_Gateway {
public function __construct() {
$this->id = 'crypto_gateway';
$this->method_title = 'Crypto Payment';
$this->method_description = 'Accept cryptocurrency payments';
$this->has_fields = false;
$this->supports = ['products'];
$this->init_form_fields();
$this->init_settings();
$this->title = $this->get_option('title');
$this->description = $this->get_option('description');
$this->api_key = $this->get_option('api_key');
add_action('woocommerce_update_options_payment_gateways_' . $this->id,
[$this, 'process_admin_options']
);
add_action('woocommerce_api_' . $this->id, [$this, 'handle_webhook']);
}
public function process_payment($order_id) {
$order = wc_get_order($order_id);
// Создаём платёжный запрос через наш API
$payment = $this->create_crypto_payment([
'amount' => $order->get_total(),
'currency' => get_woocommerce_currency(),
'order_id' => $order_id,
'callback_url' => WC()->api_request_url($this->id),
'success_url' => $this->get_return_url($order),
]);
if (is_wp_error($payment)) {
wc_add_notice('Payment error: ' . $payment->get_error_message(), 'error');
return ['result' => 'fail'];
}
// Сохраняем внешний ID для reconciliation
$order->update_meta_data('_crypto_payment_id', $payment['id']);
$order->update_status('pending', 'Awaiting crypto payment');
$order->save();
return [
'result' => 'success',
'redirect' => $payment['payment_url'],
];
}
public function handle_webhook() {
$payload = file_get_contents('php://input');
$data = json_decode($payload, true);
if (!$this->verify_webhook_signature($payload, $_SERVER['HTTP_X_SIGNATURE'] ?? '')) {
status_header(400);
exit('Invalid signature');
}
$order = wc_get_order($data['order_id']);
if (!$order) {
status_header(404);
exit('Order not found');
}
switch ($data['status']) {
case 'paid':
$order->payment_complete($data['payment_id']);
$order->add_order_note(sprintf(
'Crypto payment confirmed. Received %s %s',
$data['amount_received'],
$data['currency']
));
break;
case 'expired':
$order->update_status('cancelled', 'Crypto payment expired');
break;
case 'underpaid':
$order->update_status('on-hold', sprintf(
'Underpayment: expected %s, received %s',
$data['amount_expected'],
$data['amount_received']
));
break;
}
status_header(200);
exit('OK');
}
}
// Регистрация gateway
add_filter('woocommerce_payment_gateways', function($gateways) {
$gateways[] = 'WC_Crypto_Gateway';
return $gateways;
});
Регистрация плагина
// crypto-payment-gateway.php (в wp-content/plugins/)
/**
* Plugin Name: Crypto Payment Gateway
* Description: Custom cryptocurrency payment gateway
* Version: 1.0.0
* Requires Plugins: woocommerce
*/
if (!defined('ABSPATH')) exit;
add_action('plugins_loaded', function() {
if (!class_exists('WC_Payment_Gateway')) return;
require_once plugin_dir_path(__FILE__) . 'includes/class-wc-crypto-gateway.php';
});
Обработка edge cases
Курсовая разница: между созданием заказа и оплатой проходит 10–20 минут. За это время курс может измениться. Решение: фиксируем крипто-сумму в момент создания заказа, устанавливаем время жизни заявки (15–20 минут), после истечения пересчитываем по текущему курсу.
Частичная оплата: пользователь отправил меньше чем нужно. Статус on-hold, ручная обработка менеджером. Альтернатива — держать средства и предложить доплатить.
Двойная обработка webhook: webhook может прийти дважды. Проверяем _crypto_payment_id перед изменением статуса — если заказ уже completed, не меняем.
Тестирование
Обязательно тестируем в sandbox режиме с реальными сценариями:
- Успешная оплата полной суммы
- Истечение времени заказа
- Недоплата
- Дублирующий webhook
WooCommerce имеет удобный инструмент — WC_Logger:
$logger = wc_get_logger()
$logger->debug('Webhook received', ['source' => 'crypto-gateway', 'data' => $data])
Логи доступны в WooCommerce → Status → Logs.
Что входит в работу
- Выбор и настройка платёжного провайдера или разработка кастомного gateway
- Реализация WooCommerce payment gateway класса
- Webhook обработчик с верификацией подписи
- Обработка всех статусов заказа и edge cases
- Тестирование в sandbox окружении







