未收到来自 Paypal IPN 沙盒的响应

Posted

技术标签:

【中文标题】未收到来自 Paypal IPN 沙盒的响应【英文标题】:Not receiving a response from Paypal IPN Sandbox 【发布时间】:2012-01-08 06:39:11 【问题描述】:

我正在我的网站上使用贝宝结帐,但我与听众不欢而散。 对于那些不熟悉 Paypal IPN 系统的人来说,Paypal 基本上会向您的脚本发送一条关于交易的消息,然后您将其发送回来并添加一些比特。如果 Paypal 收到正确的回复,它会回复 'VERIFIED',否则会说 'INVALID'。

我已经成功完成了第一点。我的代码能够从贝宝接收信息,添加附加内容并将其发回。但是,我没有从沙盒中收到“已验证”或“无效”的回复。我几乎从贝宝网站复制了我的代码,所以我希望这将是相当简单的,所以如果你可以花一点时间看看我的代码,也许一些新的眼睛可以找出我哪里出错了.

这是代码。没什么特别的,它实际上只是获取信息,对其进行调整,将其传回并读取响应(它要么没有得到,要么没有意识到它正在得到)

<?php

$debug=true;

//Put together postback info

$postback = 'cmd=_notify-validate';

foreach($_POST as $key =>$value)
     $postback .= "&$key=$value";


// build the header string to post back to PayPal system to validate
$header = "POST /cgi-bin/webscr HTTP/1.1\r\n";
$header .= "Host: www.sandbox.paypal.com\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($postback) . "\r\n\r\n";

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

if(!$fp) //no conn
    die();


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

while(!feof($fp))

    $res=fgets ($fp, 1024);

    if((strcmp($res, "VERIFIED")) == 0) //verified!
        if($debug)         
            $filename = 'debug/debug5_verified.txt'; //create a file telling me we're verified
            $filehandle=fopen($filename, 'w');
            fwrite($filehandle,'VERIFIED!');
            fclose($filehandle);
        
    


?>

提前致谢!

【问题讨论】:

这个链接可能对你有帮助....***.com/questions/14827497/… 【参考方案1】:

切换到使用 HTTPS url,我不确定我的所有测试脚本何时开始在纯 HTTP 版本上失败。他们看起来正在迁移。

我正在使用与您相同的 paypal 示例代码:

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

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

【讨论】:

感谢您的帮助!你能告诉我你是怎么换的吗? 有关此更改的背景信息:x.com/content/bulletin-ip-address-expansion-paypal-services【参考方案2】:

所以我想我找到了解决方案。事实证明,连接到 ssl://sandbox .... 没有问题,它实际上是在检索答案。代码被挂断了

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

位。我所做的只是将其替换为:

$res=stream_get_contents($fp, 1024);

第一次就成功了!现在我可以继续我的生活了。再次感谢您对此的所有帮助。

【讨论】:

如果您正在寻找正确的答案。对于某些人来说,它使用 ssl:// 和端口 443。我来到这里时遇到了同样的问题并切换到 ssl protecol 并使用端口 443 为我修复了它。我在沙盒环境中得到一个空的响应。请注意,stream_get_contents 解决方案对我不起作用,所以如果这对您不起作用,请尝试其他一些建议!虽然 -> 80 端口仍在现场工作,截至 2012 年 6 月 8 日。 为什么这个解决方案有效?您是如何意识到这是解决方案的?【参考方案3】:

也许原始代码丢失了: $header .= "Connection: close\r\n\r\n";

请注意,Paypal sample code 使用 HTTP/1.0,因此没有该行。 HTTP/1.1 很好,但可能需要这条线。

在另一个问题上,Sandbox 可能不再支持端口 80。我收到了 302 重定向到 https://www.sandbox.paypal.com。

【讨论】:

这也是我注意到的。两年前我建立了一个 IPN,文档说我可以将普通的 HTTP 用于沙箱。现在,今天,我发现它返回了 302,我不得不在 443 后使用 SSL。【参考方案4】:

我注意到您发帖的网址与下面的有些不同,是这样吗?

这是来自 IPN 测试帮助页面:

检查您是否将回复发布到正确的 URL,即 https://www.sandbox.paypal.com/cgi-bin/webscr 或 https://www.paypal.com/cgi-bin/webscr,具体取决于您是在沙盒中进行测试还是在现场进行测试。

验证您的响应是否包含完全相同的 IPN 变量和值,顺序相同,前面带有 cmd=_notify-validate。

确保您正在对响应字符串进行编码,并使用与原始消息相同的字符编码。

编辑:对不起,我还想提一下,HTTP 和 HTTPS 的端口是不同的,80 与 443 不同。我对 Paypal API 不太熟悉,但可以查看一下,因为我看到您使用的是 80。

【讨论】:

感谢您的帮助!我尝试了所有的组合,但仍然画了一个空白,但我会告诉你我尝试了什么:主要是我更改了 $fp 变量并留下了 $header =."Host:...." 单独或注释掉它。我不确定我是否说清楚了,但是在我成功连接(根据我的代码)到我正在连接的站点之前,即 $fp 是有效的,因此条件 if(!$fp)没有被满足。自从您的帖子无效以来,我尝试过的每种组合。奇怪的是, $fp=fsockopen('h ttp://w ww.san...com' 80,,, 30) 不起作用(但它确实可以在删除 'http' 的情况下工作)。 是的,抱歉,我尝试了 80 和 443 的所有 https:// http:// 组合或只是 www。我还尝试使用最后添加的 /cgi-bin/webscr,但唯一有效的组合是 www.sand... 和端口 80。 您可以尝试使用 ssl:// 而不是 https://(同时保留端口 443)看看是否有效 再次感谢!虽然当我添加 ssl:// 时它无法发送 IPN。它只是挂起并说它无法访问该网站。 我确实找到了这个论坛帖子:phpbuilder.com/board/archive/index.php/t-10329375.html,其中提到了您面临的类似问题。我真的希望您从该线程中找到解决方案,祝您好运,很抱歉无法提供更多帮助!【参考方案5】:

PayPal 测试服务器移至:

$fp = fsockopen('ssl://ipnpb.paypal.com', 443, $errno, $errstr, 30);

【讨论】:

来源?我在 PayPal 的网站上没有发现有关此 URL 更改的任何信息。他们网站上的 PHP5.2 IPN 示例使用 sandbox.paypal.com。【参考方案6】:

检查 php 版本 tls 套接字。从沙盒帐户获取响应应该是 tls 1.2。将 php 版本升级到 5.5 以获得 tls 1.2 套接字。

paypal 已禁用 sslv3 的服务并更改为 tls 1.2。

如果你需要得到响应,php版本必须需要tls 1.2,为了得到tls 1.2 php可以升级到5.5或更高。

访问link。

【讨论】:

以上是关于未收到来自 Paypal IPN 沙盒的响应的主要内容,如果未能解决你的问题,请参考以下文章

从 PayPal 的沙盒 IPN 获得无效响应

贝宝沙盒 IPN 模拟器 - 没有得到响应

Paypal 沙盒 IPN 返回无效

Paypal API,未收到 IPN 消息

PayPal IPN 模拟器工作正常,但 IPN 不响应沙盒支付

自 2013 年 6 月 1 日以来,PayPal 沙盒 IPN 使用 HTTP 代码 0 响应