php Покупка привилегий, help

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
316
Реакции
131
Помог
4 раз(а)
Хочу сделать покупки привилегий работающую с бд csbans`a и сервисом freekassa
Все просто, думал я, ага :crazy: Покидайте какие нибудь идеи, предложения, правки или то или сё или что-то еще или иное, ща взорвусь хелп


Сделал форму, обработчик формы, резаулт, от части все работает.
1. Сложно разобраться как сделать зависимые селекты. Выбрать сервер и в селекте ниже услуги именно для этого сервера
2. Мне кажется не правильно сделал обработчик :dntknw: , мб надо чтоб сразу с index.php перекидывало на кассу
3. Как передать флаги доступа, тут вообще жестко, думается надо выбирать услугу по id как то соединить с id выбранного сервера и что то дальше... :wacko:

4. Что-то еще уже не помню, потом добавлю

PHP:
<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <meta name="description" content="">
    <title>Покупка привилегий онлайн</title>

    <!-- Latest compiled and minified CSS -->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css">

    <!-- jQuery library -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

    <!-- Popper JS -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js"></script>

    <!-- Latest compiled JavaScript -->
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"></script>

    <!-- Font Awesome Icons -->
    <link rel="stylesheet" href="https://use.fontawesome.com/64ff6e1601.css">

    <!-- Google Fonts -->
    <link href="https://fonts.googleapis.com/css?family=Arimo" rel="stylesheet">

    <!-- My CSS -->
    <link rel="stylesheet" href="styles.css">

    <!-- My JavaScript -->
    <script src="my_js.js"></script>

    <!-- PHP Includes -->
    <?php
        require_once ('cfg.php');
        require_once ('database.php');
        require_once ('mon/index.php');
    ?>
</head>

<body>
    <div class="container">
        <div class="content">
            <h4>Покупка привилегий онлайн</h3>
            <hr>
            <div class="row">

                <!-- start block -->
                <div class="col-sm-6">
                    <form method="GET" action="test_action.php" autocomplete="off">
                        <div class="form-group">
                            <label><i class="fa fa-keyboard-o"></i> Сервера</label>
                            <select class="form-control form-control-sm" name="us_servername" id="us_servername" onchange="(this.value);" required>
                                <option value="0" disabled="disabled" selected="selected">Выбрать сервер</option>
                                <?= $form_server ;?>
                            </select>
                        </div>
                        <div class="form-group">
                            <label><i class="fa fa-star"></i> Привилегии</label>
                            <select class="form-control form-control-sm" name="oa" onchange='(this.value)' required>
                                <option value="" disabled="disabled" selected="selected" name="servertarif">Выбрать привилегию</option>
                                <?=$form_tarif;?>
                            </select>
                        </div>
                        <div class="form-group">
                            <label><i class="fa fa-calendar"></i> Срок услуги</label>
                            <select class="form-control form-control-sm" name="us_date" onchange='(this.value)' required>
                                <option value="" disabled="disabled" selected="selected" name="serverdate">Выбрать срок</option>
                                <?=$form_date;?>
                            </select>
                        </div>
                        <div class="form-group form-background">
                            <div class="row">
                                <div class="col">
                                    <label><i class="fa fa-user"></i> Ник в игре</span></label>
                                <input type="text" name="us_nickname" placeholder="Ваш никнейм" class="form-control form-control-sm" maxlength="32" required>
                                </div>
                                <div class="col">
                                    <label><i class="fa fa-lock"></i> Ваш пароль</label>
                                    <div style="float:right;font-size:13px;color:#007bff;">
                                        <i class="fa fa-eye" aria-hidden="true"></i>
                                        <a href="#" id="s-h-pass"> Показать пароль</a>
                                    </div>
                                    <input id="password" type="password" name="us_password" placeholder="Придумайте пароль " pattern="^[\w]{4,32}$" class="form-control form-control-sm" required>
                                </div>
                            </div>
                            <small class="form-text text-muted">Ник и пароль вводить только на английском!</small>
                        </div>
                        <input class="btn btn-lg btn-block btn-dark" type="submit" value="Купить" name="submit">
                    </form>
                </div>
                <!-- end block -->

                <!-- start block -->
                <div class="col-sm-6">
                    <div class="card text-white bg-dark">
                        <div class="card-header"><?=$hostname;?></div>
                            <div class="card-body">
                                <div class="row">
                                    <div class="col-md-4"><?=$mapimage;?></div>
                                    <div class="col-md-8">
                                        <b><i class="fa fa-location-arrow" style="width: 15px;"></i> Адрес:</b> <?=$serverip.':'.$serverport;?> <br>
                                        <b><i class="fa fa-users" style="width: 15px;"></i> Игроки:</b> <?=$players.'/'.$maxplayers;?> <br>
                                        <b><i class="fa fa-map-marker" style="width: 15px;"></i> Карта:</b> <?=$map;?> <br>
                                        <a class="btn btn-warning btn-sm" href="steam://connect/<?=$serverip.':'.$serverport;?>">Подключиться через Steam</a>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
                <!-- end block -->

            </div>
        </div>
    </div>
</body>
</html>

PHP:
<?php
// freekassa
/*
$merchant_id = ''; // shop id
$secret_word = ''; // secret key
$get_order_id = $_GET['us_servername']; // order id
$get_order_amount = $_GET['oa']; // cost
$get_date = $_GET['us_date']; // date
$get_nick = $_GET['us_nickname']; // nickname
$get_pass = md5($_GET['us_password']); // password
$get_sign = md5($merchant_id.':'.$get_order_amount.':'.$secret_word.':'.$get_order_id); // hash
*/
// server status
$serverip = '46.174.52.237';
$serverport = '27015';
PHP:
<?php
require_once ('cfg.php');
//require_once ('classes.php');

$driver = 'mysql';
$host = '127.0.0.1'; // host
$db_name = 'csbans'; // data base
$db_user = ''; // user
$db_pass = ''; // password
$charset = 'utf8';
$options = [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION];

try {
    $pdo = new PDO("$driver:host=$host;dbname=$db_name;charset=$charset", $db_user, $db_pass, $options);
} catch (PDOException $e) {
    die('Не могу подключиться к базе данных :(');
}

# CREATE TABLE `csbans`.`amx_buy` ( `idt` INT(11) NOT NULL ,  `name` VARCHAR(60) NOT NULL ,  `time` VARCHAR(60) NOT NULL ,  `cost` VARCHAR(60) NOT NULL ,  `flags` VARCHAR(60) NOT NULL
// запросы к бд
$get_servers = $pdo->query("SELECT id, hostname, address, rcon FROM amx_serverinfo");
$get_shop = $pdo->query("SELECT * FROM amx_buy");
$get_admins = $pdo->query("SELECT username, password, access, flags, nickname, ashow, created, expired, days FROM amx_amxadmins");

// вывод 3 последних админов
//$get_lastadmins = $pdo->query("SELECT nickname, created, expired FROM amx_amxadmins ORDER BY id DESC LIMIT 0,3");

while ( $server = $get_servers->fetch(PDO::FETCH_ASSOC) ) {
    $form_server .= '<option value="'.$server['id'].'" name="form_server" id="form_server">'.$server['hostname'].' ['.$server['address'].']</option>';
}

// вывод услуг и их даты
while ( $shop = $get_shop->fetch(PDO::FETCH_ASSOC) ) {
    $form_tarif .= '<option value="'.$shop['cost'].'" name="form_tarif" id="form_tarif">'.$shop['name'].' - '.$shop['cost'].' руб. ['.$shop['flags'].'] </option>';
    $form_date .= '<option value="'.$shop['time'].'" name="form_date" id="form_date">'.$shop['time'].' суток </option>';
}

// functions
// @author BLVCKMANIA.
$time = time();
/* Фильтация данных */
function fl($m){
    $m = abs($m);
    $m = intval($m);
    return $m;
}
/* Работаем с базой данных */
function qry($sql, $params = array()) {
    global $base;
    $stmt = $base -> prepare($sql);
    $stmt -> execute($params);
    return $stmt;
}
/* Для обычного запроса */
function cnt($sql, $params = array()) {
    global $base;
    $stmt = $base -> prepare($sql);
    $stmt -> execute($params);
    $stmt = $stmt->rowCount();
    return $stmt;
}
/* Для вывода запроса с подсчетом */
function obj($sql, $params = array()) {
    global $base;
    $stmt = $base -> prepare($sql);
    $stmt -> execute($params);
    $stmt = $stmt->FetchAll(PDO::FETCH_OBJ);
    return $stmt;
}
/* Для вывода объектного массива */
function acc($sql, $params = array()) {
    global $base;
    $stmt = $base -> prepare($sql);
    $stmt -> execute($params);
    $stmt = $stmt->FetchAll(PDO::FETCH_ASSOC);
    return $stmt;
}
/* Для вывода ассоциотивного массива */
function fch($sql, $params = array()) {
    global $base;
    $stmt = $base -> prepare($sql);
    $stmt -> execute($params);
    $stmt = $stmt->fetch();
    return $stmt;
}
/* Для вывода массива */
function tm($time=NULL){
    if ($time == NULL)$time = time();
    $timep="".date("j M Y", $time)."";
    $time_p[0]=date("j n Y", $time);
    $time_p[1]=date("H:i", $time);
    if ($time_p[0] == date("j n Y"))$timep = date("H:i", $time);
    if ($time_p[0] == date("j n Y", time()-60*60*24))$timep = "$time_p[1]";
    $timep=str_replace("Jan","01",$timep);
    $timep=str_replace("Feb","02",$timep);
    $timep=str_replace("Mar","03",$timep);
    $timep=str_replace("May","04",$timep);
    $timep=str_replace("Apr","05",$timep);
    $timep=str_replace("Jun","06",$timep);
    $timep=str_replace("Jul","07",$timep);
    $timep=str_replace("Aug","08",$timep);
    $timep=str_replace("Sep","09",$timep);
    $timep=str_replace("Oct","10",$timep);
    $timep=str_replace("Nov","11",$timep);
    $timep=str_replace("Dec","12",$timep);
    return $timep;
}
?>
JavaScript:
$( document ).ready(function() {
    // показать и скрыть пароль в форме
    $('#s-h-pass').click(function(){
        var type = $('#password').attr('type') == "text" ? "password" : 'text',
         c = $(this).text() == "Скрыть пароль" ? "Показать пароль" : "Скрыть пароль";
        $(this).text(c);
        $('#password').prop('type', type);
    });

    // выбор value в select`ах
    /*
    function function1337(val) {
        //alert("value = " + val);
    }
    */

    // выбор сервера в селекте
    $('#us_servername').on('change', function(e) {
        $.get('/test1/test_action.php', {
            serverid: $(this).val()
        });
    });
});
PHP:
<?php
$merchant_id = ''; // shop id
$secret_word = ''; // secret key
$get_order_id = $_GET['us_nickname']; // order id
$get_order_amount = $_GET['oa']; // cost
$get_date = $_GET['us_date']; // date
$get_nick = $_GET['us_nickname']; // nickname
$get_pass = md5($_GET['us_password']); // password
$get_sign = md5($merchant_id.':'.$get_order_amount.':'.$secret_word.':'.$get_order_id); // hash

