PayPal IPN使用PHP生成HTTP 302错误

时间:2013-10-17 23:20:37

标签: php paypal paypal-ipn

我有一个运行的IPN脚本,现在已经工作了一段时间。最近我开始收到HTTP/1.1 302 Moved Temporarily作为回复,无法确定原因。

以下是与发布到PayPal并获得回复相关的代码:

$sd = @fsockopen('ssl://www.paypal.com', 443, $errno, $errstr, 30);
if(!$sd) {
    $error = 'Error opening socket connection to PayPal: '.$errstr;
    quit($error, $errno);
}

$req = 'cmd=_notify-validate';
foreach($_POST as $key=>$value) $req .= "&{$key}=".urlencode(stripslashes($value));

// post back to PayPal to validate
$header  = "POST /cgi-bin/webscr HTTP/1.1\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: ".strlen($req)."\r\n";
$header .= "Host: http://www.paypal.com/\r\n";
$header .= "Connection: close\r\n\r\n";

fputs($sd, $header.$req);
$response = '';
while(!feof($sd)) $response .= fgets($sd, 4096);
fclose($sd);

注意,所有的连接,传输和响应都有效,我没有得到和错误。但PayPal的响应不正确,因为它不提供文档中所述的VERIFIED或INVALID,而是HTTP 302错误。

2 个答案:

答案 0 :(得分:2)

我以这种方式构建我的请求(并且它可以工作)。也许它可以帮到你

$req = 'cmd=_notify-validate';
foreach ($_POST as $key => $value) {
    $value = urlencode(stripslashes($value));
    //Fixes some special characters Paypal sends
    $value = preg_replace('/(.*[^%^0^D])(%0A)(.*)/i','${1}%0D%0A${3}', $value);
    $req .= '&' . $key . '=' . $value;
}

答案 1 :(得分:0)

HTTP标头中的主机必须设置为www.paypal.com。请注意缺少http[s]://