Не приходит ответ от Paypal IPN Sandbox

Я размещаю платеж PayPal на своем веб-сайте, но падаю со слушателем. Для тех из вас, кто не знаком с системой 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);
        }
    }
}

?>

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


person user1070084    schedule 28.11.2011    source источник
comment
Возможно, эта ссылка поможет вам.... stackoverflow.com/questions/14827497/   -  person Nikhil Thombare    schedule 19.08.2015


Ответы (6)


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

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

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

or

    $fp = fsockopen ('ssl://www.paypal.com', 443, $errno, $errstr, 30);
person preinheimer    schedule 28.11.2011
comment
Спасибо за вашу помощь! Не подскажете, как вы сделали переход? - person user1070084; 29.11.2011
comment
Справочная информация об этом изменении: x.com/content/bulletin- IP-адрес-расширения-paypal-services - person Robert; 29.11.2011

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

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

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

$res=stream_get_contents($fp, 1024);

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

person user1070084    schedule 30.11.2011
comment
Если вы ищете правильный ответ. Для некоторых он использует ssl:// и порт 443. Я пришел сюда с той же проблемой, и переключение на протокол ssl и использование порта 443 исправили это для меня. Я получал пустой ответ в среде песочницы. Обратите внимание, что решение stream_get_contents не сработало для меня, поэтому, если оно не сработает для вас, попробуйте другие предложения! Хотя -› Порт 80 по-прежнему работает с сайта, по состоянию на 8 июня 2012 года. - person Dave Thomas; 16.06.2012
comment
Почему это решение сработало? Как вы поняли, что это решение? - person nulll; 08.07.2013

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

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

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

person kitchin    schedule 06.06.2012
comment
Вот и я тоже заметил. Я установил IPN два года назад, и в документации говорилось, что я могу использовать обычный HTTP для песочницы. Сегодня я обнаружил, что он вернул 302, и мне пришлось использовать SSL для сообщения 443. - person thomthom; 16.08.2012

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

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

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

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

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

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

person Ace    schedule 28.11.2011
comment
Спасибо за помощь! Я перепробовал все комбинации всего и все равно ничего не понял, но я покажу вам, что я пробовал: в основном я изменил переменную $fp и оставил $header =.Host:.... в покое или закомментировал ее. Я не уверен, ясно ли я дал понять, но до того, как я получил успешное соединение (согласно моему коду) с сайтом, к которому я подключался, т.е. $fp был действителен, и поэтому условие if(!$fp) не встречался. Каждая комбинация, которую я пробовал с момента вашего сообщения, не работала. Как ни странно, $fp=fsockopen('h ttp://w ww.san...com' 80,,, 30) НЕ работает (но работает с удаленным «http»). - person user1070084; 29.11.2011
comment
Да, извините, я пробовал и 80, и 443 для всех комбинаций https:// http:// или просто www. Я также пробовал это с добавлением /cgi-bin/webscr в конце, но единственная работающая комбинация - это www.sand... и порт 80. - person user1070084; 29.11.2011
comment
не могли бы вы попробовать использовать ssl:// вместо https:// (с сохранением порта 443), чтобы увидеть, работает ли это - person Ace; 29.11.2011
comment
Еще раз спасибо! Хотя, когда я добавляю ssl://, он не может отправить IPN. Он просто висит и говорит, что не может получить доступ к веб-сайту. - person user1070084; 29.11.2011
comment
Я нашел это сообщение на форуме: phpbuilder.com/board/archive /index.php/t-10329375.html, в котором упоминаются похожие проблемы, с которыми вы сталкиваетесь. Я действительно надеюсь, что вы найдете решение из этой темы, удачи и извините, что не смогли помочь больше! - person Ace; 29.11.2011
comment
Спасибо еще раз за помощь! Завтра я прочитаю вашу старую добрую ссылку, я думаю ... уже слишком поздно для всего этого! Отпишусь, если получу решение. - person user1070084; 29.11.2011
comment
Спасибо за помощь, сегодня утром мне удалось найти решение! - person user1070084; 30.11.2011

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

$fp = fsockopen('ssl://ipnpb.paypal.com', 443, $errno, $errstr, 30);
person Ademus    schedule 26.06.2012
comment
Источник? Я ничего не нашел об этом изменении URL на сайте PayPal. Пример IPN PHP5.2 на их сайте использует sandbox.paypal.com. - person thomthom; 16.08.2012

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

PayPal отключил службу sslv3 и перешел на tls 1.2.

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

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

person deepu np    schedule 30.03.2016