$value = filter_input(INPUT_GET , 'serverid', FILTER_VALIDATE_INT);
var_dump($value);
?>
<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <meta name="description" content="">
    <title>Покупка привилегий онлайн</title>

    <!-- Latest compiled and minified CSS -->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css">

    <!-- jQuery library -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

    <!-- Popper JS -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js"></script>

    <!-- Latest compiled JavaScript -->
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"></script>

    <!-- Font Awesome Icons -->
    <link rel="stylesheet" href="https://use.fontawesome.com/64ff6e1601.css">

    <!-- Google Fonts -->
    <link href="https://fonts.googleapis.com/css?family=Arimo" rel="stylesheet">

    <!-- My CSS -->
    <link rel="stylesheet" href="styles.css">

    <!-- My JavaScript -->
    <script src="my_js.js"></script>

    <!-- PHP Includes -->
    <?php
        require_once ('cfg.php');
        require_once ('database.php');
        require_once ('mon/index.php');
    ?>
</head>

<body>
    <div class="container">
        <div class="content">
            <h4>Покупка привилегий онлайн</h3>
            <hr>
            <div class="row">

                <!-- start block -->
                <div class="col-sm-6">
                    <form method="GET" action="http://www.free-kassa.ru/merchant/cash.php">
                        <input type="hidden" name="s" value="<?=$get_sign;?>">
                        <input type="hidden" name="o" value="<?=$get_order_id;?>">
                        <input type="hidden" name="m" value="<?=$merchant_id;?>">
                        <input type="hidden" name="us_password" value="<?=$get_pass;?>">
                        <input type="hidden" name="oa" value="<?=$get_order_amount;?>">
                        <input type="hidden" name="us_date" value="<?=$get_date;?>">
                        <input type="hidden" name="us_nickname" value="<?=$get_nick;?>">
                        <input class="btn btn-lg btn-block btn-dark" type="submit" name="submit" value="Да все окей забирайте деньги (оплатить)">
                    </form>
                    <br>
                    <div class="card text-white bg-danger mb-3">
                        <div class="card-header">Важно</div>
                            <div class="card-body">
                            <p class="card-text">Вы соглашаетесь с <a href="#" target="_blank">правилами</a>, возврат средств будет невозможен, 11 сентября устроило правительство, а бога нет</p>
                        </div>
                    </div>
                </div>
                <!-- end block -->

                <!-- start block -->
                <div class="col-sm-6">
                    <div class="card text-white bg-dark">
                        <div class="card-header"><?=$hostname;?></div>
                            <div class="card-body">
                                <div class="row">
                                    <div class="col-md-4"><?=$mapimage;?></div>
                                    <div class="col-md-8">
                                        <b><i class="fa fa-location-arrow" style="width: 15px;"></i> Адрес:</b> <?=$serverip.':'.$serverport;?> <br>
                                        <b><i class="fa fa-users" style="width: 15px;"></i> Игроки:</b> <?=$players.'/'.$maxplayers;?> <br>
                                        <b><i class="fa fa-map-marker" style="width: 15px;"></i> Карта:</b> <?=$map;?> <br>
                                        <a class="btn btn-warning btn-sm" href="steam://connect/<?=$serverip.':'.$serverport;?>">Подключиться через Steam</a>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
                <!-- end block -->

            </div>
        </div>
    </div>
