如果这个IPN脚本工作正常,直到昨天(今天早些时候)没有变化......以下是核心PayPal代码的关键部分,我希望有人可以查看并告诉我是否有任何问题?我的Wordpress代码似乎在它自己的工作正常(所以我排除它)... Paypal是否再次更改了他们的版本(1.0到1.1 ??)或URL或什么?
$req = 'cmd=_notify-validate';
foreach ($_POST as $key => $value) {
$value = urlencode(stripslashes($value));
$value = preg_replace('/(.*[^%^0^D])(%0A)(.*)/i','${1}%0D%0A${3}',$value);// IPN fix
$req .= "&$key=$value";
}
// post back to PayPal system 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\r\n";
$fp = fsockopen ('www.paypal.com', 80, $errno, $errstr, 30);
if (!$fp) {
echo $errstr . ' (' . $errno . ')';
$mail_From = 'From: IPN@tester.com';
$mail_To = 'charlwoode@gmail.com';
$mail_Subject = 'HTTP ERROR';
$mail_Body = $errstr;//error string from fsockopen
mail($mail_To, $mail_Subject, $mail_Body, $mail_From);
$fh = fopen("logipn.txt", 'a');//open file and create if does not exist
fwrite($fh, "\r\n/////////////////////////////////////////\r\n HTTP ERROR \r\n");//Just for spacing in log file
fwrite($fh, $errstr);//write data
fclose($fh);//close file
}
elseif
{
fputs ($fp, $header . $req);
while (!feof($fp)) {
$res = fgets ($fp, 1024);
$res=trim($res);
if (strcmp ($res, "VERIFIED") == 0) {
$item_name = $_POST['item_name'];
$item_number = $_POST['item_number'];
$aid= $_POST['custom'];
$payment_status = $_POST['payment_status'];
$payment_amount = $_POST['mc_gross']; //full amount of payment. payment_gross in US
$payment_currency = $_POST['mc_currency'];
$txn_id = $_POST['txn_id']; //unique transaction id
$receiver_email = $_POST['receiver_email'];
$payer_email = $_POST['payer_email'];
//do stuff
}
else {
//do stuff
}
答案 0 :(得分:0)
啊......我的标题过时了 - 这些都有效:
$header .= "POST /cgi-bin/webscr HTTP/1.1\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Host: www.paypal.com\r\n"; // NEW
$header .= "Connection: close\r\n"; // NEW
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";
// OLD VERSION THAT DIDN"T WORK $fp = fsockopen ('www.paypal.com', 80, $errno, $errstr, 30);
$fp = fsockopen ('ssl://www.paypal.com', 443, $errno, $errstr, 30); // NEW CORRECT VERSION
另外别忘了修剪!
while (!feof($fp)) {
$res = fgets ($fp, 1024);
$res=trim($res);
答案 1 :(得分:0)
我在过去几天遇到了同样的问题,并试图在Paypal网站上进行研究。他们现在为IPN提供的样本编码看起来与上面的完全不同(我正在使用它)。
我将我的一个IPN页面修改为上面的建议(我已经有了额外的标题,但没有ssl:或443端口或修剪代码)。
今天早上虽然所有的IPN页面都在重新运行 - 不仅仅是修改后的页面 - 所以看起来PayPal已经再次播放了!
我无法在PayPal网站上找到此编码的链接,以查看是否需要进行任何其他更改。