Спойлер
<?php
// проверка IP-адреса
$ip_checked = false;
foreach(array(
'HTTP_X_CLUSTER_CLIENT_IP',
'HTTP_X_FORWARDED_FOR',
'HTTP_X_FORWARDED',
'HTTP_FORWARDED_FOR',
'HTTP_FORWARDED',
'HTTP_CLIENT_IP',
'REMOTE_ADDR'
) as $param) {
if(!empty($_SERVER[$param]) && $_SERVER[$param] === '5.196.121.217') {
$ip_checked = true;
break;
}
}
if(!$ip_checked) {
die('error');
}
// проверка на наличие обязательных полей
// поля $payment_time и $debug могут дать true для empty() поэтому их нет в проверке
foreach(array(
'uid',
'amount',
'amount_shop',
'amount_client',
'currency',
'order_id',
'payment_method_id',
'payment_method_title',
'creation_time',
'client_email',
'status',
'signature'
) as $field) {
if(empty($_REQUEST[$field])) {
die('error');
}
}
// ваш секретный ключ
$secret_key = '0123456789abcdef';
// нормализация данных
$uid = (int)$_REQUEST["uid"];
$amount = (double)$_REQUEST["amount"];
$amount_shop = (double)$_REQUEST["amount_shop"];
$amount_client = (double)$_REQUEST["amount_client"];
$currency = $_REQUEST["currency"];
$order_id = $_REQUEST["order_id"];
$payment_method_id = (int)$_REQUEST["payment_method_id"];
$payment_method_title = $_REQUEST["payment_method_title"];
$creation_time = $_REQUEST["creation_time"];
$payment_time = $_REQUEST["payment_time"];
$client_email = $_REQUEST["client_email"];
$status = $_REQUEST["status"];
$debug = (!empty($_REQUEST["debug"])) ? '1' : '0';
$signature = $_REQUEST["signature"];
// проверка валюты
if(!in_array($currency, array('RUB', 'USD', 'EUR'), true)) {
die('error');
}
// проверка статуса платежа
if(!in_array($status, array('success', 'fail'), true)) {
die('error');
}
// проверка формата сигнатуры
if(!preg_match('/^[0-9a-f]{32}$/', $signature)) {
die('error');
}
// проверка значения сигнатуры
$signature_calc = md5(join(':', array(
$uid, $amount, $amount_shop, $amount_client, $currency, $order_id,
$payment_method_id, $payment_method_title, $creation_time, $payment_time,
$client_email, $status, $debug, $secret_key
)));
if($signature_calc !== $signature) {
die('error');
}
$db->Query("SELECT * FROM db_payeer_insert WHERE id = '".intval($_POST['order_id'])."'");
if($db->NumRows() == 0){ echo $_POST['order_id']."|error"; exit;}
$nm_row = $db->FetchArray();
if($nm_row["status"] > 0){ echo $_POST['order_id']."|success"; exit;}
$db->Query("UPDATE db_payeer_insert SET status = '1' WHERE id = '".intval($_POST['order_id'])."'");
$ik_payment_amount = $nm_row["sum"];
$user_id = $nm_row["user_id"];
# Настройки
$db->Query("SELECT * FROM db_config WHERE id = '1' LIMIT 1");
$sonfig_site = $db->FetchArray();
$db->Query("SELECT user, referer_id FROM db_users_a WHERE id = '{$user_id}' LIMIT 1");
$user_ardata = $db->FetchArray();
$user_name = $user_ardata["user"];
$refid = $user_ardata["referer_id"];
// обработка платежа
switch($status) {
case 'success':
// время соверешния платежа в Unix timestamp (если нужно)
$payment_time_ts = strtotime($payment_time);
// ваш код при успешной оплате
# Зачисляем баланс
$serebro = sprintf("%.4f", floatval($sonfig_site["ser_per_wmr"] * $ik_payment_amount) );
$db->Query("SELECT insert_sum FROM db_users_b WHERE id = '{$user_id}' LIMIT 1");
$ins_sum = $db->FetchRow();
$serebro = intval($ins_sum <= 0.01) ? ($serebro + ($serebro * 0.1) ) : $serebro;
$add_tree = ( $ik_payment_amount >= 499.99) ? 2 : 0;
$lsb = time();
$to_referer = ($serebro * 0.10);
$db->Query("UPDATE db_users_b SET money_b = money_b + '$serebro', to_referer = to_referer + '$to_referer', last_sbor = '$lsb', insert_sum = insert_sum + '$ik_payment_amount' {$bonus} WHERE id = '{$user_id}'");
# Зачисляем средства рефереру и дерево
$add_tree_referer = ($ins_sum <= 0.01) ? ", a_t = a_t + 1" : "";
$db->Query("UPDATE db_users_b SET money_b = money_b + $to_referer, from_referals = from_referals + '$to_referer' {$add_tree_referer} WHERE id = '$refid'");
# Статистика пополнений
$da = time();
$dd = $da + 60*60*24*15;
$db->Query("INSERT INTO db_insert_money (user, user_id, money, serebro, date_add, date_del)
VALUES ('$user_name','$user_id','$ik_payment_amount','$serebro','$da','$dd')");
# Платежные баллы
$pp = new pay_points($db);
$pp ->UpdatePayPoints($ik_payment_amount,$user_id);
# Конкурс
$competition = new competition($db);
$competition->UpdatePoints($user_id, $ik_payment_amount);
# Обновление статистики сайта
$db->Query("UPDATE db_stats SET all_insert = all_insert + '$ik_payment_amount' WHERE id = '1'");
break;
case 'fail':
// ваш код при отмене или истечении платежа
// ...
break;
}
// успешный ответ для Мегакассы и завершение скрипта
die('ok');
?>