</body>
</html>
PHP:
<?php
$merchant_id = '';
$merchant_secret = ''; // maybe key #2

function getIP() {
if(isset($_SERVER['HTTP_X_REAL_IP'])) return $_SERVER['HTTP_X_REAL_IP'];
return $_SERVER['REMOTE_ADDR'];
}/*
if (!in_array(getIP(), array('136.243.38.147', '136.243.38.149', '136.243.38.150', '136.243.38.151', '136.243.38.189', '88.198.88.98'))) {
die("hacking attempt!");
}
*/

$sign = md5($merchant_id.':'.$_REQUEST['AMOUNT'].':'.$merchant_secret.':'.$_REQUEST['MERCHANT_ORDER_ID']);

if ($sign != $_REQUEST['SIGN']) {
die('wrong sign');
}

//Так же, рекомендуется добавить проверку на сумму платежа и не была ли эта заявка уже оплачена или отменена
//Оплата прошла успешно, можно проводить операцию.

// ====================================
// mysqli для тестов, нужно делать через pdo или redbean
$servername = "127.0.0.1";
$database = "csbans";
$username = "";
$password = "";
// Create connection
$conn = mysqli_connect($servername, $username, $password, $database);

// Check connection
if (!$conn) {
      die("Connection failed: " . mysqli_connect_error());
}

