PAYEER Мерчант, получение данных с БД

79
16 февраля 2022, 14:50

Платёжная система 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']; 
Answer 1

Рекомендую включить в начало файла:

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

READ ALSO
Обновление с заменой

Обновление с заменой

В чем здесь ошибка? $update= $conn->query("UPDATE 'accounts' SET password=REPLACE(password,'%$2y$10$%','%$2a$10$%') where password like '%$2y$10$%'");

104
Поиск совпадений в столбце таблицы БД

Поиск совпадений в столбце таблицы БД

Ребят, подскажите, как правильно организовать поиск в одном конкретном столбце одинаковых значений ? При этом, эти значения заранее неизвестныМожет...

84
Не открывается файл через вордпресс

Не открывается файл через вордпресс

Подключаю файл SxGeophp для определения страны пользователя

80