Как предотвратить изменения в корзине при асинхронных платежах - PullRequest
0 голосов
/ 10 марта 2019

Следующие шаги иллюстрируют мою проблему с потоком платежей Stripe в Stripe, но вы могли бы придумать что-то похожее для других платежных шлюзов, на которые я смотрел, когда окончательное уведомление об успешном платеже отправляется асинхронно от платежного шлюза продавцуsite.

  1. Клиент добавляет 10 товаров по A в корзину, итого 100 $
  2. Клиент переходит на страницу оформления заказа.Сервер создает Stripe PaymentIntent на общую сумму 100 долл. США и отправляет в браузер «client_secret».
  3. В браузере клиента отображается страница оформления заказа с общей суммой 100 долл. США и форма оплаты Stripe.
  4. Клиент открываетновая вкладка, и добавьте 10 элементов B в корзину покупок, общая стоимость которых теперь составляет 200 долларов США.
  5. Клиент возвращается на вкладку оформления заказа и завершает платеж в размере 100 долларов США с помощью Stripe (ничего, что может сделать сайт, чтобы предотвратить это, - все это происходит с клиентом).сторона)
  6. Асинхронно, Stripe уведомляет сайт через веб-крючков, что мы получили 100 долларов.Что нам теперь делать?

Сумма платежа больше не соответствует сумме корзины.Нужно ли возвращать платеж и отменять заказ?Как мы уведомляем клиента?Мы, вероятно, уже показали им страницу «заказ завершен - спасибо», потому что у нас не было возможности узнать, что сумма была неправильной, пока не пришло асинхронное уведомление.Клиент, вероятно, уже покинул наш сайт.Что мы делаем с их корзиной для покупок?

- Еще один фон для всего этого:

Я всегда обращался к Stripe всякий раз, когда мои клиенты хотели принимать онлайн-платежи на своих сайтах, потому чтоСинхронная модель Stripe сделала мой код красивым и простым.Клиент вводил данные своей карты, затем Stripe возвращал токен, представляющий платеж, и, наконец, мой серверный код проверял, что все данные были верны, использовал API Stripe для сбора денег и возвращал сообщение с благодарностью клиенту.браузер.

Но теперь кажется, что Stripe отходит от этой модели к асинхронной модели (PaymentIntents), где ваш сервер должен прослушивать уведомления о выполненных платежах, прежде чем выполнять заказы.В терминологии Stripe мы должны настроить прослушивание «webhooks» для события «payment_intent.succeeded».

Все остальные платежные шлюзы, которые я использовал в прошлом, также имеют асинхронную модель, в том смысле, что вашВеб-сервер должен дождаться какого-то обратного вызова от шлюза, уведомляющего нас о платеже, прежде чем мы сможем безопасно начать обработку заказа.PayPal называет это «Уведомление о мгновенном платеже», Worldpay называет его «Заказ веб-хуков», Adflex называет его «Server2ServerNotification» ... и т. Д.

Там, где я борюсь, пытается справиться с вещами, которые могут произойти во времяразрыв между началом оформления заказа и получением уведомления о платеже.Учитывая, что все эти платежные шлюзы используют асинхронные модели такого рода, должно быть простое решение этих (и подобных) проблем, но я действительно застрял - любые предложения будут высоко оценены.

1 Ответ

0 голосов
/ 11 марта 2019

Я думаю, что главное, что вам здесь не хватает, это то, что сумма PaymentIntent устанавливается на стороне сервера.Это означает, что когда ваш клиент открывает новую вкладку и добавляет больше товаров в свою корзину, вы должны обновить PaymentIntent на вашем сервере , чтобы отразить новую сумму.Затем, когда они вернутся на другую вкладку и завершат платеж, у вас должна быть указана общая сумма в вашем PaymentIntent.

Ваш клиент может по-прежнему видеть процесс оформления заказа для суммы, отличной от фактически взимаемой,в этом случае я предлагаю вам взглянуть на реализацию websockets , чтобы убедиться, что они всегда видят общую сумму в своей корзине.

...