Розробка callback/webhook-сповіщень про платежі

Платіж підтверджено на боці мережі, а замовлення у вашій системі так і не створено — подія загубилася дорогою. Ми налаштовуємо webhook криптоплатежів під ключ: сповіщення надходять вчасно, повтори підстрахують збій, а журнал покаже повну картину. Ви отримуєте передбачуваний прийом платежів замість ручного звіряння.
Часті запитання

Webhook криптоплатежів: де рветься ланцюжок подій

Ланцюжок подій від мережі до облікової системи рветься найчастіше не на боці блокчейну, а на боці отримувача. Гаманець фіксує підтвердження транзакції, сервіс-спостерігач формує подію й надсилає HTTP-колбек на адресу мерчанта.

Якщо адреса в цей момент недоступна, відповідає помилкою або таймаутом, подія переходить у повторні спроби, а вичерпавши їх — осідає в черзі необроблених. Для бізнесу це виглядає однаково: кошти в гаманці є, а замовлення в системі не оплачене.

Повторні доставки — друга точка відмови. Відправник, не дочекавшись підтвердження приймання, повторює запит; приймач без ключа ідемпотентності вважає його новою подією. Звідси задвоєні зарахування, повторні листи клієнту й два записи в обліку на одну транзакцію.

Закривається це зв'язкою «унікальний ідентифікатор події плюс атомарний запис статусу платежу разом із побічними ефектами».

Третя проблема — розбіжні статуси. Поки триває підтвердження транзакції, у мерчанта вже є власна шкала: створено, очікує, оплачено, скасовано. Перебудова ланцюжка або заміна транзакції відкочує підтвердження назад, а внутрішній статус залишається «оплачено».

Тут потрібне єдине джерело істини й перерахунок статусу за глибиною підтвердження, а не за фактом першого повідомлення.

Окремий шар — звірка: періодичне опитування за списком завислих платежів закриває події, які так і не дійшли, і виявляє розбіжності між мережею та внутрішнім обліком.

Розбираємо, як це закривається — від черги з повторною доставкою до ідемпотентного приймача й контролю розбіжностей.

Що змінюється після впровадження: швидкість, повнота, контроль

Поки повідомлення будуються на періодичному опитуванні мережі, між підтвердженням транзакції в блоці та зарахуванням минає від кількох хвилин до години.

У це вікно потрапляють усі спірні звернення: клієнт бачить переказ в оглядачі блоків, а в обліковій системі платіж ще не з'явився. Це найдорожчий клас відмов — кошти вже пішли, а замовлення не оформлене.

Надійна доставка подій будується на черзі з підтвердженням приймання: webhook-адресу отримувача викликають повторно з наростаючою паузою, кожна спроба пишеться в журнал із кодом відповіді.

Частка доставлених повідомлень перестає залежати від доступності одного сервісу — на повторних доставках вона виходить на 99,9% проти 90-95% за одиночного виклику.

Ідемпотентність обробки обов'язкова: події приходять не по порядку й можуть дублюватися, тому кожна несе ключ — хеш транзакції та індекс події в блоці. Отримувач за цим ключем відсікає повтор, і повторна доставка не перетворюється на подвійне зарахування.

Час реакції на платіж скорочується до секунд після підтвердження — замість очікування наступного циклу звірки.

Моніторинг платежів закриває залишок: алерт на транзакцію, що застрягла без підтверджень, на зростання глибини реоргу, на зростаючу чергу недоставлених подій. Глибину підтверджень підбираємо під конкретну мережу — для Ethereum це окремий параметр фінальності. У результаті клас відмов «платіж пройшов, а система про нього не дізналася» зникає зовсім.

Способи отримувати повідомлення про надходження платежів

Режим доставки оповіщень про платежі визначається тим, що доступно в контурі замовника: вихідні з'єднання, публічна адреса для приймання викликів, вимоги до ізоляції.

На практиці вибір зводиться до трьох варіантів — періодичне опитування, потік подій від вузла і webhook-виклики від платіжного сервісу.

Режим доставки Коли підходить Обмеження
Періодичне опитування за розкладом Закритий контур без вхідного трафіку; десятки адрес; реакція за хвилини допустима Затримка виявлення платежу дорівнює кроку опитування; за частих запитів зростає навантаження на вузол; історію доводиться дочитувати пачками
Потік подій від вузла Потрібна реакція в межах блоку; висока частота операцій Тримає постійне з'єднання й перепідключення; за розриву частина подій губиться, потрібна звірка за висотою блоку
Webhook-виклики від сервісу Публічний приймач; середній і високий потік; кілька мереж Доставка з повторами — обробник зобов'язаний бути ідемпотентним; потрібні підтвердження приймання, черга повторів і перевірка підпису

Що спільного в усіх режимів

Жоден варіант не гарантує одноразову доставку: оповіщення приходять щонайменше один раз. Тому дедуплікація за ідентифікатором транзакції й облік глибини підтверджень закладаються одразу, незалежно від вибраного каналу.

