Можно ли полагаться на Paypal IPN исключительно для записи покупок?

Я настраиваю простую транзакцию «купить сейчас» с веб-сайта со следующими основными шагами:

  1. Выбрать товар из прайс-листа
  2. Просмотрите выбор (суммы, налог и т. д.)
  3. Обработка платежа на Paypal
  4. Получение / Спасибо

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

Я использую Paypal IPN для проверки подлинности платежей и регистрации их в соответствии с записями, вставленными на шаге 2, однако могу ли я полагаться исключительно на данные транзакций IPN для заполнения базы данных в первую очередь, тем самым удаляя нужно сохранить их на шаге 2 и выполнить очистку базы данных, чтобы удалить незавершенные транзакции?

Я лично не вижу причин, по которым я бы этого не сделал - IPN содержит все необходимые мне данные о платеже и, возможно, больше, кроме того, и Paypal будет повторно отправлять IPN в течение нескольких дней, если они не проходят с первого раза из-за сбоя сервера, но я пропустил что-нибудь еще важное?

Очевидно, что соображение номер один заключается в том, чтобы никакие транзакции не терялись и не регистрировались, чтобы не вызвать недовольство клиентов!


person Codecraft    schedule 06.06.2011    source источник
comment
Поразмыслив, я думаю, что ответ на мой вопрос может быть да, вы можете, но нет, вы не должны.   -  person Codecraft    schedule 07.06.2011
comment
Предлагая небольшую награду, чтобы увидеть, есть ли какие-либо другие предложения/ответы.   -  person Codecraft    schedule 12.06.2011


Ответы (5)


Важно сделать двухстороннюю проверку, как у вас.

Вы сохраняете информацию о заказе (общая сумма, количество) до того, как пользователь покинет вашу систему в PayPal. Когда ipn возвращается, вы подтверждаете запрос (это должен быть IP-адрес PayPal или что-то еще), вы подтверждаете, что это успешная транзакция, затем ваш шаг 2 выходит на сцену. Вы проверяете, совпадает ли общая сумма, возвращенная с PayPal ipn, с общей суммой, которая была сохранена до того, как пользователь ушел (Paypal иногда может возвращать частичные платежи, пользователь может получить данные публикации и сделать свою собственную публикацию из измененного html с более низким total задавать). Шаг 2 также должен хранить user_id покупателя, поэтому вы также должны сравнить его.

вот пример слоя (без языка программирования, просто фиктивный код):

if request comes from paypal:
    #   query the order
    if order.total == request.total && order.user_id == request.custom:
        payment may come in...
person Romeo M.    schedule 14.06.2011
comment
Вот что я сделал в конце: я проверяю наличие записи о транзакции, общую сумму по сравнению с общей суммой IPN, и что валюта — фунты стерлингов. Примерно через неделю я проведу очистку базы данных, чтобы удалить все незавершенные заказы. - person Codecraft; 14.06.2011
comment
это то, что я тоже делаю. хорошая стратегия... IPN иногда могут быть немного ненадежными - единственное, что я делаю, это проверяю базу данных, чтобы убедиться, что транзакция еще не была обработана. Бывает, что мы получаем дубликаты IPN, даже если они обрабатываются правильно. ворчать ворчать... - person totallyNotLizards; 08.05.2012

Как разработчик и администратор системы, обработавшей более 600 000 платежей PayPal за последние три года, полагаясь исключительно на IPN, можно избежать некоторых ошибок.

Реальные данные:

        Total transactions   No IPN    Invalid IPN  Duplicate IPN
year 1      170,000 +          2           101           0
year 2      205,000 +         54            15           3
year 3      230,000 +         20            24          13

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

Наиболее распространенными «недействительными» IPN являются страница с ошибкой HTML или усеченные результаты... При желании я могу предоставить образцы.

Лучший выбор — это комбинация IPN и PDT (с данными вашей «корзины», хранящимися в вашей БД, как и вы). Либо процессы IPN, либо процессы PDT могут создать транзакцию (и удалить запись данных «корзина» в БД). Второй прибывший процесс не будет иметь записи «корзины», из которой можно записать транзакцию.

ПРИМЕЧАНИЕ. - как вы отметили в своем окончательном решении по использованию настраиваемого поля - имейте в виду, что для настраиваемого поля существует ограничение по длине, и оно может быть усечено при возврате вам.

person rhill    schedule 06.07.2011

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

person Louis-Philippe Huberdeau    schedule 07.06.2011
comment
Через несколько часов после написания вопроса и просмотра дополнительного кода я подумал об одной потенциальной проблеме — проверке данных в IPN, чтобы убедиться, что сумма и валюта транзакции совпадают. Если он не сохранен, не с чем сопоставлять - так кто-то может сгенерировать транзакцию PayPal с действительным IPN, но с неправильной суммой денег? Что скажешь? - person Codecraft; 07.06.2011
comment
Я думаю, это зависит от того, что вы продаете. Если цена постоянна, это довольно легко проверить. Если у вас достаточно информации для подсчета итогов на основе выбранных элементов, это все еще работает. Сохранение информации для перепроверки кажется более безопасным путем. - person Louis-Philippe Huberdeau; 07.06.2011
comment
Сайт в основном продает «кредиты», которые затем можно использовать для загрузки или скачивания контента. Я решил пойти по пути регистрации информации о предварительной оплате (в основном, какой продукт и какая цена была на момент покупки) и отправить настраиваемое поле в PayPal, чтобы мы могли идентифицировать его, когда приходит IPN, просто так кажется безопаснее. - person Codecraft; 07.06.2011

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

person dkamins    schedule 07.06.2011
comment
Значит, мы предполагаем, что он кодер веб-сайта атомной электростанции? хД - person Cyclone; 07.06.2011
comment
@Cyclone yes - настоящая ниша PHP. - person dkamins; 07.06.2011
comment
Черт возьми, моим последним проектом была система ядерной безопасности, которая полагалась на платежи местных жителей, чтобы поддерживать ее включенной, я думал, что прямо сейчас попал на прядильщик денег :-) А если серьезно, см. Мой комментарий к другому ответу - также, еще одна мысль, если кто-то отправляет деньги напрямую через PayPal (зачем? но они могли ..) без хранения веб-транзакций, прежде чем мы не узнаем, предназначены ли эти деньги для оплаты транзакции, которую мы ожидаем, или просто случайный подарок .. .? - person Codecraft; 07.06.2011

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

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

person Colin    schedule 14.06.2011