Paypal IPN 脚本,feof 和 fgets 的问题
Posted
技术标签:
【中文标题】Paypal IPN 脚本,feof 和 fgets 的问题【英文标题】:Paypal IPN Script, issue with feof and fgets 【发布时间】:2012-01-08 23:42:14 【问题描述】:我的 Paypal IPN 侦听器脚本出现问题已经有几天了。对于那些不熟悉 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);
非常感谢!
【问题讨论】:
如果您使用的代码与 this page 上的代码完全相同,除了替换主机名,它是否有效? 【参考方案1】:从您的$fp
套接字返回到贝宝的连接必须是 http POST。 feof()
挂起,因为 paypal 从来没有听到完整的 HTTP 请求,所以它从来没有发回任何东西——它只是一直在听,直到你放弃。
您需要this paypal IPN page 上的示例代码中的额外内容(完成的$header
和$req
变量)。
如果可以的话,我会重写它以使用 CURL,而不是原始套接字,因此您不必格式化完整的 http 请求并读取原始 http 响应。
【讨论】:
非常感谢您的帮助。我已经按照你说的做了,并包含了以下标题: $header = "POST /cgi-bin/webscr HTTP/1.1\r\n"; $header .= "主机:ssl://www.sandbox.paypal.com\r\n"; $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; $header .= "内容长度:" 。 strlen($postback) 。 "\r\n\r\n";据我所知,这没问题,但同样的事情正在发生。使用 while(!feof($fp)) 或 fgets($fp, 1024) 它只是挂起。再次感谢您的回复! 这不是 HOST 标头的正确格式。尝试像 paypal 示例一样使用 http 1.0。 再次感谢,如果您遇到一些愚蠢的问题,我们深表歉意...我已经返回并直接从他们的网站上复制了 Paypal 的标题:$header .= "POST /cgi- bin/webscr HTTP/1.0\r\n"; $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; $header .= "内容长度:" 。 strlen($postback) 。 "\r\n\r\n";文件指针仍然: $fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30);但是我仍然得到与 while(!feof()) 或 fgets() 相同的响应。我可以在标题中包含更多信息吗? 该页面上似乎没有任何示例代码了。 我还去检查了参考 Paypal 代码页,它似乎已被移动/删除。也许从现在开始只是 CURL?有兴趣知道您是否确实做到了这一点?【参考方案2】:所以我想我找到了一个解决方案,而不是使用
while(!feof())
和
fgets()
组合,我用这个:
$res=stream_get_contents($fp, 1024);
第一次工作!现在我可以继续我的生活了。
【讨论】:
【参考方案3】:对于通过 Google 来到这里的任何人,不要忘记在您的标题中包含“连接:关闭”!否则主机将保持连接打开直到超时!
【讨论】:
【参考方案4】:如果其他人有同样的问题,CURL 似乎是 PayPal 的 IPN 推荐选择。
在 Github 上查看代码示例:https://github.com/paypal/ipn-code-samples/blob/master/paypal_ipn.php
【讨论】:
以上是关于Paypal IPN 脚本,feof 和 fgets 的问题的主要内容,如果未能解决你的问题,请参考以下文章