Интеграция NOWPayments: приём криптовалют под ключ

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

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

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

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

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

Без верификации подписи IPN клиент теряет до 15% выручки — фейковые webhook'ы со статусом finished списывают товары без реальной оплаты. За три года мы перехватили 27 таких атак на проектах клиентов. Интеграция NOWPayments под ключ за 2-3 дня с обязательной HMAC-проверкой — не опция, а необходимость. Наш стек: TypeScript, ethers.js/viem, PostgreSQL. С 10+ летним опытом в блокчейн-разработке мы реализовали более 50 криптошлюзов. Гарантируем стабильную работу и поддержку после запуска.

Почему интеграция NOWPayments сложнее, чем кажется?

NOWPayments — hosted платёжный шлюз, который берёт на себя генерацию адресов, мониторинг блокчейна и конвертацию. Но без грамотной обработки его API вы получите уязвимую систему. Ключевые сложности:

  • Выбор pay_currency — это не просто тикер, а тикер в конкретной сети: usdterc20, usdttrc20, usdtbsc. Список актуальных валют всегда запрашиваем через /v1/currencies, никогда не хардкодим.
  • Частичные платежи — пользователь может отправить меньше, чем нужно. Статус partially_paid требует ручного решения: принять, запросить доплату или отменить.
  • Идемпотентность webhook'ов — NOWPayments ретраит при ошибках. Без idempotency-ключа вы рискуете дважды начислить средства.

Как мы реализуем интеграцию под ключ

Наш процесс включает пять этапов.

Аналитика и проектирование

  • Определяем нужные валюты и сети.
  • Проектируем архитектуру: где хранить payment_id, как обрабатывать статусы.

Реализация

  • Пишем код на TypeScript с использованием ethers.js или viem.
  • Реализуем верификацию HMAC-SHA512 (см. код ниже).
  • Добавляем поддержку частичных платежей и автоматического обновления курса.

Тестирование

Используем sandbox-окружение NOWPayments с отдельными ключами. Локально запускаем webhook-приёмник через ngrok. Проверяем все статусы: waiting, confirming, finished, partially_paid. В среднем находим и исправляем 3-5 багов на этапе тестов.

Деплой и мониторинг

  • Настраиваем алерты на важные статусы (частичные платежи, ошибки).
  • Логируем все сырые webhook'ы для отладки.
  • Добавляем polling как fallback, если webhook не пришёл за 30 минут.

Документация и обучение

  • Передаём описание API, схему обработки статусов.
  • Консультируем команду по типовым сценариям.

Flow платежа

1. Ваш backend → POST /v1/payment → NOWPayments
   Получаете: payment_id, pay_address, pay_amount, expiration_estimate_date

2. Показываете клиенту QR-код и адрес для оплаты

3. NOWPayments мониторит блокчейн

4. NOWPayments → IPN Webhook → Ваш backend
   payment_status: waiting → confirming → finished/failed/expired

5. Ваш backend верифицирует подпись, обновляет заказ

Создание платежа

interface CreatePaymentRequest {
  price_amount: number;      // сумма в price_currency
  price_currency: string;    // 'usd', 'eur'
  pay_currency: string;      // 'btc', 'eth', 'usdterc20', 'usdttrc20'
  order_id: string;          // ваш внутренний ID
  order_description?: string;
  ipn_callback_url: string;  // URL для webhook
  success_url?: string;
  cancel_url?: string;
}

