Не получен ответ от Paypal IPN Sandbox - PullRequest
10 голосов
/ 29 ноября 2011

Я помещаю PayPal Checkout на свой сайт, но падаю со слушателем. Для тех из вас, кто не знаком с системой Paypal IPN, в основном Paypal отправляет ваш скрипт с сообщением о транзакции, которое вы отправляете обратно с добавлением пары битов. Если Paypal получит правильный ответ, он ответит «ПРОВЕРЕНО», а если нет - «НЕДОПУСТИМО».

Мне удалось с первым битом. Мой код может получать информацию от PayPal, добавлять дополнения и публиковать их обратно. Тем не менее, я не получаю ответа от Песочницы, говорящего «ПРОВЕРЕНО» или «НЕВЕРНО». Я в значительной степени скопировал свой код с веб-сайта 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);
        }
    }
}

?>

Заранее спасибо!

Ответы [ 6 ]

11 голосов
/ 29 ноября 2011

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

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

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

или

    $fp = fsockopen ('ssl://www.paypal.com', 443, $errno, $errstr, 30);
9 голосов
/ 30 ноября 2011

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

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

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

$res=stream_get_contents($fp, 1024);

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

3 голосов
/ 06 июня 2012

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

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

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

0 голосов
/ 30 марта 2016

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

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

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

перейдите по ссылке .

0 голосов
/ 26 июня 2012

Тестовый сервер PayPal перемещен на:

$fp = fsockopen('ssl://ipnpb.paypal.com', 443, $errno, $errstr, 30);
0 голосов
/ 29 ноября 2011

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

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

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

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

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

РЕДАКТИРОВАТЬ: Извините, я также хотел упомянуть, что порт для HTTP и HTTPS отличается, 80, в отличие от 443. Я не слишком знаком с Paypal API, но могу посмотреть на это, как я вижу, вы используете 80.

...