2012-02-11 3 views
22

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

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

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

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

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

Кто-нибудь еще использует ipn_track_id, чтобы однозначно идентифицировать сообщения IPN?

+4

логически это одна транзакция, следовательно, идентичная txn_id. Добавление платежного_стата в (первичный) ключ решало бы это, не так ли? Док должен, вероятно, читать: txn_id для того же статуса не должен обрабатываться снова. – rene

+0

Это имеет смысл, спасибо за предложение. – arnaslu

+1

Стоит отметить, что вы должны обрабатывать транзакцию только там, где payment_status = «Завершено» в соответствии с правилами IPN PayPals. –

ответ

31

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-статус HTTP HTTP/1.1 200 OK, всякий раз, когда в него поступают IPN-данные PayPal POST.
Если вы не вернете ответ HTTP/1.1 200 OK, PayPal повторно отправит одни и те же данные до 16 раз для отдельного IPN-сообщения.

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

8

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 
+0

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

2

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

1

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

custom=xxxx 

(или invoice=ZZZZZZ)

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

-1

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

+0

Нет такой вещи, как «транзакция IPN». - Идентификаторы транзакций PayPal не являются способом однозначной идентификации сообщений IPN, как продемонстрировал OP. – Dai

Смежные вопросы