Информационные технологии и интернет
Ноябрь 2026
Это мой собственный проект, пекарня вымышленная. Покупатель выбирает партию на 08:00, 12:00 или 16:00, оплачивает заказ и забирает его сам или оформляет доставку по зоне на карте.
Хотел разобраться, что происходит с оплатой при сбоях. Например, если подтверждение потерялось, пришло дважды или после отмены заказа. Или покупатель дважды нажал «Оплатить», а владелец открыл возврат в двух вкладках.
Собрал сервер на Go с PostgreSQL, сайт покупателя, кабинет владельца и консоль платежей на React. ЮKassa и Робокасса работают через общий интерфейс провайдера. Клиент ЮKassa работает и с эмулятором API, где заказ, оплату и возврат можно пройти без ключей провайдеров.
У заказа одна активная попытка оплаты. Повторное нажатие использует ее же, готовая ссылка выдается повторно. Сумму сервер берет из заказа. У ЮKassa проверяется адрес отправителя уведомления, а статус запрашивается через API. Потерю уведомления об оплате закрывает сверка по таймеру. У Робокассы сервер проверяет подпись уведомления. Если оно потерялось в тестовом режиме, таймер не поможет.
Сервер учитывает уже возвращенное и заявки в пути, поэтому вернуть больше оплаты нельзя. Устаревшая форма возврата во второй вкладке отклоняется. При поздней оплате отмененного заказа, если выпечку уже заняли другие, система оставляет его отмененным и запрашивает возврат. Если возврат не прошел, владельцу нужно разобраться вручную.

В кабинете заказы сгруппированы по партиям. Владелец задает остатки по дням недели и видит предупреждения. После оплаты состав можно только уменьшить, на разницу создается возврат. Приложение напоминает о чеках, которые нужно оформлять и исправлять в «Мой налог» вручную.
Консоль показывает события платежа. В песочнице можно потерять или повторить уведомление, изменить порядок событий, вызвать таймаут и двойное нажатие. Часть находок аудита закреплена тестами. Есть и скрипты, которые проверяют кнопки, текст и суммы в интерфейсе.

Получился магазин с оплатой и возвратами. Карту, ЮMoney, частичные возвраты и уведомления вручную проверял в тестовом магазине ЮKassa. В тестовой Робокассе прошел сценарий с выбором СБП и подписанным уведомлением. Исход там выбирается вручную, без обращения к банку.

Реальных списаний не было. Сбои, включая повторы уведомлений и отдельные гонки возвратов, проверялись на эмуляторе и в тестах. СБП ЮKassa проверен только на эмуляторе, в ее тестовом магазине он недоступен. Возвраты Робокассы реализованы по спецификации и проверены на подмене сервера. На стороне провайдера они не проверялись, у API нет тестового режима. Т-Кассу не подключал: самозанятому-физлицу без ИП ее интернет-эквайринг недоступен.

![]()
Даниил Михайлов
Россия Москва
Интерфейс платежного провайдера отделен от пекарни. Для другого проекта потребуется связать платежи с его заказами и отдельно проверить сценарии.