PayPal IPN在一段时间后停止工作


PayPal IPN stops working after time

我手头有一个奇怪的问题。我有下面的PayPal IPN脚本处理用户激活等。当使用IPN模拟器时,该脚本运行良好(我还没有用SandBox帐户测试它)。剧本的现场表现也很好。问题是它在几次IPN调用后就停止了工作。为什么会发生这种情况?PayPal可能会屏蔽IPN呼叫吗?我不明白为什么剧本应该断断续续地运行。也许我明显遗漏了一些东西。所有账户都在PayPal端接收IPN。任何帮助都将不胜感激!

<?php
$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";
 } 
$headers = "From: DD Notifications'r'n";
$headers .= "Reply-To: notifications@deep-democracy.net'r'n";
$headers .= "MIME-Version: 1.0'r'n";
$headers .= "Content-Type: text/html; charset=ISO-8859-1'r'n";
$url = "http://www.paypal.com/cgi-bin/webscr";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_TIMEOUT, 3);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $req);
$result = curl_exec($ch);
curl_close($ch); 
if (strcmp ($result, "VERIFIED") == 0) {
$item_name = $_POST['item_name1'];
$item_number = $_POST['item_number1'];
$payment_status = $_POST['payment_status'];
$payment_amount = $_POST['mc_gross'];
$payment_currency = $_POST['mc_currency'];
$txn_id = $_POST['txn_id'];
$receiver_email = $_POST['receiver_email'];
$payer_email = $_POST['payer_email'];
$custom_var = $_POST['custom'];
require_once("../includes/db_connection.php");

    $result_sql = mysql_query("SELECT * FROM delegate_payments WHERE payment_id='$custom_var' AND payment_completed='No'");
    if (mysql_num_rows($result_sql) == 1) {
        mysql_query("UPDATE delegate_payments SET payment_completed='Yes' WHERE payment_id='$custom_var'");
        $row = mysql_fetch_array($result_sql);
        $amount = $row['payment_amount'];
        $names_array = explode(', ', $row['payment_content']);
        $result2_sql = mysql_query("SELECT * FROM users WHERE email='$payer_email'");
        $row = mysql_fetch_array($result2_sql);
        $current_amount = $row['amount_due'];
        $new_amount = $current_amount - $amount;
        mysql_query("UPDATE users SET amount_due='$new_amount' WHERE email='$payer_email'");
        foreach ($names_array as &$value) {
            mysql_query("UPDATE users SET activated='1' WHERE email='$value'");
            mail($value, $subject, $email_message, $headers);
            $result_sql = mysql_query("SELECT * FROM users WHERE email=$value");
            $row = mysql_fetch_array($result_sql);
            $name = $row['name']." ".$row['surname'];
            $city = $row['city'];
            $payee_email = $row['email'];
            $level = $row['level'];
            $country = $row['country'];
            $course_date = $row['course_date'];
        }
}
} else if (strcmp ($result, "INVALID") == 0) {
}
?>

我的猜测是,发送到脚本的数据偶尔会引发错误。您的脚本可能没有正确处理错误或丢失的数据。我过去所做的是在IPN脚本的每一行之间放一条日志语句,这样我就知道脚本什么时候爆炸了。您还应该使用贝宝沙盒来测试不同的场景。