Интеграция Coinbase Commerce для приёма криптовалют на сайте

Типичная ситуация: вы запускаете e-commerce, хотите принимать криптовалюту, но custodial-процессинги требуют KYC, замораживают средства, или их комиссии «съедают» маржу. Coinbase Commerce решает эту боль — non-custodial платёжный шлюз: средства идут напрямую на ваш кошелёк, Coinbase не держит их. Ни

Направления блокчейн-разработки

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1450
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1308
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1003
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1269
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    717
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    1008

Типичная ситуация: вы запускаете 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 дней.