Intereting Posts
Отобразить строку, содержащую HTML в шаблоне ветви Форматирование оператора if для удобочитаемости Невозможно установить флажок Laravel, выбранный в режиме редактирования HTML-валидатор на основе PHP Выполнение функций репозитория в задаче планировщика Предупреждение: mysqli_error () ожидает ровно 1 параметр, 0 заданный в моем файле register.php Присвоение возвращаемого значения new по ссылке устарело Magento – добавить пользовательское массовое действие PDF Создайте уникальное сообщение Как запретить PDO интерпретировать знак вопроса в качестве заполнителя? переупорядочение атрибутов массива, а затем сохранение обратно в XML в php Скремблирование данных с данными POST в PHP из ASP.net как я могу читать файлы редактирования pptx / docx / xlsx с помощью PHP? move_uploaded_file (…): не удалось открыть поток: разрешение отклонено в … Использование Mac OS X Mountain Lion Как управлять страницами / формами в приложении PHP?

Подтвердить, что вызов IPN из PayPal?

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

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

Solutions Collecting From Web of "Подтвердить, что вызов IPN из PayPal?"

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

  1. PayPal отправляет вашему слушателю IPN сообщение, которое уведомляет вас о событии
  2. Ваш слушатель отправляет полное неизмененное сообщение обратно в PayPal; сообщение должно содержать одни и те же поля в одном порядке и кодироваться так же, как и исходное сообщение
  3. PayPal отправляет одно слово назад, которое либо подтверждено, если сообщение возникло с помощью PayPal или INVALID, если есть какое-либо несоответствие с тем, что было первоначально отправлено

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

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

$verify_url = 'https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_notify-validate&' . http_build_query( $_POST ); if( !strstr( file_get_contents( $verify_url ), 'VERIFIED' ) ) return false; 

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 } 

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'); } 

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

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

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

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

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