没有收到Paypal IPN沙箱的回应



我正在把paypal结账放到我的网站上,但是我被听众摔倒了。对于那些不熟悉Paypal IPN系统的人来说,基本上Paypal会给你的脚本发送一个关于交易的消息,你会在发送回来的时候添加一些比特。如果Paypal收到正确的回复,它会回复"已验证",如果没有,它会说"无效"。

第一点我已经成功了。我的代码是能够从贝宝接收信息,添加额外的,并张贴回来。然而,我没有得到沙盒的回应,说"已验证"或"无效"。我基本上是从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.1rn";
$header .= "Host: www.sandbox.paypal.comrn";
$header .= "Content-Type: application/x-www-form-urlencodedrn";
$header .= "Content-Length: " . strlen($postback) . "rnrn";
$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);
        }
    }
}
?>

提前感谢!

切换到使用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);

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

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

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

$res=stream_get_contents($fp, 1024);

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

可能原始代码丢失了:$header .= "Connection: closernrn";

注意,Paypal示例代码使用HTTP/1.0,所以没有那一行。HTTP/1.1很好,但可能需要行。

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

我注意到你发布的URL和下面的有点不同,可能是这个吗?

这是来自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。

PayPal测试服务器移至:

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

检查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以上。

访问链接

相关内容

  • 没有找到相关文章

最新更新