Я делаю это, используя поле счета. Это поле, которое вы можете отправить PayPal, и они отправят его обратно в ответе. Так я идентифицирую транзакции, возвращаемые из PayPal.
И в моем случае я не обрабатываю сообщения как PDT, так и IPN. Я обрабатываю только тот, который ударил меня первым. Когда приходит второе сообщение (PDT или IPN), я проверяю, что уже обработал эту транзакцию, и просто отбрасываю ее.
Кроме того, не забывайте, что вам необходимо убедиться, что сообщения поступили от PayPal. После получения сообщения PDT или IPN вам необходимо отправить обратно в PayPal с вашим уникальным Auth_id и токеном, который они отправили в исходном сообщении. Вы не должны полагаться ни на одно поле из исходного сообщения.
Как только PayPal получит ваш запрос на подтверждение, он отправит вам второе сообщение с деталями транзакции. Это тот, на кого вы должны положиться.
Я не вижу никаких преимуществ при обработке сообщений PDT и IPN для одной и той же транзакции. Сказав, что я призываю вас выполнить оба, потому что ни один из них не гарантированно достигнет вас.
Изменить, чтобы включить способ передачи счета в PayPal
Чтобы передать счет в PayPal, просто создайте поле, например:
<input type="hidden" name="invoice" value=$uniquevaluecreatedbyyourapplication>
Уникальный идентификатор может быть вашим идентификатором пользователя.
Пост в PayPal будет выглядеть примерно так:
paypal/or/sandbox/address?all the other fields&invoice=123456
Paypal отправит счет-фактуру обратно в сообщениях PDT и IPN.
Редактировать - неуникальный номер счета-фактуры
Я провел дальнейшие исследования, и вы можете настроить PayPal для приема нескольких транзакций для одного и того же идентификатора счета или для принятия только одной транзакции на один идентификатор счета. Ниже смотрите информацию прямо с сайта PayPal:
Блокировка случайных платежей
Вы можете выбрать, принимать ли платежи с тем же ID счета или
заблокировать платежи, когда идентификатор счета уже использовался.
Когда вы получаете платежи от покупателей, вы можете включить дополнительный
Поле идентификатора счета для отслеживания платежей; покупатели не увидят этот идентификатор.
Идентификатор счета покупателя должен быть уникальным для каждой транзакции. Если PayPal
получает платеж с идентификатором счета, который был использован для другого
PayPal не примет транзакцию.
Чтобы настроить параметры блокировки этого типа платежа:
Войдите в свою учетную запись PayPal по https://www.paypal.com.
Откроется страница «Обзор моей учетной записи».
Щелкните по вкладке профиля.
Откроется страница «Сводка профиля».
В столбце «Настройки продажи» щелкните «Получение платежа».
Настройки ссылки.
Откроется страница «Настройки приема платежей».
Прокрутите страницу вниз до раздела Блокировать случайные платежи, как показано
ниже.
Выберите один из следующих параметров:
Да, заблокировать несколько платежей для одного идентификатора счета - больше не принимать
чем один платеж за счет. Эта опция предотвращает повторные платежи
что вы должны вернуть.
Нет, разрешить несколько платежей для одного идентификатора счета - не ограничивайте количество
платежей, полученных по счету. Выбор этой опции может привести к
при повторных платежах, требующих возврата.
Прокрутите страницу вниз и нажмите кнопку Сохранить.
Другой вариант - создать идентификатор счета-фактуры с идентификатором пользователя + случайное число. Это сделало бы его уникальным.
См. Ниже пример кода для получения уникальных номеров счетов.
var r = Math.floor(Math.random()*100000);
var invoice = userid + "-" + r;
Вы также можете использовать дату и время вместо случайного числа.
var d = new Date();
var invoice = userid + "-" + d;
А в ответе от PayPal вы просто отбрасываете то, что следует после тире.
Надеюсь, это поможет.