没有收到Paypal IPN Sandbox的回复

时间:2011-11-28 20:41:50

标签: php paypal paypal-ipn paypal-sandbox

我正在将paypal结账放到我的网站上,但是我和听众一起倒下了。 对于那些不熟悉Paypal IPN系统的人来说,Paypal基本上会向您的脚本发送一条有关交易的消息,您可以通过添加几个位来发送回来。如果Paypal收到正确的回复,它将回复'已验证',如果没有,它会说'无效'。

我成功了第一位。我的代码能够从paypal接收信息,添加额外内容并将其发回。但是,Sandbox没有回复说“已验证”或“无效”。我几乎从paypal网站上复制了我的代码,所以我希望这会相当简单,所以如果你花一点时间查看我的代码,也许一些新的眼睛可以找出我出错的地方

这是代码。没有什么特别的,它只是获取信息,调整它,传回它并读取响应(它要么没有得到或者没有意识到它的到来)

<?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);
        }
    }
}

?>

提前致谢!

6 个答案:

答案 0 :(得分:11)

切换到使用HTTPS网址,我不知道什么时候,但最近我的所有测试脚本都开始在普通的HTTP版本上失败。他们看起来正在迁移。

我使用的是相同的paypal示例代码:

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

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

答案 1 :(得分:9)

所以我认为我找到了解决方案。事实证明连接到ssl:// sandbox ....没有问题,它实际上正在检索答案。

上的代码被挂断了
while(!feof($fp)){
    $res=fgets($fp,1024);
}

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

$res=stream_get_contents($fp, 1024);

它第一次工作!现在我可以继续我的生活。再次感谢您对此的所有帮助。

答案 2 :(得分: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

答案 3 :(得分:0)

我注意到您发布的网址与以下网址略有不同,可能是这样吗?

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

  

检查您是否将回复发布到正确的网址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. / p>

答案 4 :(得分:0)

PayPal测试服务器已移至:

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

答案 5 :(得分:0)

检查php版本tls socket。它应该是tls 1.2来获取沙箱帐户的响应。将php版本升级到5.5以获得tls 1.2 socket。

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

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

访问link