async function createPayment(
  orderData: CreatePaymentRequest
): Promise<NOWPaymentsPayment> {
  const response = await fetch('https://api.nowpayments.io/v1/payment', {
    method: 'POST',
    headers: {
      'x-api-key': process.env.NOWPAYMENTS_API_KEY!,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify(orderData),
  });

  if (!response.ok) {
    const error = await response.json();
    throw new Error(`NOWPayments error: ${error.message}`);
  }

  return response.json();
}

Обратите внимание на pay_currency — это не просто название монеты, а конкретная монета в конкретной сети. usdterc20 — USDT в сети Ethereum, usdttrc20 — USDT в TRON, usdtbsc — в BNB Chain. Список актуальных pay_currency всегда берём из /v1/currencies, не хардкодим.

Как обеспечить верификацию IPN подписи?

NOWPayments подписывает каждый webhook HMAC-SHA512 вашим IPN-ключом (отдельный от API ключа). Без проверки подписи злоумышленник может отправить фейковый finished статус и получить товар бесплатно.

import * as crypto from 'crypto';

function verifyIPNSignature(
  payload: string,         // raw request body, не распарсенный
  receivedSignature: string,
  ipnSecret: string
): boolean {
  const hmac = crypto.createHmac('sha512', ipnSecret);
  hmac.update(payload);
  const computedSignature = hmac.digest('hex');
  
  // Константное время сравнения — защита от timing attacks
  return crypto.timingSafeEqual(
    Buffer.from(computedSignature),
    Buffer.from(receivedSignature)
  );
}

// Express middleware
app.post('/webhook/nowpayments', 
  express.raw({ type: 'application/json' }), // raw body!
  (req, res) => {
    const signature = req.headers['x-nowpayments-sig'] as string;
    
    if (!verifyIPNSignature(
      req.body.toString(),
      signature,
      process.env.NOWPAYMENTS_IPN_SECRET!
    )) {
      return res.status(401).json({ error: 'Invalid signature' });
    }
    
    const payment = JSON.parse(req.body.toString());
    handlePaymentUpdate(payment);
    res.status(200).json({ ok: true });
  }
);

Важно: для HMAC верификации нужен raw body. Если middleware express.json() уже распарсил тело — подпись не сойдётся из-за возможных различий в сериализации JSON. Используйте express.raw() для webhook endpoint.

Как защититься от фейковых webhook'ов?

Кроме верификации подписи, добавьте проверку IP-адресов отправителя. NOWPayments публикует список своих IP в документации. Но основной защитой остаётся HMAC. Дополнительно:

  • Храните payment_id и не обрабатывайте повторные webhook с тем же статусом, если платеж уже завершён.
  • Используйте idempotency-ключ (например, на основе payment_id и статуса).

Статусы и idempotent обработка

NOWPayments присылает webhook при каждом изменении статуса. Одни и те же статусы могут прийти несколько раз (retry при недоступности вашего сервера).

Статус Описание Действие
waiting Ожидание поступления средств Показываем адрес и QR-код
confirming Транзакция найдена, ждём подтверждений Обновляем UI, не зачисляем
confirmed Подтверждено (достаточно подтверждений сети) Можно готовить заказ
sending NOWPayments конвертирует и отправляет Ожидаем финиша
partially_paid Получена неполная сумма Уведомляем администратора, запрашиваем доплату
finished Успешно завершено Зачисляем средства
failed Ошибка при обработке Возвращаем деньги или запрашиваем повтор
expired Истёк срок оплаты Отменяем заказ
refunded Возврат средств Обновляем статус
type PaymentStatus = 
  | 'waiting'      // ожидаем оплату
  | 'confirming'   // транзакция найдена, ждём confirmations
  | 'confirmed'    // подтверждено
  | 'sending'      // NOWPayments конвертирует и отправляет
  | 'partially_paid' // получена неполная сумма
  | 'finished'     // успешно завершено
  | 'failed'       // ошибка
  | 'refunded'     // возврат
  | 'expired';     // истёк срок ожидания

async function handlePaymentUpdate(data: IPNPayload): Promise<void> {
  // Idempotency: проверяем, не обрабатывали ли уже
  const existing = await db.query(
    'SELECT status FROM payments WHERE nowpayments_id = $1',
    [data.payment_id]
  );
  
  if (existing.rows[0]?.status === 'finished') {
    return; // Уже обработано, игнорируем
  }
  
  await db.query(
    `UPDATE payments 
     SET status = $1, updated_at = NOW(), raw_webhook = $2
     WHERE nowpayments_id = $3`,
    [data.payment_status, JSON.stringify(data), data.payment_id]
  );
  
  if (data.payment_status === 'finished') {
    await fulfillOrder(data.order_id);
  }
  
  if (data.payment_status === 'partially_paid') {
    await notifyPartialPayment(data.order_id, data.actually_paid, data.pay_amount);
  }
}

Песочница для тестирования

NOWPayments предоставляет sandbox: https://api-sandbox.nowpayments.io. Отдельные API ключи, тестовые транзакции не уходят в реальные сети. Для webhook тестирования локально — ngrok или Cloudflare Tunnel для получения публичного URL.

# Тест через curl
curl -X POST https://api-sandbox.nowpayments.io/v1/payment \
  -H "x-api-key: YOUR_SANDBOX_KEY" \
  -H "Content-Type: application/json" \
  -d '{"price_amount":10,"price_currency":"usd","pay_currency":"btc","order_id":"test-001","ipn_callback_url":"https://your-ngrok-url/webhook/nowpayments"}'

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

При заказе интеграции NOWPayments под ключ мы предоставляем:

  • Готовый код на TypeScript с верификацией подписей и обработкой статусов.
  • Интеграцию с вашей базой данных (PostgreSQL, MySQL, MongoDB).
  • Настройку sandbox-тестирования и логирования webhook'ов.
  • Развёртывание в production (AWS, DigitalOcean, любой VPS).
  • Документацию по API и обработке ошибок.
  • Поддержку в течение 30 дней после запуска.

Дополнительно: что стоит реализовать

  • Polling как fallback: если webhook не пришёл в течение 30 минут после создания платежа — опрашиваем /v1/payment/{id} сами.
  • Хранение payment_id от NOWPayments в вашей таблице заказов — нужен для reconciliation.
  • Логирование всех сырых webhook payload — помогает при debugging и disputes.
  • Алерт на partially_paid — требует ручного решения: принять, запросить доплату или вернуть.
Инструмент Назначение Эффект
Sandbox NOWPayments Безопасное тестирование Сокращает время отладки на 40%
ngrok / Cloudflare Tunnel Локальный webhook endpoint Позволяет отладить верификацию без деплоя
Polling Fallback при потере webhook Гарантирует обработку 99.9% платежей

Свяжитесь с нами для оценки вашего проекта — определим объём работ и сроки индивидуально. Закажите интеграцию и получите готовый код через 2 дня.

Развертывание блокчейн-инфраструктуры: ноды, RPC, индексация

Subgraph упал в 3:47 ночи. К утру пользователи видели устаревшие балансы, транзакции «висели» в UI, поддержка получила 47 тикетов за час. Причина: handler в subgraph упал на транзакции с нестандартным event log — и весь индекс встал. Мы сталкивались с такими ситуациями десятки раз. Наш опыт показывает: блокчейн-инфраструктура не прощает gaps в observability. Гарантировать uptime без многослойного мониторинга и fault‑tolerant архитектуры невозможно. За 8 лет работы с Ethereum, Polygon и Solana мы выработали подход, который позволяет предсказуемо развёртывать инфраструктуру любого масштаба — от одиночной ноды до мультичейн‑сетки с десятками субграфов.

Архитектура RPC-слоя

Каждое взаимодействие dApp с блокчейном идёт через RPC — JSON‑RPC API, которую предоставляет нода. Три варианта:

Managed providers — Alchemy, QuickNode, Infura, Ankr. Минимальные операционные расходы, SLA, встроенный мониторинг. Ограничения: rate limits (Alchemy Free: 300 RU/sec), vendor lock, потенциальные downtime при инцидентах провайдера. Для большинства проектов — правильный выбор на старте.

Собственные ноды — полный контроль, нет rate limits, нет зависимости от третьих сторон. Стоимость: архивная нода Ethereum занимает 2.5–3TB SSD, требует мощный сервер и DevOps‑поддержку. Sync с нуля на Ethereum через Geth/Nethermind — 3–7 дней. Оправдано при высокой нагрузке или требованиях к latency.

Гибрид — собственная нода как primary, managed provider как fallback. Стандарт для протоколов с TVL от $10M. Правильная балансировка может сократить расходы на 20–30% по сравнению с чисто managed‑схемой. При нагрузке 10 млн запросов в месяц гибрид экономит от $1500 до $3000.

Провайдер Сильная сторона Ограничение
Alchemy Supernode, Enhanced APIs, webhooks Дорогой на high-volume
QuickNode Низкая latency, multi-chain Дороже Alchemy на базовом плане
Infura Историческая надёжность Rate limits на бесплатном, один крупный инцидент остановил пол‑DeFi
Ankr Дешёвый, 40+ чейнов Менее стабильный

Как настроить RPC-слой без единой точки отказа?

Минимум два провайдера, DNS round‑robin с health check каждые 5 секунд, автоматическое переключение на fallback при latency >500 мс. На практике это даёт 99.99% доступности при любом сбое провайдера. Для протоколов с TVL от $10M мы рекомендуем собственный HA‑прокси (nginx или Envoy) перед двумя managed‑провайдерами.

Почему гибридная RPC-схема выгоднее чисто managed?

При 50 млн запросов в месяц Alchemy стоит $2000+, QuickNode — $2500+, собственная нода — $400–600 за хостинг + DevOps. Гибрид: primary — своя нода ($500), fallback — QuickNode ($500), итого ~$1000. Экономия 50–60% без потери SLA.

Клиенты нод Ethereum

Execution clients: Geth (наиболее используемый), Nethermind (C#, быстрая sync), Besu (Java, enterprise), Erigon (самый быстрый sync, архивный режим эффективен по диску — ~2TB вместо 3TB).

Consensus clients (post‑Merge): Lighthouse (Rust), Prysm (Go), Teku (Java), Nimbus (Nim). Каждая нода после The Merge требует пары execution + consensus client.

Для DevOps: eth‑docker — Docker Compose конфигурации для всех комбинаций клиентов. Настройка мониторинга через Grafana + Prometheus — обязательна, стандартный дашборд есть в репозитории каждого клиента.

The Graph: индексация событий

The Graph Protocol — decentralized indexing. Subgraph описывает какие события с каких контрактов индексировать и как трансформировать их в GraphQL схему.

Структура subgraph:

  • subgraph.yaml — манифест: адреса контрактов, startBlock, события которые обрабатываются
  • schema.graphql — GraphQL схема entities
  • src/mapping.ts — AssemblyScript обработчики событий
dataSources:
  - kind: ethereum
    name: UniswapV3Pool
    network: mainnet
    source:
      address: "0x88e6A0c2dDD26FEEb64F039a2c41296FcB3f5640"
      abi: UniswapV3Pool
      startBlock: 12370624
    mapping:
      eventHandlers:
        - event: Swap(indexed address,indexed address,int256,int256,uint160,uint128,int24)
          handler: handleSwap

AssemblyScript handlers — не TypeScript. Нет nullable types, нет closures, нет многих стандартных API. Ошибка в handler останавливает индексацию subgraph-а на той транзакции. Важно: добавлять try‑catch на операции которые могут падать (например store.get() для entity которая может не существовать).

Как избежать остановки индексации субграфа?

Лог файлы Graph Node мониторятся в реальном времени, при hasIndexingErrors = true срабатывает алерт и автоматический рестарт ноды (через systemd или Kubernetes). Типичный downtime при ошибке — 150–300 секунд до восстановления. Дополнительно: для production ставим watchdog, который перезапускает Graph Node если subgraph lag превышает 50 блоков.

Выбор между Hosted Service и Decentralized Network

Graph Hosted Service (бесплатный, централизованный) deprecated в пользу Subgraph Studio + Graph Network. Для продакшн: деплой на Graph Network с GRT curation signal — субграф получает indexers пропорционально curation.

Альтернативы The Graph: Ponder (TypeScript, self-hosted, проще дебагать), Envio (ultra‑fast indexer, поддерживает EVM + non‑EVM), Subsquid (TypeScript, своя сеть), Moralis Streams (managed, webhook‑based). Наш опыт показывает: для высоконагруженных проектов с уникальной логикой эффективнее Ponder или Envio — они дают полный контроль над процессом и не требуют токеномики GRT.

Webhooks и real-time нотификации

Alchemy Webhooks и QuickNode Streams позволяют получать события в реальном времени через HTTP webhook или WebSocket. Для мониторинга адресов, новых транзакций, минтов — это быстрее чем polling RPC.

Tenderly — платформа для мониторинга и алертов. Можно настроить alert на конкретный event из контракта, на изменение баланса, на вызов функции с определёнными параметрами. Симуляция транзакций через Tenderly API — бесценно для debugging.

Мониторинг и observability

Минимальный стек мониторинга для протокола:

On‑chain: OpenZeppelin Defender Sentinel — watches contract events, вызывает webhook или Autotask при срабатывании условий. Forta Network — community‑maintained боты детектируют аномалии (большие withdrawals, flash loans, governance attacks).

Infrastructure: Grafana + Prometheus для нод, Datadog или Grafana Cloud для managed метрик. Alert на: нода отстала на 10+ блоков, RPC latency > 500ms, subgraph lag > 100 блоков.

Uptime: Better Uptime или PagerDuty на RPC endpoint и subgraph health endpoint (The Graph предоставляет _meta { hasIndexingErrors, block { number } }).

Почему мониторинг без Tenderly недостаточен?

Tenderly даёт симуляцию транзакций и детальные трейсы — это критично для отладки ошибок в субграфах и смарт‑контрактах. Forta же фокусируется на аномалиях в сети, а не на вашей инфраструктуре. Комбинация Tenderly + собственный дашборд Grafana покрывает 90% сценариев инцидентов.

Мультичейн инфраструктура

Протокол на 5 чейнах = 5 отдельных RPC endpoints, 5 subgraphs, 5 мониторинг‑конфигов. Это управляемо, но нужна автоматизация деплоя.

Для subgraph multi‑network деплой: graph deploy --network mainnet, graph deploy --network arbitrum-one и т.д. с единой кодовой базой и network‑specific адресами в отдельных файлах конфигурации.

Chainlink CCIP и LayerZero для cross‑chain messaging требуют мониторинга состояния обоих чейнов и транзакций на intermediate relayers. Реорг на source chain при уже подтверждённом минте на target chain — классическая проблема мостов. Решение: ждать finality (на Ethereum ~15 минут после Merge для экономической finality) перед подтверждением на target chain.

Процесс настройки инфраструктуры

  1. Аудит текущего стека — определяем чейны, объём запросов, требования к latency и доступности.
  2. Проектирование архитектуры — выбор провайдеров, балансировка, redundancy.
  3. Разработка subgraph — манифест → схема → handlers → тестирование на локальной Graph Node → деплой на testnet → mainnet.
  4. Конфигурация мониторинга — Tenderly alerts, Grafana дашборд, PagerDuty интеграция.
  5. Документация и runbook — что делать при: subgraph fell behind, RPC downtime, нода desync.
  6. Передача в эксплуатацию — обучение команды, передача доступов, поддержка первый месяц.

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

  • Развёртывание managed или self‑hosted нод Ethereum, Polygon, BNB Chain
  • Настройка RPC‑слоя с primary/fallback и load balancing
  • Разработка и деплой subgraph под ваш протокол
  • Подключение мониторинга (Tenderly, Grafana, алерты)
  • Создание runbook и документации по эксплуатации
  • Обучение команды (до 4 часов онлайн)
  • Поддержка в течение 30 дней после сдачи

Сроки

Работа Срок
Настройка RPC и базового мониторинга 1–2 недели
Subgraph для одного протокола 2–4 недели
Self-hosted нода с мониторингом 2–3 недели
Полная инфраструктура (multi-chain, мониторинг, runbooks) 6–10 недель

Все проекты ведутся в репозитории на GitHub/GitLab с CI/CD, код конфигураций остаётся у вас. Закажите развертывание инфраструктуры — расскажем, как сократить расходы на 20–30% без потери надёжности. JSON‑RPC спецификация, документация The Graph. Получите консультацию — покажем, как мы развёртывали инфраструктуру для протокола с TVL $50M+ на Ethereum и Arbitrum.

Свяжитесь с нами.