У меня есть скрипт IPN, который работает, и он работал некоторое время. Недавно я начал получать HTTP/1.1 302 Moved Temporarily
в качестве ответа и не могу определить, почему.
Ниже приведен код, связанный с отправкой в PayPal и получением ответа:
$sd = @fsockopen('ssl://www.paypal.com', 443, $errno, $errstr, 30); if(!$sd) { $error = 'Error opening socket connection to PayPal: '.$errstr; quit($error, $errno); } $req = 'cmd=_notify-validate'; foreach($_POST as $key=>$value) $req .= "&{$key}=".urlencode(stripslashes($value)); // post back to PayPal to validate $header = "POST /cgi-bin/webscr HTTP/1.1\r\n"; $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; $header .= "Content-Length: ".strlen($req)."\r\n"; $header .= "Host: http://www.paypal.com/\r\n"; $header .= "Connection: close\r\n\r\n"; fputs($sd, $header.$req); $response = ''; while(!feof($sd)) $response .= fgets($sd, 4096); fclose($sd);
Обратите внимание, что все соединения, передачи и ответы работают, я не получаю и не ошибаюсь. Но ответ от PayPal неверен в том, что он не предоставляет VERIFIED или INVALID, как указано в их документации, а скорее ошибку HTTP 302.
Я создаю свой запрос таким образом (и он работает). Может быть, это может помочь вам
$req = 'cmd=_notify-validate'; foreach ($_POST as $key => $value) { $value = urlencode(stripslashes($value)); //Fixes some special characters Paypal sends $value = preg_replace('/(.*[^%^0^D])(%0A)(.*)/i','${1}%0D%0A${3}', $value); $req .= '&' . $key . '=' . $value; }
Хост в HTTP-заголовке должен быть установлен на www.paypal.com
. Обратите внимание на отсутствие http[s]://
.