$nick = $_REQUEST['us_nickname'];
$pass = $_REQUEST['us_password'];
$date = $_REQUEST['us_date'];

$sql = "INSERT INTO amx_amxadmins (nickname, password, days) VALUES ('{$nick}', '{$pass}', '{$date}')";
if (mysqli_query($conn, $sql)) {
      echo "New record created successfully";
} else {
      echo "Error: " . $sql . "<br>" . mysqli_error($conn);
}
mysqli_close($conn);
// ====================================

die('YES');
?>

fantom , oxoTHuk
9 Янв 2019
Архив со всем мб надо кому, а мне нужно поспать
 
В этой теме было размещено решение! Перейти к решению.
Последнее редактирование:
Сообщения
2,491
Реакции
2,790
Помог
61 раз(а)
alabamaster1337, я уже завтра гляну что к чему. Но файл я удалил. Там в конфиге не убрали secret_word. Перезалейте плз архив, но оставьте секретные данные пустыми. И еще на всякый случай смените его.
 
Сообщения
316
Реакции
131
Помог
4 раз(а)
sas333, совершенство в простоте и минимализм рулит, а ксбансом много кто пользуется
 
Сообщения
80
Реакции
24
alabamaster1337, У меня бан лист отдельно стоит Скрипт покупки привилегий отдельно и всё устраивает. Тут конечно кому как, но лучше считаю сделать отдельно так как функционал будет больше. Это конечно лично моё мнение. Например у меня в скрипте есть чат есть возможность установить игроку любую модель себе на сервере.
10 Янв 2019
Скриншот загрузить не получилось так бы наглядно показал. Хотя думаю и так понятно о чём речь.
 
Сообщения
316
Реакции
131
Помог
4 раз(а)
sas333, так если уже есть такое, зачем еще делать. Что-то простенькое надо, лаитовое, вот и хочу сделать
 

Вложения

Сообщения
80
Реакции
24
а что за скрипт покупки привилегий стоит?
Всё верно как сказал Izmayl7 стоит Buy Privileges переделанный.
10 Янв 2019

так если уже есть такое, зачем еще делать
У вас только привилегии можно покупать или так же можно модели ставить? Есть платный разбан, покупка опыта?
 
