Добрался до оформления заказов.
Что нового:
- Реализовал оформление заказов без обязательной авторизации
- Добавил транзакционное создание заказа с блокировкой строк (FOR UPDATE) и списанием остатка
- Подключил Stripe: сначала создаётся PaymentIntent, а сам заказ появляется только после успешной оплаты через вебхук
- Сделал вебхук идемпотентным - повторная доставка одного и того же события больше не создаёт дубликаты заказов
- Проверил конкурентный доступ: если два пользователя одновременно пытаются купить последнюю единицу товара, заказ оформит только один
- Собрал чекаут на фронте через Stripe Elements и полностью прошёл сценарий оплаты тестовой картой
- После успешной оплаты автоматически отправляется письмо с номером заказа
Пока делал оплату, пришлось немного пересмотреть первоначальный план. Сначала хотел создавать заказ сразу, а оплату делать отдельным шагом, но после проверки сценария с последним товаром на складе стало понятно, что логичнее создавать заказ только после подтверждённой оплаты.
Так не приходится резервировать остатки заранее и меньше шансов получить неконсистентное состояние.
Дальше по плану - личный кабинет: история заказов и профиль на отдельных вкладках, а также страница отслеживания заказа по номеру и email для гостей.
Идём дальше
