- PVSM.RU - https://www.pvsm.ru -
Сбои при оплате возможны — это может быть проблема с сетью, временный сбой банка или просроченная карта. Грамотная стратегия повторных попыток помогает корректно обрабатывать такие ошибки, избегая дублирования списаний.
Сейчас покажу, как это сделать.
Важная часть надежной системы повторных платежей — отслеживание их статуса. У каждой транзакции должен быть четкий статус, который определяет дальнейшие действия: повтор, возврат или эскалацию.
Типовые статусы платежа:

Статусы платежей следует сохранять в append-only таблице БД для гарантии целостности данных и упрощения диагностики.
База данных только для добавления (append-only), также называемая неизменяемой (immutable) базой данных, позволяет только добавлять новые данные в конец, без возможности изменения или удаления существующих записей.
Вот как может выглядеть простой пример таблицы отслеживания статусов платежей:
CREATE TABLE payment_status (
id SERIAL PRIMARY KEY,
payment_id UUID NOT NULL,
status VARCHAR(50) NOT NULL,
timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
metadata JSONB
);
При каждом изменении статуса платежа в таблицу добавляется новая строка. В колонке метаданных можно хранить дополнительную информацию, относящуюся к изменению статуса — например, сообщения об ошибках для неудачных попыток или идентификаторы транзакций для успешных платежей.
Такой подход дает несколько преимуществ:
Два компонента, которые могут помочь, — это очередь повторных попыток (Retry Queue) и очередь недоставленных сообщений (Dead Letter Queue).
1. Очередь повторных попыток
2. Очередь мертвых писем (DLQ)
Крайне важно правильно определить, стоит ли повторять неудачный платеж. Эффективная стратегия повтора должна отличать временные ошибки (которые могут исчезнуть при повторной попытке) от постоянных сбоев, требующих других способов обработки.

Когда следует повторять платеж
Когда не стоит повторять платеж
Если ошибка вызвана фундаментальной проблемой в данных или системе, то лучший выбор — «Не повторять».
Хорошо продуманная система должна анализировать тип ошибки перед автоматическим повторением транзакции, чтобы обеспечить эффективность и избежать лишней обработки.
Следующие шаги иллюстрируют, как работает надежный процесс повторного платежа:

1. Произошел сбой – Платеж не проходит из-за временного или постоянного сбоя
2. Проверка возможности повтора — Система определяет, является ли ошибка временной (например, таймаут сети) или постоянной (например, недостаток средств).
3. Процесс повторной обработки — Платежи, находящиеся в очереди повторов, забираются платежной службой для повторной попытки.
4. Проверка при повторной ошибке — Если платеж по-прежнему не прошел, система повторно оценивает возможность его повторного проведения.
5. Обработка очереди мертвых писем — транзакции в DLQ требуют изучения для определения необходимости ручного вмешательства, уведомления клиента или исправления системы.
Одна из основных задач в сфере платежей — обеспечить, чтобы повторные попытки не приводили к дублированию платежей. Именно здесь на помощь приходит стратегия Exactly-Once — она гарантирует, что платеж будет обработан только один раз, даже при многократных повторных попытках.
Способы достижения этого включают:
Но это тема для отдельного поста, который я готовлю ;-)
Создание надежной системы повторных платежей необходимо для того, чтобы эффективно справляться с ошибками, избегая при этом потери прибыли и разочарования клиентов. Использование отслеживания статуса платежей, очередей повторов и очередей «мертвых писем» может помочь создать более надежную систему.
Иногда надежность — это просто серия хорошо управляемых повторных попыток.
P.S. Обращаем ваше внимание на то, что у нас на сайте проходит распродажа [1].
Автор: ph_piter
Источник [2]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/perevod/415065
Ссылки в тексте:
[1] распродажа: https://habr.com/ru/companies/piter/articles/892036/
[2] Источник: https://habr.com/ru/companies/piter/articles/895214/?utm_campaign=895214&utm_source=habrahabr&utm_medium=rss
Нажмите здесь для печати.