Интеграция с CoinGate

Проектируем и разрабатываем блокчейн-решения полного цикла: от архитектуры смарт-контрактов до запуска DeFi-протоколов, NFT-маркетплейсов и криптобирж. Аудит безопасности, токеномика, интеграция с существующей инфраструктурой.
Показано 1 из 1Все 1306 услуг
Интеграция с CoinGate
Простой
~2-3 дня
Часто задаваемые вопросы

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

Этапы блокчейн-разработки

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

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

Интеграция с CoinGate

CoinGate — payment processor, который берёт на себя сложность работы с множеством блокчейнов: приём BTC, ETH, LTC, USDT и ~70 других монет, конвертация в EUR/USD, выплаты на банковский счёт или крипто-кошелёк. Вы не занимаетесь управлением ключами и мониторингом блокчейнов — CoinGate делает это за вас в обмен на комиссию (1% от транзакции).

Интеграция технически несложная, но есть несколько мест, где легко ошибиться.

API интеграция

CoinGate предоставляет REST API v2. Аутентификация — Bearer токен в заголовке. Тестовая среда: https://api-sandbox.coingate.com, production: https://api.coingate.com.

Создание заказа

const axios = require('axios')

const COINGATE_TOKEN = process.env.COINGATE_API_TOKEN

async function createCryptoOrder(params) {
  const { orderId, amount, currency, callbackUrl, successUrl, cancelUrl } = params
  
  const response = await axios.post(
    'https://api.coingate.com/v2/orders',
    {
      order_id: orderId,           // ваш внутренний ID
      price_amount: amount,        // сумма в price_currency
      price_currency: currency,    // EUR, USD, BTC и т.д.
      receive_currency: 'EUR',     // в чём получать выплату
      callback_url: callbackUrl,   // webhook для уведомлений
      success_url: successUrl,     // редирект после оплаты
      cancel_url: cancelUrl,
      title: `Order #${orderId}`,
      description: 'Payment for services'
    },
    {
      headers: {
        'Authorization': `Token ${COINGATE_TOKEN}`,
        'Content-Type': 'application/json'
      }
    }
  )
  
  return {
    coingate_id: response.data.id,
    payment_url: response.data.payment_url,  // URL куда редиректить пользователя
    status: response.data.status
  }
}

Поле order_id — ваш внутренний идентификатор, он вернётся в callback. Это ключевое поле для reconciliation.

Обработка callback (webhook)

CoinGate шлёт POST-запрос на callback_url при каждом изменении статуса заказа. Обязательна верификация подлинности запроса:

app.post('/webhooks/coingate', express.urlencoded({ extended: true }), async (req, res) => {
  // CoinGate шлёт form-encoded данные, не JSON
  const {
    id,           // CoinGate order ID
    order_id,     // ваш внутренний ID
    status,       // pending, confirming, paid, invalid, expired, canceled, refunded
    price_amount,
    price_currency,
    receive_currency,
    receive_amount,
    pay_amount,   // сколько криптовалюты получено
    pay_currency  // в какой монете заплатил пользователь
  } = req.body
  
  // Верификация через повторный запрос к API (нет подписи у CoinGate в стандартном API)
  const verified = await verifyCoinGateOrder(id, order_id)
  if (!verified) {
    return res.status(400).send('Verification failed')
  }
  
  switch (status) {
    case 'paid':
      await markOrderPaid(order_id, { pay_currency, pay_amount })
      break
    case 'invalid':
      // неверная сумма или другая проблема — требует ручной обработки
      await flagOrderForReview(order_id)
      break
    case 'expired':
      await cancelOrder(order_id)
      break
  }
  
  res.sendStatus(200)  // всегда отвечаем 200, иначе CoinGate будет повторять
})

async function verifyCoinGateOrder(coingateId, internalOrderId) {
  const response = await axios.get(
    `https://api.coingate.com/v2/orders/${coingateId}`,
    { headers: { 'Authorization': `Token ${COINGATE_TOKEN}` } }
  )
  return response.data.order_id === internalOrderId
}

Важно: CoinGate не добавляет HMAC-подпись к callback по умолчанию. Верификация через дополнительный GET-запрос к API — стандартная практика.

Статусы заказа

Статус Значение Действие
new Создан, ожидает оплаты Показываем пользователю payment_url
pending Транзакция в мемпуле Информируем пользователя
confirming Транзакция в блокчейне, ждём подтверждений Показываем прогресс
paid Подтверждено, средства получены Исполняем заказ
invalid Проблема с суммой или транзакцией Ручная обработка
expired Время оплаты истекло (дефолт: 20 минут) Предложить переоформить
canceled Отменён Освободить товар/услугу

Типичные проблемы

Underpayment: пользователь заплатил меньше из-за комиссий за перевод. CoinGate переводит заказ в invalid. Решение: в настройках CoinGate можно включить tolerance margin (обычно 1–2%).

Задержка callback: CoinGate иногда задерживает callback при нагрузке. Рекомендуется дополнительно поллить статус заказа каждые 30–60 секунд для заказов в состоянии confirming.

Тестирование: в sandbox среде используйте тестовые ключи и тестовые монеты. Sandbox имитирует реальные задержки подтверждений — тесты с мгновенным paid нужно делать через прямой вызов API sandbox с форсированным статусом.

Что входит в работу

  • Регистрация и настройка аккаунта CoinGate (настройка receive currency, KYC документация)
  • Реализация API клиента с созданием заказов
  • Webhook endpoint с верификацией и обработкой всех статусов
  • Интеграция с существующей системой заказов
  • Тестирование через sandbox окружение