Ошибка PayPal IPN Bad Request 400

Используя IPN PayPal, я получаю ошибку 400.

Я делаю сценарий, отправляющий мне электронные сообщения $res чтобы узнать, что такое ответ, внутри цикла while (!feof($fp)) {} . Я всегда получаю ошибку: HTTP/1.0 400 Bad Request

В общей сложности я возвращаюсь:

 HTTP/1.0 400 Bad Request ​Connection: close Server: BigIP Content-Length: 19 ​Invalid Host Header 

Последняя строка после этого просто пустая. Вот мой код, я попытался изменить множество вещей, но ничего не работает.

 $req = 'cmd=_notify-validate'; foreach ($_POST as $key => $value) { $value = urlencode(stripslashes($value)); $value = preg_replace('/(.*[^%^0^D])(%0A)(.*)/i','${1}%0D%0A${3}', $value);// IPN fix $req .= "&$key=$value"; } // post back to PayPal system to validate $header = "POST /cgi-bin/webscr HTTP/1.0\r\n"; $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; $header .= "Content-Length: " . strlen($req) . "\r\n\r\n"; $fp = fsockopen('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30); if (!$fp) { // HTTP ERROR } else { fputs($fp, $header . $req); while (!feof($fp)) { $res = fgets ($fp, 1024); if (strcmp ($res, "VERIFIED") == 0) { //ADD TO DB } else if (strcmp ($res, "INVALID") == 0) { // PAYMENT INVALID & INVESTIGATE MANUALY! // E-mail admin or alert user } } fclose ($fp); } 

Я добавил строку, это заголовок перед отправкой:

  Host: www.sandbox.paypal.com POST /cgi-bin/webscr HTTP/1.0 Content-Type: application/x-www-form-urlencoded Content-Length: 1096 

Solutions Collecting From Web of "Ошибка PayPal IPN Bad Request 400"

Поскольку вы сами открываете сокет, а не используете библиотеку HTTP, такую ​​как завиток, вам нужно установить правильную версию протокола HTTP и добавить заголовок HTTP Host непосредственно под строкой POST.

 $header = "POST /cgi-bin/webscr HTTP/1.1\r\n"; $header .= "Host: www.sandbox.paypal.com\r\n"; 

У меня были те же проблемы, и это необходимые изменения. Некоторые из приведенных выше ответов не устраняют все проблемы.

Новый формат заголовка:

 $header = "POST /cgi-bin/webscr HTTP/1.1\r\n"; $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; $header .= "Host: www.sandbox.paypal.com\r\n"; // www.paypal.com for a live site $header .= "Content-Length: " . strlen($req) . "\r\n"; $header .= "Connection: close\r\n\r\n"; 

Обратите внимание на дополнительный набор \ r \ n только на последней строке. Кроме того, сравнение строк больше не работает, потому что новая строка вставляется в ответ от сервера, поэтому измените это:

 if (strcmp ($res, "VERIFIED") == 0) 

к этому:

 if (stripos($res, "VERIFIED") !== false) // do the same for the check for INVALID 

https://www.x.com/content/bulletin-ipn-and-pdt-scripts-and-http-1-1

 // post back to PayPal system to validate $header .="POST /cgi-bin/webscr HTTP/1.1\r\n"; $header .="Content-Type: application/x-www-form-urlencoded\r\n"; $header .="Host: www.paypal.com\r\n"; $header .="Connection: close\r\n"; 

Я нашел пример кода PayPals, используя fsockopen, чтобы он не работал должным образом.

Чтобы заставить IPN работать с PHP, я использовал предложение Aireff от 5 августа и посмотрел на код с использованием метода curl на сайте x.com.

У меня была такая же проблема, и лучше всего использовать код образца paypal … Он отлично работает тогда: https://www.x.com/developers/PayPal/documentation-tools/code-sample/216623

Другое решение – обрезать $ res перед сравнением.

 $res = fgets ($fp, 1024); $res = trim($res); //NEW & IMPORTANT