PayPal IPN уникальный идентификатор - PullRequest
25 голосов
/ 11 февраля 2012

Я всегда предполагал, что txn_id, отправленный с сообщением IPN, является уникальным. Руководство PayPal, похоже, поддерживает эту идею - https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_admin_IPNIntro

Избегайте дублирования сообщений IPN. Убедитесь, что вы еще не обработали транзакцию, идентифицированную по идентификатору транзакции, возвращенному в сообщении IPN. Вам может потребоваться сохранить идентификаторы транзакций, возвращаемые сообщениями IPN, в файле или базе данных, чтобы вы могли проверить наличие дубликатов. Если идентификатор транзакции, отправленный PayPal, является дубликатом, вы не должны обрабатывать его снова.

Однако я обнаружил, что платежный IPN PayPal eCheck отправляется дважды с одним и тем же идентификатором транзакции. Один раз во время первоначального платежа с payment_status как «Ожидание» и снова через пару дней, когда eCheck фактически обрабатывает с payment_status как «Завершено».

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

Внутренний; только для использования МТС и DTS

Кто-нибудь еще использует ipn_track_id для уникальной идентификации сообщений IPN?

Ответы [ 5 ]

34 голосов
/ 11 февраля 2012

ipn_track_id не следует использовать; главным образом потому, что это только для внутреннего использования, как указано, и потому что оно уникально для каждого сообщения IPN.
txn_id является уникальным для каждой транзакции , а не для каждого сообщения IPN.

Что это значит; одна транзакция может иметь несколько сообщений IPN. eCheck, например, где он перейдет в состояние «Ожидание» по умолчанию и «Завершить» после очистки eCheck.
Но вы также можете увидеть отмены, отмененные отмены, открытые дела и возвраты за тот же txn_id.

Псевдокод:

If not empty txn_id and txn_type = web_accept and payment_status = Completed  
    // New payment received; completed. May have been a transaction which was pending earlier.
    Update database set payment_status = Completed and txn_id = $_POST['txn_id']  

If not empty txn_id and txn_type = web_accept and payment_status = Pending  
    // New payment received; completed  
    Update database set payment_status = Pending and payment_reason = $_POST['pending_reason'] and txn_id = $_POST['txn_id']

Вы можете найти намного больше переменных IPN, перечисленных в https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_html_IPNandPDTVariables#id08CTB0S055Z

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

Что касается примечания PayPal в документации: PayPal может повторно отправлять отдельные сообщения IPN, если во время доставки возникают ошибки. Например, ваш скрипт должен возвращать правильный HTTP / 1.1 200 OK HTTP-ответ о состоянии всякий раз, когда PayPal POST передает ему данные IPN.
Если вы не вернете ответ HTTP / 1.1 200 OK, PayPal будет повторять попытку отправки одних и тех же данных до 16 раз на индивидуальное сообщение IPN.

Примечание. Идентификатор транзакции продавца отличается от идентификатора транзакции покупателя, поскольку это два разных действия (одно дебетование, одно кредитование).

8 голосов
/ 15 августа 2013

ipn_track_id не уникален для повторяющихся платежей. По крайней мере, для рассрочки это не так. Когда клиент создает план рассрочки платежа и если ваш план имеет первый платеж при оформлении заказа, вы получите 2 сообщения IPN с тем же ipn_track_id (Пример ниже).

Первое уведомление "recurring_payment_profile_created" о первом платеже "recurring_payment"

План создан IPN

 [txn_type] => recurring_payment_profile_created
 [recurring_payment_id] => I-57UAPHFJ3SBY
 [product_name] => Risk-Free Trial
 [time_created] => 06:24:39 Aug 15, 2013 PDT
 [ipn_track_id] => bdd94fdee935a

Первый платеж IPN

 [txn_type] => recurring_payment
 [mc_gross] => 10.95
 [shipping] => 0.00
 [product_type] => 1
 [time_created] => 06:24:39 Aug 15, 2013 PDT
 [ipn_track_id] => bdd94fdee935a
2 голосов
/ 31 августа 2013

Не все сообщения IPN содержат $ _POST ['txn_id'], поэтому, если вы проверяете только txn_id, вы можете периодически не регистрировать сообщения IPN, если они не содержат этот ключ.

1 голос
/ 08 апреля 2014

В своем вызове PHP API я использую эти поля и сохраняю их в своей базе данных:

custom=xxxx  

(или invoice=ZZZZZZ)

затем, когда ваша страница получает IPN, онаследует проверить (из базы данных), если custom=xxxx или т. д ...

0 голосов
/ 03 июля 2014

IPN-транзакции уникальны, также транзакции, которые изменяют платеж, будут генерировать новый txn_id.Например, возврат средств, поэтому рекомендуется хранить все txn_id, относящиеся к одной покупке.Пока я не знаю, какие транзакции, кроме возвратов, генерируют новый txn_id, возможно, аннулирование тоже.

...