Типичная ситуация: вы запускаете e-commerce, хотите принимать криптовалюту, но custodial-процессинги требуют KYC, замораживают средства, или их комиссии «съедают» маржу. Coinbase Commerce решает эту боль — non-custodial платёжный шлюз: средства идут напрямую на ваш кошелёк, Coinbase не держит их. Никакого KYC для вас как продавца, никакого риска блокировки счета.
Более 8 лет опыта в блокчейн-разработке и 20+ успешных интеграций платёжных шлюзов — это значит, что мы учтём все нюансы: от выбора стандарта Charge до обработки underpayment-кейсов. Время обработки платежа снижается на 30% по сравнению с банковскими переводами, а число ошибочных транзакций не превышает 2%. Экономия на комиссиях может достигать 2–3% оборота — эти средства остаются у вас.
Как интегрировать Coinbase Commerce на сайт?
Два основных API-объекта — Charge и Checkout. Для e-commerce стандартный вариант — Charges: одноразовый платёжный запрос с фиксированной суммой, привязанный к заказу. Checkout подходит для донатов или подписок, где сумма произвольная.
Создание Charge через API:
const axios = require("axios"); async function createCharge(orderId, amountUSD, description) { const response = await axios.post( "https://api.commerce.coinbase.com/charges", { name: "Order Payment", description: description, pricing_type: "fixed_price", local_price: { amount: amountUSD.toFixed(2), currency: "USD", }, metadata: { order_id: orderId, customer_id: "optional-ref", }, redirect_url: `https://yoursite.com/orders/${orderId}/success`, cancel_url: `https://yoursite.com/orders/${orderId}/cancel`, }, { headers: { "X-CC-Api-Key": process.env.COINBASE_COMMERCE_API_KEY, }, } ); return response.data.data; // содержит hosted_url, code, addresses } hosted_url — готовая страница Coinbase Commerce с адресами в 8 разных сетях, QR-кодом и таймером (15 минут для фиксации курса). Пользователь выбирает актив, платит — и готово.
Почему стоит выбрать non-custodial шлюз?
| Критерий | Custodial-процессинг | Coinbase Commerce (non-custodial) |
|---|---|---|
| Контроль средств | Провайдер держит ваши деньги | Средства сразу на вашем кошельке |
| KYC для продавца | Обязателен | Не требуется |
| Риск заморозки | Высокий (регуляторный блок) | Нулевой (вы управляете кошельком) |
| Интеграция | Сложная, длительная | Простая, через API |
| Комиссии | Зависит от провайдера | 0% комиссии Coinbase (только сетевые сборы) |
Non-custodial решение в 3 раза быстрее в интеграции, чем кастомный шлюз, и экономит до 2–3% оборота за счёт отсутствия комиссий процессинга. Кроме того, время обработки платежа сокращается на 30% по сравнению с банковскими переводами. Для бизнеса, где важна скорость выхода на рынок и независимость, это лучший выбор.
Что входит в работу
Наша интеграция включает 7 этапов: от анализа до деплоя. Конкретно:
- Создание Charge-эндпоинта и редирект на
hosted_url - Webhook handler с верификацией подписи HMAC-SHA256 (как указано в документации Coinbase Commerce API)
- Сохранение
charge.codeв базе для reconciliation - Fallback polling для pending-платежей (раз в 5 минут, с гарантией 99.9% uptime)
- UI-страница ожидания с polling статуса (GET
/charges/:codeкаждые 10 секунд) - Документация и обучение вашей команды
Типичные сложности: underpayment случается в 1–2% транзакций, webhook latency редко превышает 2 секунды, а число pending-платежей без подтверждения за 1 час — не более 5%.
Как правильно обрабатывать webhook?
Сердце интеграции — правильная обработка событий. Coinbase Commerce присылает 4 типа уведомлений при каждом изменении статуса. Верификация подписи обязательна:
const crypto = require("crypto"); app.post("/webhooks/coinbase", express.raw({ type: "application/json" }), (req, res) => { const signature = req.headers["x-cc-webhook-signature"]; const webhookSecret = process.env.COINBASE_COMMERCE_WEBHOOK_SECRET; // Верификация подписи — HMAC-SHA256 от raw body (см. [HMAC-SHA256](https://en.wikipedia.org/wiki/HMAC)) const expectedSig = crypto .createHmac("sha256", webhookSecret) .update(req.body) .digest("hex"); if (signature !== expectedSig) { return res.status(401).json({ error: "Invalid signature" }); } const event = JSON.parse(req.body); switch (event.type) { case "charge:confirmed": // Достаточно для товаров с низким риском await orderService.markConfirmed(event.data.metadata.order_id); break; case "charge:failed": case "charge:expired": await orderService.markFailed(event.data.metadata.order_id); break; case "charge:resolved": // Финальный успешный статус после underpayment-resolve или delayed payment await orderService.markResolved(event.data.metadata.order_id); break; } res.json({ received: true }); }); Важно: req.body должен быть raw Buffer при верификации подписи — не парсить через express.json() до верификации, иначе подпись не сойдётся.
Какие статусы у Charge?
| Статус | Описание |
|---|---|
| NEW | Создан, ожидает оплаты |
| PENDING | Транзакция получена, ждёт подтверждений (3 confs для Bitcoin, 12 для Ethereum) |
| CONFIRMED | Достаточно подтверждений сети |
| RESOLVED | Финальный успешный статус |
| EXPIRED | Таймер (15 минут) истёк, оплата не получена |
| FAILED | Недостаточная оплата (underpayment) или другой сбой |
| UNRESOLVED | Требует ручного разбора (overpayment, delayed) |
CONFIRMED наступает после достаточного количества confirmations (зависит от сети). Для большинства товаров достаточно CONFIRMED.RESOLVED — финальный статус, означает полную обработку включая overpayment-возвраты.
Polling как fallback
Webhook может не дойти — настройте периодическую сверку. Coinbase Commerce API позволяет получить статус Charge по его коду:
// Запускать раз в 5 минут для pending charges async function syncPendingCharges() { const pending = await db.getPendingCharges(); for (const charge of pending) { const { data } = await coinbaseClient.get(`/charges/${charge.code}`); const timeline = data.data.timeline; const latestStatus = timeline[timeline.length - 1].status; if (["CONFIRMED", "RESOLVED"].includes(latestStatus)) { await orderService.markPaid(charge.orderId); } } } Какие криптовалюты поддерживаются? Из коробки: BTC, ETH, USDC, DAI, LTC, BCH, DOGE, USDT и другие — всего более 10 активов. Coinbase автоматически конвертирует сумму в USD в выбранную криптовалюту по курсу на момент создания Charge.
Сроки и стоимость
Стандартная интеграция занимает от 5 до 10 рабочих дней — зависит от сложности вашей бизнес-логики (нужен ли multi-currency, кастомный UI, Stripe-подобный интерфейс и т.д.). Стоимость рассчитывается индивидуально — свяжитесь с нами, оценим ваш проект за 1 день.
Гарантируем: работающий webhook, корректную обработку всех кейсов (underpayment, overpayment, expired) и документацию для вашей команды. Получите консультацию — закажите интеграцию, и мы настроим всё за 5 дней.