Сообщения
2,491
Реакции
2,790
Помог
61 раз(а)
sas333, ну хочет человек свое, его право. Да и в даном конкретном случае я даже рад, что он вместо скачки непонятных сливов, покупки и прочего сел и начал сам разбиратся. Конешно получилось не идеально. Но это огромный плюс. И я считаю его отличным примером для многих тут на форуме. Вместо ждать помощи, он сел и сам сделал. Вы же для себя обрали другой путь.
 
Сообщения
316
Реакции
131
Помог
4 раз(а)
sas333, нету такого, и даже полноценной покупки нет, я поэтому тему и создал :)
 
Сообщения
316
Реакции
131
Помог
4 раз(а)
Не могу сделать запрос к бд, если выполнять через майадмин то все норм, а вардамп возвращает фолсе
SQL:
START TRANSACTION;
SET AUTOCOMMIT=0;
INSERT INTO amx_amxadmins (id, steamid, nickname, password, access, flags, created, expired, ashow, days) VALUES (NULL, 'ник', 'ник', 'пас', 'а', 'флаг', 'тиме', 'тиме', '1', 'енд');
INSERT INTO amx_admins_servers (admin_id, server_id, use_static_bantime) VALUES (last_insert_id(), 'id', 'no');
COMMIT;
14 Янв 2019
Стал юзать pdo и проблемы с запросами ушли
Есть пара вопросов по функции
PHP:
function serverlist()
{
    global $pdo; // глобаляная переменная из database.php
    $result = $pdo->query("SELECT id, hostname FROM amx_serverinfo ORDER BY id"); // делаем запрос
    $count = $result->rowCount(); // получаем кол-во строк в запросе
    if( $count > 0 ) // если строк больше чем 0
    {
        $list = '';
        while( $row = $result->fetch(PDO::FETCH_ASSOC) )
        {
            # как лучше?
            #$list .= "<option value=\"" . $row["id"] . "\">" . $row["hostname"] . "</option>" . PHP_EOL;
            $list .= '<option value="' .$row["id"]. '">' .$row["hostname"]. '</option>';
        }
    }
    else // если пусто (0 строк)
    {
        $list = '';
    }

    echo "\r\n\t\t\t<select class=\"form-control form-control-sm\" id=\"server\" name=\"server\" OnChange=\"tarif_list(); time_list(); sel_server();\" required>\r\n\t\t\t\t<option value=\"0\" disabled=\"disabled\" selected=\"selected\">Выбрать сервер</option>\r\n\t\t\t\t" . $list . "\r\n\t\t\t</select>";
    # почему то не возвращает
    #return "\r\n\t\t\t<select class=\"form-control form-control-sm\" id=\"server\" name=\"server\" OnChange=\"tarif_list(); time_list(); sel_server();\" required>\r\n\t\t\t\t<option value=\"0\" disabled=\"disabled\" selected=\"selected\">Выбрать сервер</option>\r\n\t\t\t\t" . $list . "\r\n\t\t\t</select>";
}
 
Сообщения
2,491
Реакции
2,790
Помог
61 раз(а)
Не могу сделать запрос к бд, если выполнять через майадмин то все норм, а вардамп возвращает фолсе
mysqli позволяет слать только 1 запрос. Но тут сразу AUTOCOMMIT не нужно отключать. А транзакция включается через API драйвера. Это значит что не нужно слать START TRANSACTION; и COMMIT
14 Янв 2019
Лучшая практика это вообше не пхать вывод в логику. Самым правильным будет создать функцию котоаря возратит массив (Еще правильнее колекцию иттератор) и уже ее использовать в выводе. А так то вроде второй. В первом что то с кавычками не все ок как мне показалось
 
Сообщения
957
Реакции
1,184
Помог
52 раз(а)
А так то вроде второй. В первом что то с кавычками не все ок как мне показалось
+ если двойные кавычки, пыха пытается распарсить и найти переменные внутри. Тут либо переменные без конкатенации делать, либо ставить одинарки, либо sprintf. Но лучше вывод вообще убрать, как уже сказано
 
Сообщения
316
Реакции
131
Помог
4 раз(а)
Вау, спасибо, а почему return на срабатывает?
 
Сообщения
2,491
Реакции
2,790
Помог
61 раз(а)
alabamaster1337, тут уже не могу дать точного ответа. Я уже предлагал вам выносить вывод в отдельные файлы в которых у вас появится возможность писать HTML в не контекста строк PHP
 
Статус
В этой теме нельзя размещать новые ответы.

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу