У меня странная проблема на руках. У меня есть приведенный ниже скрипт IPP PayPal, обрабатывающий пользовательские активации и т. Д. Этот скрипт работает FINE при использовании симулятора IPN (я еще не тестировал его с учетной записью SandBox). Скрипт также отлично работает вживую. Проблема в том, что он перестает работать после пары вызовов IPN. Есть ли причина, по которой это могло бы произойти? Возможно, PayPal блокирует вызовы IPN? Я не понимаю, почему скрипт должен работать и выключаться. Возможно, здесь есть что-то очевидное, чего мне не хватает. По всем аккаунтам IPN принимаются на конец PayPal. Любая помощь будет оценена!
<?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: [email protected]\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) {
}
?>
Я предполагаю, что данные, отправляемые в ваш скрипт, иногда вызывают ошибку. Ваш скрипт, вероятно, неправильно обрабатывает плохие или отсутствующие данные. То, что я делал в прошлом, это помещал оператор log между всеми строками моего сценария IPN, чтобы я знал, когда сценарий сработает. Вам также следует использовать песочницу Paypal для тестирования различных сценариев.
Других решений пока нет …