Разработка callback/webhook уведомлений о платежах

Вы интегрируете криптоплатежи, но блокчейн не может сам уведомить ваш бэкенд. Приходится опрашивать ноду каждые 12 секунд — это 7200 RPC-запросов в час на один адрес. Для 1000 активных пользователей нагрузка вырастает до 7.2 млн запросов за час, что выливается в десятки тысяч долларов ежемесячно и з

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

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

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

  • 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

Вы интегрируете криптоплатежи, но блокчейн не может сам уведомить ваш бэкенд. Приходится опрашивать ноду каждые 12 секунд — это 7200 RPC-запросов в час на один адрес. Для 1000 активных пользователей нагрузка вырастает до 7.2 млн запросов за час, что выливается в десятки тысяч долларов ежемесячно и задержки до 30 секунд. А при перегрузке сети, как во время популярного mint'а, вы гарантированно теряете транзакции.

Webhook решает проблему: блокчейн-мониторинг сам отправляет HTTP-запрос на ваш сервер, когда происходит событие. Задержка снижается до 2–5 секунд, нагрузка на бэкенд падает на 95%. Мы построили десятки таких систем и знаем, как сделать их надежными.

Почему webhook лучше polling для криптоплатежей?

Polling — это постоянные RPC-запросы к ноде. Каждый запрос стоит денег и создает нагрузку. Webhook — push-модель: вы получаете уведомление сразу после включения транзакции в блок. Задержка минимальна, нагрузка на сервер снижается в разы. Для high-load проектов это единственный рабочий вариант. Например, одна наша клиентская биржа после перехода с polling на webhook сократила расходы на инфраструктуру на 40% и уменьшила среднее время подтверждения платежа с 15 до 3 секунд.

Как мы строим систему webhook-уведомлений

Используем проверенную архитектуру: мониторинг блокчейна → диспетчер webhook → ваша очередь задач. Мониторинг можно реализовать через сторонние сервисы (Alchemy Notify, Moralis Streams, QuickNode Streams) или собственный слушатель ноды. Мы обычно выбираем Alchemy за простоту и надежность. Вот пример создания webhook:

// Создание webhook через Alchemy API const response = await fetch('https://dashboard.alchemy.com/api/create-webhook', { method: 'POST', headers: { 'X-Alchemy-Token': process.env.ALCHEMY_AUTH_TOKEN!, 'Content-Type': 'application/json', }, body: JSON.stringify({ network: 'ETH_MAINNET', webhook_type: 'ADDRESS_ACTIVITY', webhook_url: 'https://yourapp.com/webhooks/crypto', addresses: ['0xYourAddress'], }), }) 

Как обеспечить идемпотентность обработки webhook?

Webhook-провайдеры гарантируют доставку at-least-once. Ваш обработчик должен быть идемпотентным — повторные уведомления не должны дублировать платежи. Мы используем INSERT ... ON CONFLICT DO NOTHING:

