Обработка транзакции между Paypal и локальной базой данных

Как лучше всего обрабатывать транзакции между приложением и PayPal.

Рассмотреть возможность:

  • Я Алиса, и я хочу отправить деньги Бобу
  • В моей БД я вижу, что у Боба есть 200 долларов, и я хочу отправить ему 150 долларов.
  • После отправки транзакции я хочу обновить учетную запись Боба, чтобы она содержала 50 долларов.

Теперь в соответствии с API PayPal я могу отправить Pay и получить успех. Однако что произойдет, если я, например, отправлю Pay, он будет успешным, но я не получу ответ из-за проблемы с сетью. Итак, я предполагаю, что произошла ошибка, и пытаюсь снова, и технически я отправлю Бобу 300 долларов вместо 150 долларов?

Как я могу обработать такую ​​транзакцию — между локальной базой данных, в которой хранится учетная запись, и удаленным API PayPal?


person Artyom    schedule 18.07.2012    source источник


Ответы (5)


Недавно у меня была именно такая проблема с проектом ASP.NET MVC, который я завершал для клиента.

Я узнал две вещи:

  • Связи между Paypal и вашей базой данных нельзя доверять (ну, не особо этому учился, но это было целиком усилено)

  • Теперь я понимаю, почему так много веб-сайтов, которые используют Paypal в качестве типа транзакции, упоминают, что может быть период обработки между моментом завершения транзакции и завершением отгрузки/доставки продукта.


То, как вы справитесь с ситуацией, похоже на то, как компания может справиться с личными чеками:

  • Личный чек выглядит как валюта (и обычно так и есть), но многие предприятия хотели бы получить от банка какое-то подтверждение того, что средства доступны, прежде чем они примут платеж, поэтому они используют машину, которая спрашивает банк, действительно ли средства доступны.
  • If the machine says the funds are available, the business trusts it and you complete the transaction. However, the machine can give an error message that typically means "the funds are not available or something went wrong" and the business has a decision to make:
    • We can trust the customer and accept the check, deliver the product, and hope for the best when later depositing the check to the bank.
    • Или мы можем сказать покупателю, что потребуется время, чтобы чек был очищен, депонирован чек, дождался фактического поступления средств на наш счет и (в случае успеха) доставил продукт после того, как бизнес получит финансирование.

Это звучит неэффективно с учетом того, как сегодня работают многие предприятия, но это действительно так. На самом деле, именно поэтому многие предприятия отказываются принимать именные чеки, они ненадежны по сравнению с другими способами оплаты.

Как это соотносится с обработкой платежа через Paypal?

  • Платеж Paypal выглядит как валюта (и обычно так и есть), но многие компании хотели бы получить от Paypal какое-то подтверждение того, что средства доступны, прежде чем они примут платеж, поэтому они используют Paypal PDT, IPN или другой метод для проверки того, что транзакция было обработано надлежащим образом.
  • If Paypal properly responds to one of the verification requests, the business can trust it and complete the transaction. However, your website may throw an error of some sort (i.e. Paypal could reply with an IPN response of NOTVALID, or you could never get a reply from Paypal). The business has a decision to make:
    • The business can trust the customer and accept that they have made a Paypal payment and everything should be alright (very bad decision in the case of a Paypal transaction)
    • Или компания может сообщить клиенту во время оформления заказа, что период обработки платежей через Paypal может составлять 72 часа.

Это может показаться не лучшим способом ведения бизнеса, но именно так нам приходится иметь дело с несовершенным Интернетом.

Я бы настроил процесс оплаты Paypal примерно так:

  1. Пользователь А хочет отправить 100 долларов другому пользователю Б с помощью Paypal
  2. UserA вводит значение в «поле оформления заказа» и отправляется в Paypal для проверки транзакции.
  3. Пользователь A отправляется обратно на ваш веб-сайт из Paypal, и ваш веб-сайт выполняет проверку IPN с деталями, которые Paypal отправил на ваш сайт (в этом случае я выбрал IPN - как если бы мы использовали Express Checkout в отличие от некоторых других платежных шлюзов, которые предлагает Paypal).
  4. Если IPN равен VALID, обработайте транзакцию, как ожидалось.
  5. Если IPN не VALID, упомяните клиенту, что может быть задержка в обработке, пусть ваше приложение отправит вам уведомление о возможной проблеме с транзакцией Paypal (вы можете включить ссылочный идентификатор, чтобы вы могли быстро найти на какую транзакцию ссылается это уведомление) и пометьте транзакцию как pending, а не complete или что-то подобное.
  6. Администратор сайта, который обрабатывает эти уведомления, вручную расследует транзакцию (или заставит веб-сайт снова проверить с помощью Paypal — подробности об этом см. в документации API Paypal) и вручную пометит транзакцию как complete или failed.
  7. Сообщите участникам о статусе транзакции.

Раздражает, что нам приходится предпринимать дополнительные шаги, чтобы убедиться, что деньги были переведены, но, как упоминалось ранее, мы используем несовершенную систему и хотим быть очень уверены в успехе/неуспехе финансовых транзакций.

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

person Ecnalyr    schedule 21.07.2012
comment
Видите ли, я не рассматриваю ситуацию, когда в интерфейсе PayPal я вижу, что транзакция находится на рассмотрении или отклонена (потому что пользователь отказался платить или отказался получить деньги) - я увижу это и буду знать, что происходит. Я рассматриваю ситуацию, когда хочу убедиться, что, например, платеж или счет-фактура были успешно отправлены независимо от ответа пользователя. - person Artyom; 22.07.2012
comment
Я понимаю, поэтому, как только транзакция инициирована, вы должны установить транзакцию как ожидающую до тех пор, пока Paypal не ответит одобрено или отклонено (либо сразу после завершения транзакции, либо позже, когда вы регулярно опрашиваете Paypal с вашими ожидающими транзакциями, чтобы увидеть, есть ли какие-либо из них). одобрены или отклонены), или администратор вручную утверждает транзакцию. Вы не увидите в Paypal, что транзакция находится на рассмотрении или отклонена — это будет на вашем сайте в вашей собственной базе данных, и это значение будет зависеть от ответов Paypal на ваши запросы IPN (или другого метода). - person Ecnalyr; 22.07.2012
comment
Я наградил этот ответ, так как он был наиболее полным, кроме того, что он не полностью отвечает на мой вопрос :-) - person Artyom; 26.07.2012

Пожалуйста, перейдите по этой ссылке. Надеемся, что метод авторизации и захвата PayPal подойдет вам, поскольку вы не хотите потерять ответ, а также неверно рассчитанные переводы суммы, PayPal предоставляет идентификатор корреляции, который может быть передан PayPal для подтверждения статуса вашего заказа, это будет лучше передать идентификатор заказа в PayPal API.

https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/howto_admin_authcapture

http://www.scribd.com/doc/6303345/40/CorrelationID-for-Reporting-Problems-to-PayPal

Удачи!

person throtle    schedule 23.07.2012
comment
Идентификатор корреляции НЕ должен использоваться для подтверждения статуса заказа каким-либо образом. Идентификатор корреляции меняется с каждым запросом и предназначен только для сообщения о проблемах. - person Robert; 24.07.2012
comment
Да, правильно, если у нас есть какие-либо проблемы. Можно указать идентификатор корреляции. - person throtle; 24.07.2012

Это известно как двухфазная фиксация. Пока PayPal не участвует в той же транзакции, у вас будут проблемы.

person steve    schedule 21.07.2012

Я бы списал с Алисы 150 долларов и отразил бы, что транзакция "Ожидает подтверждения", а затем периодически опрашивал бы PayPal для синхронизации вашей БД, поскольку вы не можете контролировать, когда сеть или PayPal могут быть доступны, опубликовать, отменить или скорректировать транзакцию. Как только PayPal обработает транзакцию, вы можете изменить статус в своей базе данных с «Ожидание» на «Завершено». Кстати, именно так обрабатываются банковские счета и кредитные карты. Вы можете применить метод двойной записи к своей БД. (см. этот Вопросы и ответы)

person Frank R.    schedule 22.07.2012

Из того, что я вижу, вам нужно убедиться, что транзакция завершена, иначе ничего не нужно делать.
Если вы вносите деньги в PayPal API и не получаете ответа от PAYPAL API, вам необходимо отменить транзакцию в своей БД.

person Up_One    schedule 20.07.2012
comment
Что, если я, например, отправлю запрос на перевод 10 долларов на bob, но соединение было потеряно или не завершено в ответе. Вы не можете точно знать, обнаружила ли сторона PayPal проблему. Поэтому я могу получить сообщение об ошибке, но с точки зрения PayPal это было успешно завершено. - person Artyom; 21.07.2012