Paypal IPN脚本,问题与feof和fgets



这几天我的Paypal IPN监听器脚本一直有问题。对于那些不熟悉Paypal IPN系统的人来说,基本上Paypal会给你的脚本发送一个关于交易的消息,你会在发送回来的时候添加一些比特。如果Paypal收到正确的回复,它会回复"已验证",如果没有,它会说"无效"。

我最初认为我遇到的问题是'fsockopen'命令:$fp=fsockopen('ssl://sandbox.paypal.com', 443, $errno, $errstr, 30);然而,把我所有的代码减少到这一行,它似乎连接得很好。问题出在'feof'和'fgets'命令上。剧本就挂了,我不知道为什么。我基本上复制了Paypal IPN Listener网站上建议的代码,所以我认为它会工作!如果你能帮助我了解为什么脚或忘记导致它停滞,那么你的帮助将是非常感激的。

下面是完整的脚本:

$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);
}

提前感谢!

所以我想我找到了一个解决方案,而不是使用

while(!feof())

fgets()

组合,我用的是:

$res=stream_get_contents($fp, 1024);

第一次成功了!现在我可以继续我的生活了。

通过Google到达这里的人,不要忘记在标题中包括"Connection: Close" !否则,主机将保持连接打开,直到超时!

如果其他人有同样的问题,CURL似乎是PayPal推荐的IPN选择。

查看Github上的代码示例:https://github.com/paypal/ipn-code-samples/blob/master/paypal_ipn.php

$fp套接字返回paypal的连接必须是http POST。feof()挂起,因为paypal从来没有听到一个完整的HTTP请求,所以它永远不会发送任何返回-它只是一直侦听,直到你放弃。

你需要额外的东西(完成$header$req变量)在这个paypal IPN页面的示例代码。

如果可以的话,我将使用CURL重写此代码,而不是使用原始套接字,这样您就不必格式化完整的http请求并读取原始http响应。

相关内容

  • 没有找到相关文章

最新更新