async function processPaymentWebhook(txHash: string, address: string, amountWei: bigint) { const result = await db.query(` INSERT INTO processed_webhooks (tx_hash, processed_at) VALUES ($1, NOW()) ON CONFLICT (tx_hash) DO NOTHING RETURNING id `, [txHash]) if (result.rowCount === 0) { return // уже обработано } await updatePaymentStatus(address, amountWei, txHash) } 

Retry-механизм для исходящих webhook

Если ваш сервис сам уведомляет клиентов через webhook, нужен надежный механизм повторных попыток. Мы используем экспоненциальный backoff с 10 попытками и фиксацией в dead letter queue. Пример обработки:

interface WebhookDelivery { id: string url: string payload: object attempt: number nextRetryAt: Date } async function deliverWebhook(delivery: WebhookDelivery): Promise<void> { try { const res = await fetch(delivery.url, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Webhook-Signature': signPayload(delivery.payload), 'X-Webhook-ID': delivery.id, 'X-Webhook-Attempt': String(delivery.attempt), }, body: JSON.stringify(delivery.payload), signal: AbortSignal.timeout(10_000), }) if (!res.ok) { throw new Error(`HTTP ${res.status}`) } await db.markDelivered(delivery.id) } catch (err) { const nextAttempt = delivery.attempt + 1 if (nextAttempt > 10) { await db.markFailed(delivery.id, String(err)) return } const delayMs = Math.min(30_000 * Math.pow(2, nextAttempt - 1), 3_600_000) await db.scheduleRetry(delivery.id, nextAttempt, new Date(Date.now() + delayMs)) } } 

Схема retry: 10 попыток с экспоненциальным backoff достаточно для 99.7% доставок. Финальный провал — уведомить разработчиков через PagerDuty или Telegram, сохранить в dead letter queue.

Сравнение провайдеров мониторинга блокчейна

Провайдер Тип уведомлений Количество адресов Масштабируемость
Alchemy Notify ADDRESS_ACTIVITY, MINED_TRANSACTION до 10 бесплатно Высокая, SLA 99.9%
Moralis Streams Все события без ограничений (тарифно) Средняя, задержка до 10 сек
QuickNode Streams ADDRESS_ACTIVITY, CONTRACT_EVENT по запросу Высокая, кастомные SLA

Мы рекомендуем Alchemy для старта — он лучше документирован и стабилен. В среднем мы используем его в 70% проектов.

Типичные события webhook и их обработка

Событие Payload (упрощенно) Типичная обработка
ADDRESS_ACTIVITY txHash, адрес, сумма, блок Зачислить платеж, обновить баланс
MINED_TRANSACTION txHash, статус, газ Обновить статус транзакции в БД
CONTRACT_EVENT event.name, params, txHash Вызвать соответствующую бизнес-логику

Такая таблица помогает разработчикам быстро понять, какие данные приходят и что с ними делать.

Что делать при падении обработчика webhook?

Блокчейн-провайдеры не хранят события бесконечно. Если ваш endpoint упал, вы рискуете потерять уведомления. Поэтому мы проектируем систему с очередью задач (RabbitMQ, Redis, или Kafka) сразу за endpoint'ом. Если обработка падает, очередь сохраняет сообщение и повторяет попытку. Дополнительно мы настраиваем мониторинг: если очередь растет более 1000 необработанных задач — отправляем алерт. Это гарантирует, что ни один платеж не потеряется даже при сбое базы данных или сети.

Процесс разработки

  1. Анализ требований: типы событий, количество адресов, SLA.
  2. Проектирование архитектуры: выбор провайдера, схема данных, retry-политика.
  3. Реализация webhook endpoint с верификацией подписи и очередью.
  4. Разработка идемпотентного обработчика и retry-механизма.
  5. Интеграция с вашей платежной системой.
  6. Тестирование на тестовой сети (Goerli, Sepolia).
  7. Деплой и мониторинг (Grafana + Prometheus).

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

  • Документация по API webhook
  • Исходный код с комментариями
  • Инструкция по развертыванию
  • Тестовый стенд
  • Поддержка в течение месяца после запуска

Сроки и стоимость

Базовый webhook endpoint с верификацией и очередью можно сделать за 1 день. Полноценная система с retry, dead letter queue и дашбордом — 2–3 дня. Стоимость рассчитывается индивидуально под ваш проект. Оценим задачу за 24 часа — просто напишите нам. Получите консультацию инженера с 10-летним опытом в блокчейн-разработке.

Типичные ошибки

  • Не верифицировать подпись — любой может отправить фальшивый webhook.
  • Отвечать 200 после обработки — блокирует очередь, ухудшает пропускную способность.
  • Не использовать идемпотентность — начисление платежа дважды.
  • Игнорировать retry для исходящих webhook — потеря данных.

Наша команда гарантирует надежность и безопасность каждого решения. Мы реализовали более 50 интеграций платежных систем на webhook. Если вам нужна надежная система webhook-уведомлений — свяжитесь с нами.