Інтеграція крипто-платіжного шлюзу на сайт
Типова задача: є робочий сайт з кошиком і звичайним еквайрингом, потрібно додати оплату крипто-валютою. Головна помилка тут — робити це самостійно "з нуля": генерувати адреси, слухати транзакції, обробляти confirmations. Для більшості e-commerce проектів це надлишково і створює операційне навантаження. Правильний підхід — використовувати готовий процесинг (Coinbase Commerce, NOWPayments, CryptoPay, BTCPay Server) і інтегрувати його через webhook.
Вибір процесингу
| Рішення | Custody | Комісія | Self-hosted | Підходить для |
|---|---|---|---|---|
| Coinbase Commerce | Non-custodial | 1% | Ні | Швидкий старт, USD-ринок |
| NOWPayments | Custodial (авто-конвертація) | 0.5–1% | Ні | Багато монет, авто-конвертація в fiat |
| BTCPay Server | Non-custodial | 0% | Так | Повний контроль, тільки BTC/LN |
| CoinGate | Custodial | 1% | Ні | E-commerce плагіни |
| Чистий кастом | Non-custodial | 0% | — | Висока нагрузка, особливі вимоги |
Для більшості сайтів оптимально: NOWPayments (широкий список монет, авто-конвертація в USDT/USDC) або Coinbase Commerce (якщо аудиторія переважно американська).
Схема інтеграції
Базовий flow через будь-який процесинг однаковий:
- Користувач натискає "Оплатити крипто-валютою"
- Бекенд вашого сайту створює invoice через API процесингу
- Користувач отримує адресу і суму до оплати
- Процесинг моніторить блокчейн і уведомлює ваш бекенд через webhook
- Бекенд верифікує webhook, помічає замовлення як оплачене
Приклад: NOWPayments
# Створення платежу
curl -X POST https://api.nowpayments.io/v1/payment \
-H "x-api-key: YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"price_amount": 99.99,
"price_currency": "usd",
"pay_currency": "eth",
"order_id": "ORDER-12345",
"ipn_callback_url": "https://yoursite.com/api/crypto-webhook"
}'
Ответ містить pay_address, pay_amount (в ETH за поточним курсом), payment_id. Показуєте користувачу адресу і суму, опціонально — QR-код.
Обробка webhook (критично важливо)
Webhook не можна приймати наївно — потрібна верифікація підпису:
// PHP приклад для NOWPayments
public function handleWebhook(Request $request): JsonResponse
{
$payload = $request->getContent();
$signature = $request->header('x-nowpayments-sig');
// Верифікація HMAC-SHA512
$expected = hash_hmac(
'sha512',
$this->sortPayload($payload),
config('services.nowpayments.ipn_secret')
);
if (!hash_equals($expected, $signature)) {
return response()->json(['error' => 'Invalid signature'], 401);
}
$data = json_decode($payload, true);
// Обробляємо лише фінальні статуси
if ($data['payment_status'] === 'finished') {
$this->orderService->markAsPaid($data['order_id'], [
'tx_hash' => $data['outcome_hash'],
'amount_paid' => $data['actually_paid'],
'currency' => $data['pay_currency'],
]);
}
return response()->json(['status' => 'ok']);
}
Статуси, які потрібно обробляти: waiting → confirming → confirmed → sending → finished. Статус failed і expired — окрема логіка (розблокувати товар, уведомити користувача).
Underpayment і курсові ризики
Користувачі часто платять чуть менше необхідного (забули про gas, округлили). Потрібна явна політика: допустиме відхилення ±1–2%, або вимога доплати. NOWPayments має параметр is_fixed_rate — фіксує курс на 20 хвилин, поки користувач оплачує. Це зменшує курсові ризики для обох сторін.
Що потрібно реалізувати на стороні сайту
- Endpoint створення платежу (POST /api/create-crypto-payment)
- Webhook handler з верифікацією підпису
- Сторінка очікування з polling статусу платежу (раз в 10–15 сек)
- Обробка істеклих платежів (timeout 15–60 хв залежно від мережі)
- Логування всіх webhook подій для reconciliation
Повна інтеграція з нуля до production займає 2–3 дні з урахуванням тестування на testnet/sandbox і edge cases.







