我手上有一个奇怪的问题。我有以下PayPal IPN脚本处理用户激活等。使用IPN模拟器时脚本工作FINE(我还没有使用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) {
}
?>
答案 0 :(得分:0)
我的猜测是,发送到脚本的数据会导致偶尔抛出错误。您的脚本可能无法正确处理错误或丢失的数据。我过去所做的是在我的IPN脚本的任何一行之间放置一条日志语句,以便我知道脚本何时爆炸。您还应该使用Paypal Sandbox来测试不同的场景。