贝宝IPN HTTP / 1.1 - 不提供任何响应的话,那是一个空字符串(Paypal IPN

2019-09-22 14:00发布

这无法解释可能会影响或将影响成千上万的网站管理员。

问题是贝宝不给这个请求的响应都没有。 下面是我使用示例代码,也是我的程序员的评论:

“贝宝不给这个请求什么反应,一个空字符串来自于它。你可能会问贝宝队,如果除了‘主持人’和‘HTTP / 1.1’应加妥善处理响应什么。难道是的“CMD”命令应该有另一种价值?我的期望是,贝宝将只在2013年2月开放的HTTP / 1.1协议,因为他们在他们的电子邮件的状态。我不知道如何在同一个脚本和主机可以处理不同的协议该脚本不使用HTTP现在的工作/ 1.1,我们对文件中的代码,原因可能是在贝宝的身边。我下面的PayPal如何查询IPN脚本,它似乎进入了某种循环, 。当有HTTP 1.1设置你仍然可以看到它自己在ipnlogz.txt - 07%3A39%3A41' - 即'07:39:41' 我的订单日期 - 这是重复5次为什么谁知道......!它只意味着贝宝正试图IPN这个脚本5次,没有成功。似乎有来自PayPal“验证”的回应,只有当我已经更新了HTTP 1.0, 重新上载该脚本。 之后,贝宝还在查询它。 看来当HTTP = 1.1,贝宝是正确得到一切,但没有正确响应; 然后由于某种原因,回来创造又为同一支付另一响应。 与HTTP 1.0这一切都像花一样:一个请求,一个响应,一切正常。 我不知道什么地方错了?

PS。 我们不是在谈论一个“无效”的响应。 「无效的回应实际上是成功的 - 但是在HTTP 1.1的情况下,贝宝不提供任何回应所有的组成部分,它是一个空字符串“。

<?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}" />

当它在沙盒测试它是工作..

Answer 1:

更改此:

// 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);

为此:

// 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";
$header .= "Connection: close\r\n\r\n";
$fp = fsockopen ('ssl://www.paypal.com', 443, $errno, $errstr, 30);

和这个:

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

为此:

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

而这几乎是保证工作。

您当前的设置失败,因为PayPal发送一个连接:保持活动标头中的fsockopen欣然接受响应,因此它保持连接打开。
而HTTP库如卷曲会自动关闭连接。

我一般的建议是, 如果你不想以控制跨线进入到PayPal的每一个位,使用HTTP库如卷曲,而不是的fsockopen这仅仅是一个普通的TCP连接。
(贝具有使用可用的卷曲样本代码在https://www.paypal.com/ipn和https://www.paypal.com/pdt )



Answer 2:

在你上面的代码可以取代:

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

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

唯一的区别是微调



Answer 3:

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

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



Answer 4:

我加入了以下线,这工作得很好

$解析度=修剪($ RES);

参考链接

  1. http://www.johnboy.com/blog/http-11-paypal-ipn-example-php-code
  2. http://www.johnboy.com/scripts/paypal-ipn/paypal_ipn_1_1.phps


Answer 5:

自2012年12月中旬,我们没有收到任何贝宝IPN。 有在Web服务器的访问日志或错误日志表示,贝宝正试图发送的IPN从那以后没有条目。

所以我不得不在今天与德国贝宝支持的电话(在等候线超过2小时后 - 我终于到达某人)。

他们向我证实,有一些账户(IPN没有发送),他们试图解决它的问题。 所以你想改变你的脚本之前,WATCHOUT服务器日志文件第一!



Answer 6:

好了,我和我的IPN类似的东西

给一个尝试和改变的PayPal IPN编码

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



Answer 7:

我有这个问题,以及和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)


文章来源: Paypal IPN HTTP/1.1 - doesn't provide any response at all, it is an empty string