3

几天前突然停止接收来自贝宝的IPN消息。我写了下面的代码

$url_parsed=parse_url('https://www.sandbox.paypal.com/cgi-bin/webscr');
$post_string = '';    
foreach ($_POST as $field=>$value) { 
    $post_string .= $field.'='.urlencode(stripslashes($value)).'&'; 
}
$post_string.="cmd=_notify-validate";
$fp = fsockopen($url_parsed['host'],"80",$err_num,$err_str,30);

$myFile = "testpaypal.txt";

$fh = fopen($myFile, 'w') or die("can't open file");
$stringData = $post_string;
fwrite($fh, $stringData);
fwrite($fh, "------------");


if(!$fp){
    return false;
} else {

    fputs($fp, "POST $url_parsed[path] HTTP/1.0\r\n"); 
    fputs($fp, "Host: $url_parsed[host]\r\n"); 
    fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n"); 
    fputs($fp, "Content-length: ".strlen($post_string)."\r\n"); 
    fputs($fp, "Connection: close\r\n\r\n"); 
    fputs($fp, $post_string . "\r\n\r\n");      
    while(!feof($fp)) 
    { 
        $ipn_response .= fgets($fp, 1024); 
    } 
    fclose($fp);
    if (eregi("VERIFIED",$ipn_response)) {
        fwrite($fh, "VERIFIED");
        return true;
    } else {
        fwrite($fh, "UNVERIFIED");
        return false;
    }
}
    fclose($fh);

此代码将 err_num 返回到“ 0 ”以及当我在“fclose($fp);”之后打印 $ipn_response 时 它打印的行“ HTTP/1.0 302 Found Location: https://www.sandbox.paypal.com Server: BigIP Connection: close Content-Length: 0

但无法在 $ipn_respnse 中获得“VERIFIED”。

我已经尝试了所有可能的方法,例如使用“ssl://sandbox.paypal.com”更改解析 url 以及网络上建议的所有其他解决方案。

自从过去三天以来,我一直被困在这个问题上。所以,请帮帮我。

提前致谢。

4

4 回答 4

5

您应该通过 SSL 连接。尝试改变这个:

$fp = fsockopen($url_parsed['host'],"80",$err_num,$err_str,30);

对此:

$fp = fsockopen("tls://" . $url_parsed['host'],"443",$err_num,$err_str,30);
于 2013-02-12T15:16:12.097 回答
0

我也曾为这个问题而苦苦挣扎。它完全让我发疯!!!问题是 Hetzner(主机所在的位置)由于某种原因阻止了 PayPal IP。在这种情况下,当您查看 PayPal 帐户中的 IPN 历史记录时,您应该会看到 IPN 已停止从某个日期发送通知。

于 2013-02-12T07:37:41.197 回答
0

尝试将 parse_url ( https://www.paypal.com/cgi-bin/webscr ) 更改为沙盒 url ( https://sandbox.paypal.com/cgi-bin/webscr )。

接下来,检查您的服务器是否已启用 openssl 以使用 phpinfo() 函数接收来自 HTTPS 的响应。

于 2013-02-12T08:12:51.750 回答
0

在来自 PayPal 的消息中:

为了提高我们网站的性能、可扩展性和可用性,我们将扩大 www.paypal.com 的 IP 地址数量。我们在 2011 年 10 月 18 日的公告中宣布了这一点。作为此次扩展的一部分,我们将于 2013 年 2 月 1 日停止对 HTTP 1.0 协议的支持...

据说可以在http://www.paypal.com/pdthttp://www.paypal.com/ipn找到更多信息

我在您的代码中注意到:

fputs($fp, "POST $url_parsed[path] HTTP/1.0\r\n");

您仍在使用 HTTP 1.0

我不知道这是否会解决您的问题,但如果您仍然遇到问题,希望它会有所帮助。

于 2013-02-18T23:28:05.707 回答