PayPal IPN возвращается HTTP / 1.1 200 OK
-
25-09-2019 - |
Вопрос
Я проверяю интеграцию веб-сайта в PayPal, используя стандартные и варианты веб-платежей и переменных HTML.
Я написал простой PHP-скрипт для обработки уведомлений IPN.
Согласно Документация PayPal, Сервер PayPal отвечает простым «Проверенный' или 'НЕВЕРНЫЙ«Ответ, как только вы пиншете полученные данные обратно в PayPal.
В моем хендлере я делаю случайное сравнение строки для этих двух ключевых слов, если либо одно из этих известных ключевых слов не найден, то он рассматривается как ошибка.
<?php
$fp = fsockopen ($socket_url, 80, $errno, $errstr, 10);
if (!$fp){
// SOCKET ERROR
return false;
}
else {
fputs ($fp, $header . $req);
$is_ok = false;
while (!feof($fp)) {
$res = fgets ($fp, 1024);
if (strcmp("VERIFIED",$this->ipn_response)==0) {
//do something ...
}
// if the IPN POST was 'INVALID'
else if (strcmp ($res, "INVALID") == 0) {
fclose ($fp);
return false;
}
else {
echo "Unknown response from Paypal: $res";
fclose ($fp);
return false;
}
}
fclose ($fp);
return true;
}
?>
Мое сообщение об ошибке показывает, что я получаю ответ «HTTP / 1.1 200 OK» от PayPal.
Неизвестный ответ от PayPal: «HTTP / 1.1 200 OK»
Изменилась ли API PayPal, или я делаю что-то не так?
Решение
Ответ PayPal находится в теле отклика HTTP. Вам необходимо обработать заголовки HTTP, прежде чем вы сможете попасть на тело. Или, попеременно, просто продолжайте читать строки, пока не найдете пустую строку, а следующая строка будет телом.
Другие советы
Извините, мой оригинальный ответ был действительно плохо сформулирован :)
FGES - это только чтение линии по строке, первая строка является ответ HTTP. Ваш код никогда не дает возможности продолжать читать, однако, как вы «ошибка» после обработки первой строки.
Я был бы склонен заменить вашу петлю с чем-то вроде:
while (!feof($fp)) {
$res = trim(fgets($fp, 1024));
if (strcmp($res, "VERIFIED")==0) {
//do something ...
}
else if (strcmp($res, "INVALID") == 0) {
fclose ($fp);
return false;
}
}
Как сказал @mike, вы прочитали все тело - в вашем случае вы просто тестируете, если VERIFIED
или INVALID
появляется в первых 1024 байтах ответа, который, вероятно, является заголовком.
Кстати, вам не нужно использовать fsockopen()
, Большинство людей делают, потому что PayPal предоставляет пример, используя его, чтобы он работает в старых установках. Скручиваться или file_get_contents
С контекстом HTTP Post сделает работу просто в порядке, вот пример, который я закодировал для PHP PHP Framework:
public static function PayPal($email, $status = 'Completed', $sandbox = false)
{
if (preg_match('~^(?:.+[.])?paypal[.]com$~', gethostbyaddr($_SERVER['REMOTE_ADDR'])) > 0)
{
$url = ($sandbox !== true) ? '' : '.sandbox';
$result = self::CURL('https://www' . $url . '.paypal.com/cgi-bin/webscr/', array_merge(array('cmd' => '_notify-validate'), $_POST), 'POST');
if ($result == 'VERIFIED')
{
$email = strlen($email) * strcasecmp($email, $_POST['receiver_email']);
$status = strlen($status) * strcasecmp($status, $_POST['payment_status']);
if (($email == 0) && ($status == 0))
{
return true;
}
}
}
return false;
}