Подтвердить, что вызов IPN поступил от PayPal? - PullRequest
8 голосов
/ 31 января 2011

Как я могу проверить, что запрос PayPal IPN POST на мой указанный notifyURL действительно исходит от PayPal?

Я не имею в виду сравнение данных с тем, что я отправил ранее, но как я могу убедиться, что сервер / IP-адрес, с которого поступает этот запрос PayPal, действительно действительный?

Ответы [ 6 ]

14 голосов
/ 31 января 2011

Протокол IPN состоит из трех этапов:

  1. PayPal отправляет слушателю IPN сообщение, уведомляющее вас о событии
  2. Ваш слушатель отправляет полное неизмененное сообщение обратнов PayPal;сообщение должно содержать те же поля в том же порядке и быть закодировано так же, как и исходное сообщение
  3. PayPal отправляет обратно одно слово, которое либо ПРОВЕРЯЕТСЯ, если сообщение отправлено с PayPal, либо ИНВАЛИД, если имеетсялюбое несоответствие с тем, что было отправлено

https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_admin_IPNIntro

11 голосов
/ 15 июля 2011

Это самый простой способ сделать это, как я полагаю, согласно PayPal.Я использую http_build_query () для создания URL-адреса из сообщения, отправленного на сайт из PayPal.Paypal docs заявляет, что вы должны отправить это обратно для проверки, и это то, что мы делаем с file_get_contents.вы заметите, что я использую strstr, чтобы проверить, присутствует ли слово «VERIFIED», и поэтому мы продолжим работу, если нет, мы вернем false…

3 голосов
/ 26 октября 2015

HTTP-заголовок Теперь требуется User-Agent!

$vrf = file_get_contents('https://www.paypal.com/cgi-bin/webscr?cmd=_notify-validate', false, stream_context_create(array(
    'http' => array(
        'header'  => "Content-type: application/x-www-form-urlencoded\r\nUser-Agent: MyAPP 1.0\r\n",
        'method'  => 'POST',
        'content' => http_build_query($_POST)
    )
)));

if ( $vrf == 'VERIFIED' ) {
    // Check that the payment_status is Completed
    // Check that txn_id has not been previously processed
    // Check that receiver_email is your Primary PayPal email
    // Check that payment_amount/payment_currency are correct
    // process payment
}
2 голосов
/ 06 мая 2015

https://gist.github.com/mrded/a596b0d005e84bc27bad

function paypal_is_transaction_valid($data) {
  $context = stream_context_create(array(
    'http' => array(
      'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
      'method'  => 'POST',
      'content' => http_build_query($data),
    ),
  ));
  $content = file_get_contents('https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_notify-validate', false, $context);

  return (bool) strstr($content, 'VERIFIED');
}
1 голос
/ 31 января 2011

Если я правильно помню, PayPal использует статический IP-адрес для своих вызовов IPN.

Таким образом, проверка правильного IP-адреса должна работать.

альтернативно, вы можете использовать gethostbyaddr или gethostbyname.

0 голосов
/ 14 февраля 2011

Это что я использую :

if (preg_match('~^(?:.+[.])?paypal[.]com$~', gethostbyaddr($_SERVER['REMOTE_ADDR'])) > 0)
{
    // came from paypal.com (unless your server got r00ted)
}
...