Ми завжди додаємо звіряльне опитування поверх активного каналу — воно закриває розриви з'єднань і підбирає платежі, за якими виклик не дійшов.

Як ми впроваджуємо webhook криптоплатежів: етапи робіт

Надсилати повідомлення прямо з обробника оплати — швидкий шлях і найкрихкіший: якщо сервіс замовника недоступний, подія губиться, а платіж залишається без статусу. Тому ми ведемо роботу від аудиту платіжної схеми до здачі в експлуатацію, перевіряючи кожну гілку на сценаріях збою.

  1. Аудит платіжної схеми. Розбираємо, як зараз приходять повідомлення про платежі, де зберігається стан замовлення, які перевірки виконуються до зарахування. Фіксуємо сценарії: повторна доставка, втрата події, відкат блоків у мережі, ручний переказ повз касу.
  2. Проєктування контракту повідомлення. Узгоджуємо склад полів, підпис запиту секретним ключем, ідентифікатор події для ідемпотентності та версіонування — щоб додавання нових полів не ламало вже працюючих отримувачів.
  3. Налаштування черги й повторних доставок. Повідомлення йдуть через чергу з підтвердженням обробки, повтори йдуть із наростаючою затримкою, недоставлені — в окрему гілку. Сервіс замовника може полежати, подія дочекається його.
  4. Тестовий контур. Піднімаємо емулятор мережі з керованими умовами: затримка підтверджень, відкат блоку, дублювальна подія, недоступність отримувача. Проганяємо кожну гілку й звіряємо журнали обох сторін.
  5. Реалізація та приймання. Пишемо код, сховище статусів, метрики й оповіщення про затори в черзі. На прийманні розбираємо інциденти разом із вашою командою.
  6. Здача в експлуатацію. Передаємо конфігурації, схему потоків та інструкцію з ручного перевідправлення події; фіксуємо план відкату, якщо оновлення отримувача минуло невдало.

Комплект налаштувань і документації, який залишається у вас

Розробка закінчується не демонстрацією працюючого повідомлення, а передаванням вашій команді повного набору артефактів. Усе лежить у вашому репозиторії та на ваших серверах: подивитися, змінити або відкотити конфігурацію можна без нашої участі.

  • Схема потоків. Шлях платежу від підтвердження в мережі до webhook на вашому сервері: де ставиться таймаут, як вибудувані повторні доставки, що відбувається за недоступності приймача і як відсікаються дублі.
  • Конфігурації обробників. Підписки на події, зіставлення статусів, ключі підпису, пороги повторів — окремими файлами, а не «налаштовано в інженера в особистому кабінеті».
  • Документація з інтеграції. Формат тіла повідомлення, склад полів, очікувані коди відповідей, поведінка за повторної доставки, приклади запитів для тестового контуру.
  • Правила доступу. Ролі та права на панель, порядок ротації секретів, місця зберігання ключів підпису й те, хто має право їх перевипустити.
  • Регламент інцидентів. Що дивитися за пропущеного повідомлення, як перевідправити конкретну подію, кому і в якій черговості ескалювати.
  • Інструкції для команди. Розбір типових поломок і набір приймальних перевірок, які проганяються після будь-яких правок на вашому боці.

Кожен пункт розрахований на інженера, який відкриє його через пів року після запуску й розбереться без листування з нами.

Кейс: як платіжний потік перестав губити події

Ситуація до: платіжний сервіс приймав повідомлення про надходження в мережі Tron «на льоту» — один обробник, без збереження події на диск.

Якщо сервіс перезапускався під час викатки або не встигав за пікового навантаження, повідомлення зникало без сліду, хоча транзакція в мережі вже підтверджена.

Оператор щоранку звіряв виписки вручну й добивав зарахування скриптом за адресами — частина платежів приїжджала до клієнта із затримкою в добу й більше.

Що змінили в схемі доставки

Повідомлення перестало оброблятися «в момент приходу»: тепер воно спочатку фіксується в черзі зі збереженням на диску, і лише після цього підтверджується відправнику. Обробник ідемпотентний за ідентифікатором транзакції — повторна доставка тієї самої події не задвоює баланс.

Недоставлене розбирає фоновий обхід із наростаючою паузою між спробами, а не нескінченним циклом у момент збою.

До цього додали журнал доставки: за кожною подією видно статус — прийнято, оброблено, повторюється, потребує уваги. На боці платіжного сервісу з'явився приймач-заглушка, тому падіння основного обробника більше не створює прогалину в даних.

Що стало за метриками

Частка платежів, що зараховуються автоматично, зросла з 92% до 99,9%. Втрачених подій — з однієї приблизно на 400 до нуля за пів року спостереження за безперервних викаток.

Ручна звірка скоротилася з кількох годин щодня до короткого розбору за журналом раз на тиждень: дивитися доводиться лише події зі статусом «потребує уваги», а їх одиниці.

Пішли три класи відмов, які раніше спливали вже в скаргах клієнтів: рестарт сервісу під час навантаження, падіння обробника на одній «важкій» події та прихід повідомлень не в тому порядку.

