Не получать ответ от Paypal IPN Sandbox

Я помещаю paypal checkout на свой сайт, но я падаю со слушателем. Для тех из вас, кто не знаком с системой IPN Paypal, в основном Paypal отправляет ваш script сообщение о транзакции, которую вы отправляете обратно с добавлением нескольких добавленных битов. Если Paypal получит правильный ответ, он ответит "VERIFIED", и если нет, он скажет "INVALID".

Мне удалось с первым битом. Мой код может получать информацию от PayPal, добавлять дополнительные данные и отправлять их обратно. Тем не менее, я не получаю ответа от Sandbox, говорящего "VERIFIED" или "INVALID". Я в значительной степени скопировал свой код с веб-сайта paypal, поэтому я надеялся, что это будет довольно просто, поэтому, если вы могли бы потратить минуту на мой код, возможно, некоторые новые глаза могли бы выбрать, где я ошибся.

Вот код. Ничего особенного, он буквально просто получает информацию, настраивает ее, передает ее и читает ответ (который он либо не получает, либо не понимает, что получает)

<?php

$debug=true;

//Put together postback info

$postback = 'cmd=_notify-validate';

foreach($_POST as $key =>$value){
     $postback .= "&$key=$value";
}

// build the header string to post back to PayPal system to validate
$header = "POST /cgi-bin/webscr HTTP/1.1\r\n";
$header .= "Host: www.sandbox.paypal.com\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($postback) . "\r\n\r\n";

$fp = fsockopen ('www.sandbox.paypal.com', 80, $errno, $errstr, 30);//open the connection

if(!$fp){ //no conn
    die();
}

//post data back
fputs($fp, $header . $postback);

while(!feof($fp)){

    $res=fgets ($fp, 1024);

    if((strcmp($res, "VERIFIED")) == 0){ //verified!
        if($debug){         
            $filename = 'debug/debug5_verified.txt'; //create a file telling me we're verified
            $filehandle=fopen($filename, 'w');
            fwrite($filehandle,'VERIFIED!');
            fclose($filehandle);
        }
    }
}

?>

Спасибо заранее!

Ответ 1

Итак, я думаю, что нашел решение. Оказывается, у него не было проблем с подключением к ssl://sandbox...., он действительно получал ответ. Код был повесил на

while(!feof($fp)){
    $res=fgets($fp,1024);
}

немного. Все, что я сделал, это заменить его:

$res=stream_get_contents($fp, 1024);

и он работал в первый раз! Теперь я могу продолжить свою жизнь. Еще раз спасибо за помощь на этом.

Ответ 2

Переключитесь на использование HTTPS-url, я не уверен, когда в последнее время все мои тестовые скрипты начали сбой при простой HTTP-версии. Они выглядят мигрирующими.

Я использую тот же код кода paypal, что и вы:

    $fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30);    

или

    $fp = fsockopen ('ssl://www.paypal.com', 443, $errno, $errstr, 30);

Ответ 3

Возможно, исходный код отсутствовал: $header .= "Connection: close\r\n\r\n";

Обратите внимание, что примерный код в Paypal использует HTTP/1.0, поэтому не имеет этой строки. И HTTP/1.1 отлично, но может понадобиться строка.

В другой проблеме Sandbox больше не поддерживает порт 80. Я получаю перенаправление 302 на https://www.sandbox.paypal.com.

Ответ 4

Я заметил, что URL-адрес, который вы публикуете, немного отличается от ниже, может ли это быть?

это со страницы справки по тестированию IPN:

Убедитесь, что вы отправляете свой ответ на правильный URL-адрес, который https://www.sandbox.paypal.com/cgi-bin/webscr или https://www.paypal.com/cgi-bin/webscr, в зависимости от того, тестируете ли вы в песочнице или вы живете соответственно.

Убедитесь, что ваш ответ содержит точно такие же переменные и значения IPN в том же порядке, которому предшествует cmd = _notify-validate.

Убедитесь, что вы кодируете строку ответа и используете ту же кодировку символов, что и исходное сообщение.

EDIT: К сожалению, я также хотел упомянуть, что порт для HTTP и HTTPS отличается от 80, а не 443. Я не слишком хорошо знаком с API Paypal, но могу посмотреть на него, поскольку вижу, что вы используете 80.

Ответ 5

Тест-сервер PayPal перенесен в:

$fp = fsockopen('ssl://ipnpb.paypal.com', 443, $errno, $errstr, 30);

Ответ 6

проверить версию php версии tls. он должен быть tls 1.2, чтобы получить ответ от учетной записи sandbox. обновите версию php до версии 5.5, чтобы получить сокет tls 1.2.

paypal отключил службу sslv3 и изменился на tls 1.2.

если вам нужно получить ответ, для версии php требуется tls 1.2, чтобы получить tls 1.2 php можно обновить до 5,5 или более.

посетите ссылку .