Это шлюз для приёма криптовалюты, поэтому вместо обещаний — один платёж, строка за строкой.

Заказ №1043 на 49.90 EUR. Магазин в Москве, покупатель в Стамбуле, платит USDT. Ниже всё, что произошло за девять минут, и всё, что было бы, пойди оно не так. Времена и суммы настоящие, взяты из журнала.

14:02:11 invoice.created

Магазин выставил счёт

Один запрос из бэкенда магазина. В ответ — ссылка на оплату, курс зафиксирован на этот счёт, срок жизни 30 минут. Повтор того же запроса с тем же Idempotency-Key вернёт этот же счёт, а не второй: покупатель, дважды нажавший «оплатить», не создаёт два заказа.

14:02:40 выбрана валюта

Покупатель выбрал USDT в сети Tron

Ему выдан адрес, который больше не достанется никому: два заказа никогда не приходят на один адрес, поэтому не бывает вопроса «чей это перевод». Сумма пересчитана по курсу на 14:02:11 — 57.30 USDT.

А если он передумает и захочет заплатить биткоином?

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

14:06:55 payment.detected

Перевод виден в сети. Подтверждений 3 из 19

Событие означает ровно это и ничего больше — деньги видны, но ещё могут исчезнуть при реорганизации цепочки. Товар отдавать рано, и мы этого не говорим: статус счёта остаётся «подтверждается», а событие про оплату придёт отдельным.

А если он пришлёт меньше, чем в счёте?

Счёт станет «недоплата», а деньги всё равно зачислятся на ваш баланс. Дальше решаете вы: принять как оплаченный или вернуть покупателю. Допуск, в пределах которого недоплата считается оплатой, задаёте сами — по умолчанию его нет, потому что чужие деньги не наше дело округлять.

14:11:02 invoice.paid

Девятнадцать подтверждений. Счёт закрыт

Столько для Tron настроено по умолчанию, и это меняется в консоли — сеть, где подтверждение стоит дорого, можно ждать дольше, а дешёвую отпускать раньше. Вот теперь товар отдавать можно.

А если он заплатит завтра, когда счёт уже истёк?

Выданный адрес остаётся под наблюдением ещё неделю. Монеты, ушедшие на него через сутки, никуда не денутся: платёж пометится поздним и будет ждать вашего решения. Худшее, что может сделать шлюз, — принять деньги и не оставить о них записи.

14:11:02 проводка в книге

Двойная запись, сумма проводок — ноль

Пришло 57.30 USDT, комиссия 0.57, магазину 56.73. У каждой суммы есть счёт, откуда она пришла, и счёт, куда ушла; сумма всех проводок в системе равна нулю, и это проверяется само, а не заявляется на витрине.

В консоли оператора есть отчёт, который сверяет книгу с блокчейном: сколько по бумагам лежит на горячем кошельке и сколько на самом деле осталось на депозитных адресах.

14:11:03 вебхук отправлен

Ваш сервер узнал об оплате через секунду

POST с подписью HMAC и временем в заголовке — чтобы чужой не мог прислать вам «оплату», а свой не мог быть проигран повторно.

А если мой сервер в этот момент лежал?

Повторим восемь раз, паузы нарастают до двенадцати часов. В кабинете видно тело запроса, подпись и ответ вашего сервера — обычно этого хватает, чтобы понять, что у вас упало. Если вебхук так и не дошёл, те же события лежат в ленте: читаете с того места, где остановились, по курсору. Событие происходит один раз и имеет один идентификатор, сколько бы адресов его ни получили.

позже выплата на ваш кошелёк

Деньги уходят туда, куда вы заранее разрешили

Адрес вывода добавляется только со вторым фактором и ждёт сутки перед первой выплатой. Это не бюрократия: сутки — время заметить чужой вход в аккаунт до того, как деньги уйдут на его адрес. Крупная выплата уходит на решение второму сотруднику платформы.

Ключ можно привязать к диапазону IP вашего сервера, и тогда утёкший ключ бесполезен откуда-либо ещё.

Что это стоит
1%
с успешного платежа. За неоплаченные и просроченные счета — ноль
0.7%
от 50 000 $ оборота в месяц
от 0.5%
дальше, со своими лимитами выплат и белой маркой на странице оплаты
0 ₽
подключение, абонентская плата, тестовый режим

Тестовый ключ выдаётся сразу после регистрации: счёт, страница оплаты, вебхук и возврат работают в песочнице по-настоящему, только деньги ненастоящие.

Создать аккаунт Документация и примеры запросов

Боевой режим открывается после верификации бизнеса и подключения кошелька — мы не берём в кастодию деньги магазина, о котором ничего не знаем. Сети: Tron, Ethereum, Solana, Bitcoin. Активы: USDT, USDC, BTC, ETH, SOL. Вопрос, которого здесь нет, — support@coinrail.app, отвечает тот, кто это писал.