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