Paypal IPN Script, проблема с feof и fgets - PullRequest
0 голосов
/ 29 ноября 2011

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

Сначала я думал, что проблема, с которой я столкнулся, была с командой «fsockopen»:$ fp = fsockopen ('ssl: //sandbox.paypal.com', 443, $ errno, $ errstr, 30);Тем не менее, сократив весь мой код до этой строки, похоже, все в порядке.Проблема возникает с командами «feof» и «fgets».Сценарий просто зависает, и я не знаю почему.Я по сути скопировал код, предложенный на веб-сайте Paypal IPN Listener, поэтому предположил, что он будет работать!Если бы вы могли помочь мне понять, почему feof или fgets вызывают его остановку, то ваша помощь будет высоко оценена.

Вот полный сценарий:

$postback = 'cmd=_notify-validate'; //doesn't matter what these include for now
$header='abc';

//Script has been activated, create debug
$filename = 'debug/debug1_script.txt';
$filehandle=fopen($filename, 'w');
fwrite($filehandle,$postback);
fclose($filehandle);


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

//no connection, create debug file
if(!$fp){
    $filename = 'debug/debug2_fpfail.txt';
    $filehandle=fopen($filename, 'w');
    fwrite($filehandle, $errstr.'('.$errno.')');
    fclose($filehandle);
    die();
}


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

//create debug file
$filename = 'debug/debug3_postback.txt';
$filehandle=fopen($filename, 'w');
fwrite($filehandle, $header.$postback);
fclose($filehandle);


//script hangs with either of the two following lines included
while(!feof($fp)){
    $res=fgets($fp,1024);
}

Заранее большое спасибо!

Ответы [ 4 ]

6 голосов
/ 30 ноября 2011

Так что я думаю, что нашел решение, которое вместо использования комбо

while(!feof())

и

fgets()

, я использовал это:

$res=stream_get_contents($fp, 1024);

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

1 голос
/ 11 апреля 2014

Если у кого-то еще есть такая же проблема, CURL является рекомендуемым выбором для IPN PayPal.

Проверьте пример кода на Github по адресу: https://github.com/paypal/ipn-code-samples/blob/master/paypal_ipn.php

1 голос
/ 17 марта 2012

Для тех, кто прибывает сюда через Google, не забудьте включить «Connection: Close» в свои заголовки! В противном случае хост будет держать соединение открытым до истечения времени ожидания!

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

Соединение с PayPal через сокет $fp должно быть HTTP POST.feof() зависает, потому что PayPal никогда не слышит полный HTTP-запрос, поэтому он никогда ничего не отправляет обратно - он просто продолжает слушать, пока вы не сдаетесь.* переменные) в примере кода на этой странице IPN PayPal .

Я бы переписал это, чтобы использовать CURL, если вы можете вместо необработанных сокетов, так что вам не нужно форматироватьзавершите http-запрос и прочитайте необработанный http-ответ.

...