Вопрос

Я проверяю интеграцию веб-сайта в 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;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top