Інтеграція крипто-платежів в 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 для согласованості
$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 оточенні







