【问题标题】:Not receiving a response from Paypal IPN Sandbox未收到来自 Paypal IPN 沙盒的响应
【发布时间】: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);
        }
    }
}

?>

提前致谢!

【问题讨论】:

标签: php paypal paypal-ipn paypal-sandbox


【解决方案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);

【讨论】:

【解决方案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/webscrhttps://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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-10
    • 2013-08-07
    • 1970-01-01
    • 2012-07-18
    • 2011-01-19
    • 2023-04-04
    • 2016-07-13
    • 2015-11-25
    相关资源
    最近更新 更多