Paypal IPN HTTP / 1.1 - 根本不提供任何响应,它是一个空字符串

时间:2012-09-18 16:04:20

标签: php paypal paypal-ipn

这种无法解释的内容可能会影响或影响数千名网站管理员。

问题是Paypal没有对此请求作出回应。下面是我使用的示例代码以及程序员的评论:

“PayPal根本没有对此请求作出任何回复,空字符串来自它。您可以询问PayPal团队,是否应添加”Host“和”HTTP / 1.1“之外的任何内容以正确处理响应可能是'cmd'命令应该有另一个值吗? 我的期望是,PayPal将仅在2013年2月开放HTTP / 1.1协议,因为他们在电子邮件中说明了这一点。我不确定相同的脚本和主机如何处理不同的协议。该脚本现在无法使用HTTP / 1.1和我们存档的代码,原因可能是在PayPal方面。 我正在关注PayPal如何查询IPN脚本,并且当HTTP 1.1设置时,它似乎进入某种循环。你仍然可以在ipnlogz.txt中看到它 - '07%3A39%3A41' - 即我订单的'07:39:41'日期 - 它重复了5次!为什么?谁知道... 它只意味着PayPal试图IPN这个脚本5次,但没有成功。只有当我将HTTP更新为1.0并重新上传脚本时,才会出现来自PayPal的“已验证”响应。在此之后,PayPal仍然在查询它。 似乎当HTTP = 1.1时,PayPal正在正确地获取所有内容,但没有正确响应;然后由于某种原因回来为同一笔付款创建另一个回复。使用HTTP 1.0,它就像一朵花:一个请求,一个响应,一切正常。我不知道它有什么问题......

聚苯乙烯。我们不是在谈论'无效'回复。 “INVALID”响应实际上是成功的一部分 - 但在HTTP 1.1的情况下,PayPal根本不提供任何响应,它是一个空字符串。“

<?php

$req = 'cmd=_notify-validate';
$r='';

foreach ($_POST as $key => $value) {
$value = urlencode(stripslashes($value));
$req .= "&$key=$value";
$r.="{$key}: {$value}\n";
}

// post back to PayPal system to validate
$header .= "POST /cgi-bin/webscr HTTP/1.1\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Host: www.paypal.com\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";
$fp = fsockopen ('www.paypal.com', 80, $errno, $errstr, 30);
#I also tried: $fp =fsockopen('ssl://www.paypal.com',443,$err_num,$err_str,30);

if (!$fp) {
$r.="----\nHTTP ERROR\n";
// HTTP ERROR
} else {

$r.="----\nReceived IPN request\n";

fputs ($fp, $header . $req);

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

if (strcmp ($res, 'VERIFIED') == 0) {

$proceed=TRUE;

}
else{
$proceed=FALSE;
}
}

?>

PS。这是我们使用的脚本的notify_url部分:

<input type="hidden" name="notify_url" value="{$main_url}/index.php?action=ipn&amp;user_id={$user_id}" />

当它在Sandbox中测试时,它正在工作..

6 个答案:

答案 0 :(得分:2)

在上面的代码中,您可以替换:

if (strcmp ($res, "VERIFIED") == 0) { 

使用

if (strcmp (trim($res), "VERIFIED") == 0) { 

唯一的区别是修剪

答案 1 :(得分:1)

我发现了http://www.justmyusecase.com/2012/09/subject-action-required-update-your.html

看起来你只需要修剪“已验证”的字符串。

答案 2 :(得分:1)

答案 3 :(得分:0)

自2012年12月中旬以来,我们没有从PayPal收到任何IPN。 Web服务器访问或错误日志中没有条目表明PayPal从那时起尝试发送IPN。

所以今天我接到了德国PayPal支持的电话(在等候线上超过2小时后 - 我终于到达了某人)。

他们向我确认,某些帐户存在问题(没有发送IPN)并且他们尝试修复它。 因此,在您尝试更改脚本之前,请先注意服务器日志文件!

答案 4 :(得分:0)

好吧,我和我的IPN有类似的东西

尝试在PayPal上更改IPN编码

我的accont =&gt;我的个人资料=&gt;我的销售工具=&gt;语言编码

答案 5 :(得分:-1)

我也有这个问题,PP拒绝承认存在问题。我不知道该怎么办,但客户会在四个月内生气。

你应该做的一个改变是:

$header .= "POST /cgi-bin/webscr HTTP/1.1\r\n"; // wrong  
$header .= "POST cgi-bin/webscr HTTP/1.1\r\n"; // right (according to PP)