Максимальна затримка зарахування тепер вимірюється хвилинами й видна в журналі, а не з'ясовується постфактум.

Що робити, якщо приймання платежів уже налаштоване, а події губляться?

Якщо приймання працює на періодичному опитуванні мережі, події губляться не через код, а через схему: система дізнається про переказ лише на наступній ітерації, і між ними є вікно, коли платіж пройшов, а для бізнесу його немає. Чим ширший список адрес, тим рідше дістається кожній із них.

Подієві повідомлення — webhook — змінюють модель: мережа сама повідомляє про переказ, ми перевіряємо підпис і віддаємо запис далі. Різниця не в зручності, а в класі відмов, тому її простіше звести в таблицю.

Що порівнюємо Опитування за розкладом Події
Затримка зарахування задає інтервал опитування секунди після підтвердження
Пропуск під час перезапуску губиться вікно між ітераціями повтор із журналом доставки
Навантаження на вузол зростає з числом адрес за кількістю нових переказів
Дублікати можливі за перекриття вікон відсікаються ідемпотентним ключем
Відкат блоку зарахування потрібно сторнувати чекаємо число підтверджень

Переключатися в один день не потрібно: опитування продовжує працювати, а поруч піднімається приймання подій, яке пише в той самий контур через адаптер з ідемпотентним ключем — хеш переказу плюс індекс виводу.

Облікова система не змінюється: вона отримує звичний запис або дублікат, який адаптер відсікає. Відкат міграції — це вимкнення одного модуля, а не розбір проведених зарахувань.

Далі закриваємо два залишкові ризики. Недоставлені повідомлення — вихідна черга з повторами й наростаючою паузою плюс періодична звірка з мережею, яка виловлює те, що не прийшло. Реорганізацію ланцюга — підтвердженнями: зараховуємо після потрібного числа блоків. Логіка одна для мереж на кшталт Tron і EVM-сумісних.

Часті запитання інженерів про доставку подій

На технічному розборі перед запуском найчастіше запитують про справжність повідомлення, порядок подій і поведінку системи за недоступності обробника отримувача.

Доставку ми будуємо так, щоб вона не залежала від готовності приймача: подія зберігається до підтвердження, повторні спроби йдуть за наростаючими інтервалами, стан кожного повідомлення видно в журналі.

Як отримувач розуміє, що повідомлення не підроблене?

Кожне повідомлення підписується секретним ключем, який є лише в нас і в отримувача. Підпис приходить у заголовку й обчислюється від вихідного тіла запиту, тому за зміненими даними її не перерахувати. На приймачі підпис звіряють постійним за часом способом і відхиляють запит у разі розбіжності.

У якому порядку приходять події?

Порядок не гарантується: підтвердження операції може обігнати її створення, а затримки на боці отримувача додають розсинхрон. У повідомленні передаємо номер блоку, позицію події в блоці та унікальний ідентифікатор — за ними послідовність вибудовується на приймачі.

Обробку робимо ідемпотентною: зміна статусу не залежить від того, чи прийшла до неї попередня подія.

Що робити, якщо наш сервіс недоступний?

Повідомлення не губиться: воно залишається в черзі до підтвердження від отримувача, а повторні спроби йдуть із наростаючою затримкою та розкидом, щоб не бити по сервісу, який лежить, однією хвилею.

Коли спроби вичерпано, подія переходить у чергу розбору: видно причину відмови, відправлення можна повторити вручну після відновлення. Повторна обробка безпечна — дублі відсікаються за ідентифікатором події.

Обговоримо задачу і повернемося з оцінкою та планом робіт

Щоб повернутися з оцінкою проєкту, а не з уточнювальними запитаннями, нам достатньо зрозуміти ваш контур приймання платежів і те, як влаштована доставка webhook криптоплатежів на вашому боці. Опишіть задачу у вільній формі — що бракує, з'ясуємо самі.

  • Як платежі приймаються зараз: де формується адреса або рахунок, хто фіксує надходження, у якій системі ведеться облік.
  • Які події потрібні отримувачу: зарахування, часткова оплата, переплата, скасування, повторне проведення після реорганізації мережі.
  • Вимоги до доставки: скільки спроб, чи важливий порядок подій, що робити з дублями і як підтверджується приймання повідомлення.
  • Куди шлемо: точка приймання на вашому боці, черга, облікова або складська система, внутрішні сервіси та відповідальні за реакцію.
  • Що вже є: власний обробник, готові модулі, ручна звірка — це напряму впливає на обсяг робіт та етапи.
  • Обсяги й піки: скільки операцій проходить за добу і які сплески система має витримати без втрати подій.
  • Обмеження контуру: закрите середовище, вимоги безпеки, доступи, тестовий стенд і порядок викладки змін.

За цими вводними збираємо оцінку проєкту: склад робіт, етапи, строки й те, що потрібно з вашого боку. Далі — обговорення задачі та план робіт: опишіть, як процес влаштований зараз і який результат потрібен, а ми повернемося з оцінкою та пропозицією щодо реалізації.

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

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1394
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1368
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    815
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1139