Платёжная система https://payeer.com предоставляет возможность подключить Мерчант, система работает, но, не работают многие вещи из PHP7 session как в пример, встроенные функции CMS, и с БД таже история, только вот получить выборку могу а fetch_assoc уже не хочет, пробую тот-же код в другом файле, вс' работает, вот код.
<?php
session_start();
if (!in_array($_SERVER['REMOTE_ADDR'], array('185.71.65.92', '185.71.65.189', '149.202.17.210'))) return;
if (isset($_POST['m_operation_id']) && isset($_POST['m_sign']))
{
$m_key = '7WQAI4KRscdgZC9S';
$arHash = array(
$_POST['m_operation_id'],
$_POST['m_operation_ps'],
$_POST['m_operation_date'],
$_POST['m_operation_pay_date'],
$_POST['m_shop'],
$_POST['m_orderid'],
$_POST['m_amount'],
$_POST['m_curr'],
$_POST['m_desc'],
$_POST['m_status']
);
if (isset($_POST['m_params']))
{
$arHash[] = $_POST['m_params'];
}
$arHash[] = $m_key;
$sign_hash = strtoupper(hash('sha256', implode(':', $arHash)));
if ($_POST['m_sign'] == $sign_hash && $_POST['m_status'] == 'success')
{
$ipconf = $_SERVER['HTTP_X_FORWARDED_FOR'];
$mysqli = new mysqli("*", "*", "*", "*");
$select_name = "SELECT name FROM `dle_users` WHERE logged_ip = '{$ipconf}';";
$name_bd = $mysqli->query($select_name);
$name_bdcomands = $name_bd->fetch_assoc();
$name = $name_bdcomands['name'];
$select_balance = "SELECT balance FROM `dle_users` WHERE logged_ip = '{$ipconf}';";
$balance_bd = $mysqli->query($select_balance);
$balance_bdcomands = $balance_bd->fetch_assoc();
$balance = $balance_bdcomands['balance'];
$update_money = "UPDATE `dle_users` SET `balance` = '{$balance}' WHERE `name` = '{$name}';";
$result = $mysqli->query($update_money);
if($result){
file_put_contents('stats.txt','123');
}else{
file_put_contents('stats.txt','Неудача sql');
}
ob_end_clean(); exit($_POST['m_orderid'].'|success');
}
file_put_contents('stats.txt','Неудача');
ob_end_clean(); exit($_POST['m_orderid'].'|error');
}
?>
Код который не работает:
$ipconf = $_SERVER['HTTP_X_FORWARDED_FOR'];
$mysqli = new mysqli("*", "*", "*", "*");
$select_balance = "SELECT balance FROM `dle_users` WHERE logged_ip = '{$ipconf}';";
$balance_bd = $mysqli->query($select_balance);
$balance_bdcomands = $balance_bd->fetch_assoc();
$balance = $balance_bdcomands['balance'];
Рекомендую включить в начало файла:
ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
Подозреваю что дело в использовании $ipconf = $_SERVER['HTTP_X_FORWARDED_FOR'];
$_SERVER['HTTP_X_FORWARDED_FOR'] - сюда прозрачный прокси-сервер кладет информацию о реальном IP пользователя, если прокси-сервер не прозрачный, то он ничего класть не будет, так же переменная будет пустой если прокси-сервер не используется.
Сделайте проверку
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])){
$ipconf = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$ipconf = $_SERVER['REMOTE_ADDR'];
}
Так же в целях отладки рекомендую записать в файл или вардампнуть значения получаемых переменных, например.
file_put_contents('remote_addr.txt', $_SERVER['REMOTE_ADDR']);
file_put_contents('http_x_forwarded_for.txt', $_SERVER['HTTP_X_FORWARDED_FOR']);
Помимо этого у вас в коде лишние точка с запятой в запросе.
$select_name = "SELECT name FROM `dle_users` WHERE logged_ip = '{$ipconf}';";
Должно быть
$select_name = "SELECT name FROM `dle_users` WHERE logged_ip = '{$ipconf}'";
Но если скрипт не вываливается с ошибками, то возможно дело в том, что в этих запросах передается пустой $ipconf, следовательно ничего не выбирается и не обновляется.
UPD
Посмотрите что у вас лежит в $name_bdcomands и $balance_bdcomands при выполнении скрипта.
->fetch_assoc(); формирует array значений. Учитывая что вы проверяете пользователей по IP, а не по user_id, у вас могут из-за этого быть ошибки, например нужно будет перебирать через while пользователей.
https://www.php.net/manual/ru/mysqli-result.fetch-assoc.php
Я бы рекомендовал вам отказаться от проверки пользователя по IP, т.к. это не надежно и ведет к ошибкам.
Куда правильнее передавать при оплате user_id (большинство платежных систем, агрегаторов всегда принимают и возвращают это значение при обработке платежа) и затем по нему делать запросы к БД, точно выделяя нужного пользователя из системы.
Примеры когда ваш код будет работать неверно из-за логики, а не из-за ошибок в самом коде:
У пользователя динамический IP, при регистрации ему записали одно значение. Через месяц он пытается оплатить, но IP уже другой и из базы его профиль не выбирается.
У вас зарегистрировался Петя с IP 111.111.111.111 в ПН, во вторник пришел Вася из соседнего дома и теперь у него IP 111.111.111.111. Вася пытается заплатить себе, а платит за Петю.
Ещё небольшой UPD
Payeer не передает данных пользователя. Но передает id операции. Следовательно вам нужно сделать таблицу платежей с двумя полями operation_id (primary, AI) и user_id в начале каждой оплаты писать в БД новую строку где operation_id создается автоматически а в user_id пишет id пользователя в DLE.
В платежной форме вы передаете operation_id и затем по возвращенной $_POST['m_orderid'] брать из этой таблицы ID пользователя и по нему обновлять баланс.
https://www.payeer.com/upload/pdf/PayeerMerchantru.pdf
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
В чем здесь ошибка? $update= $conn->query("UPDATE 'accounts' SET password=REPLACE(password,'%$2y$10$%','%$2a$10$%') where password like '%$2y$10$%'");
Ребят, подскажите, как правильно организовать поиск в одном конкретном столбце одинаковых значений ? При этом, эти значения заранее неизвестныМожет...