我正在将贝宝结帐到我的网站上,但正在与听众崩溃。对于那些不熟悉PayPal IPN系统的人,基本上,PayPal将您的脚本发送有关交易的消息,您将其发送回几个位。如果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.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);
        }
    }
}

?>

提前致谢!

有帮助吗?

解决方案 2

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

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

少量。我所做的就是将其替换为:

$res=stream_get_contents($fp, 1024);

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

其他提示

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

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

请注意贝宝 示例代码 使用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和HTTP的端口不同,而443.我对PayPal API并不熟悉,但是当我看到您使用80时,我可以研究它。

贝宝测试服务器移至:

$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或更多。

参观 关联.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top