Доступ к готовым решениям

Переход в группу "Пользователь"

300.00 ₽
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Автоматическое пополнение счета ROBOKASSA

Статус
В этой теме нельзя размещать новые ответы.

CRAZy_Str

Специалист
Всем привет, решил написать небольшой мануал по пополнению счета с использованием ROBOKASSA а так же с последующей интеграцией в другие платёжные системы где это возможно к примеру
Приступим, создадим таблицу rkassa
PHP:
CREATE TABLE IF NOT EXISTS `rkassa` (
`id` int(11) NOT NULL COMMENT 'Порядковый номер',
  `order_id` int(11) NOT NULL COMMENT 'Номер счета',
  `userid` int(11) NOT NULL COMMENT 'Номер аккаунта',
  `money` int(11) NOT NULL COMMENT 'Сумма',
  `status` int(11) NOT NULL COMMENT 'Статус оплаты',
  `date` int(11) NOT NULL COMMENT 'Дата платежа',
  `crc` text NOT NULL COMMENT 'Подпись',
  `status1` int(11) NOT NULL COMMENT 'Успех или нет'
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
ALTER TABLE `rkassa`
 ADD PRIMARY KEY (`id`);
ALTER TABLE `rkassa`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Порядковый номер',AUTO_INCREMENT=1;
Создали? Поехали дальше
для примера я создал таблицу с зарегистрированными игроками для проверки работоспособности тоже можете её добавить
PHP:
CREATE TABLE IF NOT EXISTS `user` (
`pID` int(11) NOT NULL COMMENT 'Номер аккаунта',
  `pDonateMoney` int(11) NOT NULL COMMENT 'Кол-во донат денег',
  `pOnline` int(1) NOT NULL COMMENT 'Статус на сервере или нет'
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

--
-- Дамп данных таблицы `user`
--

INSERT INTO `user` (`pID`, `pDonateMoney`, `pOnline`) VALUES
(1, 455, 0),
(2, 12, 0);
ALTER TABLE `user`
 ADD PRIMARY KEY (`pID`);
ALTER TABLE `user`
MODIFY `pID` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Номер аккаунта',AUTO_INCREMENT=3;
Всё база готова, приступим к форме и обработчику.

Создадим файл config.php в нём нам все необходимые конфигурации для работы

PHP:
<?php
defined("DBHOST") ? null : define("DBHOST", "localhost");//Хост
defined("DBUSER") ? null : define("DBUSER", " ");//Имя пользователя базы данных
defined("DBPASS") ? null : define("DBPASS", " ");//Пароль базы данных
defined("DBNAME") ? null : define("DBNAME", " ");//Название базы

defined("users") ? null : define("users", "user");//Таблица с пользователями user
defined("userid") ? null : define("userid", "pID");//Номер аккаунта pID
defined("dmoney") ? null : define("dmoney", "pDonateMoney");//Поле с донатом DonateMoney
defined("online") ? null : define("online", "pOnline");//Поле с активностью игрока на сервере или нет

defined("mrh_login") ? null : define("mrh_login", " ");//Идентификатор магазина
defined("mrh_pass1") ? null : define("mrh_pass1", " ");//Пароль 1
defined("mrh_pass2") ? null : define("mrh_pass2", " ");//Пароль 2

$mysqli = new mysqli(DBHOST, DBUSER, DBPASS, DBNAME);
if (mysqli_connect_errno()) 
{
    printf("Не удалось подключиться к базе данных: %s\n", mysqli_connect_error());
    exit();
}
Создали, теперь приступим к форме пополнения счёта и оформлении платежа создадим к примеру файл index.php или payment.php

PHP:
<?php
error_reporting(-1);//Выводим ошибки но тут их нет
ini_set("display_errors", -1);//Выводим ошибки но тут их нет
header("Content-Type: text/html; charaset=UTF-8");
require("config.php");//Подключаем файл конфигурации

if(isset($_POST['submit']))
{
    $userid = isset($_POST['userid']) ? $_POST['userid'] : false;//Проверяем на пустоту
    $userid = (int)$userid;//пропускаем только значение integer
    
    $money = isset($_POST['money']) ? $_POST['money'] : false;//Проверяем на пустоту
    $money = (int)$money;//пропускаем только значение integer
    
    if($userid == false or $money == false)//Проверяем значение пусто или не пусто в любом случае пока он не заполнит оба поля ему вылезет ошибка что не заполнил все поля
    {
        echo "<!DOCTYPE html>
                <html>
                    <head>
                        <meta charset=\"utf8\">
                    </head>
                    <body>
                        <h1>Заполните все поля</h1>
                    </body>
                </html>";
    }
    else
    {
        $query = $mysqli->query("SELECT `" . userid . "`, `" . online . "` FROM `" . users . "` WHERE `" . userid . "` = '{$userid}' LIMIT 1");//Достаём 2 параметра из таблицы это номер аккаунт естественно и статус игрока в сети он или нет
        $result = $query->fetch_array();
        if(!$result)//Проверяем если в ответе пришло 0 или false значит пользователя с таким аккаунтом не существует
        {
            echo "<!DOCTYPE html>
                    <html>
                        <head>
                            <meta charset=\"utf8\">
                        </head>
                        <body>
                            <h1>Данный пользователь не зарегистрирован</h1>
                        </body>
                    </html>";
        }
        else//Если же существует то 
        {
            if($result[online] > 0)//Проверяем в игре он или нет, если в игре то не пускаем его к дальнейшему пополнению счета
            {
                echo "<!DOCTYPE html>
                        <html>
                            <head>
                                <meta charset=\"utf8\">
                            </head>
                            <body>
                                <h1>Даный персонаж в сети</h1>
                            </body>
                        </html>";
            }
            else//Если же не в сети то 
            {
                $order = $userid+time();//Номер счёта
                $mrh_login = "" . mrh_login . "";//Идентификатор клиента
                $mrh_pass1 = "" . mrh_pass1 . "";//Пароль 1
                $desc = "Пополнение счёта игрового аккаунта №{$userid} сумма {$money} номер счёта {$order}";//Описание платежа
                $in_curr = "";//// предлагаемая валюта платежа, я обычно пустой оставляю
                $culture = "ru";//Язык

                $crc = md5("{$mrh_login}:{$money}:{$order}:{$mrh_pass1}:Shp_item={$userid}");// формирование подписи
                $insert = $mysqli->query("INSERT INTO `rkassa` 
                                        (`order_id`, `userid`, `money`, `status`, `date`, `crc`, `status1`) 
                                            VALUES
                                        ('{$order}', '{$userid}', '{$money}', '0', '" . time() . "', '{$crc}', '0')");//Записываем информацию в базу для проверки и начисления
                echo "<!DOCTYPE html>
                        <html>
                            <head>
                                <meta charset=\"utf8\">
                                <title>Проверка платежа</title>
                                <style>
                                    .form {
                                        position: static;
                                        background-color: #dbdbdb;
                                        width: 400px;
                                        float: center;
                                        margin-top: 400px;
                                    }
                                    .form input {
                                        border: 0px;
                                        height: 40px;
                                        width: 200px;
                                        margin-bottom: 15px;
                                    }
                                    .form img {
                                        margin-top: 15px;
                                    }
                                </style>
                            </head>
                            <body>
                                <center>
                                    <form action=\"http://test.robokassa.ru/Index.aspx\" method=\"POST\" class=\"form\"><!-- если магазин активировали то ставим ссылку https://merchant.roboxchange.com/Index.aspx--><!--если для проведения тестовых платежей то http://test.robokassa.ru/Index.aspx -->
                                        <img src=\"https://partner.robokassa.ru/Content/images/robo_main_logo.png\">
                                        <br />
                                        <input type=\"text\" value=\"Номер аккаунта: {$userid}\" disabled>
                                        <br />
                                        <input type=\"text\" value=\"Сумма платежа: {$money}\" disabled>
                                        <br />
                                        <input type=\"hidden\" name=\"MrchLogin\" value=\"{$mrh_login}\">
                                        <input type=\"hidden\" name=\"OutSum\" value=\"{$money}\">
                                        <input type=\"hidden\" name=\"InvId\" value=\"{$order}\">
                                        <input type=\"hidden\" name=\"Desc\" value=\"{$desc}\">
                                        <input type=\"hidden\" name=\"SignatureValue\" value=\"{$crc}\">
                                        <input type=\"hidden\" name=\"Shp_item\" value=\"{$userid}\">
                                        <input type=\"hidden\" name=\"IncCurrLabel\" value=\"{$in_curr}\">
                                        <input type=\"hidden\" name=\"Culture\" value=\"{$culture}\">
                                        <input type=\"submit\" value=\"Продолжить\">
                                    </form>
                                </center>
                            </body>
                        </html>";
            }
        }
    }
}
else
{
    echo "<!DOCTYPE html>
            <html>
                <head>
                    <meta charset=\"utf8\">
                    <title>Пополнение счёта</title>
                    <style>
                        .form {
                            position: static;
                            background-color: #dbdbdb;
                            width: 400px;
                            float: center;
                            margin-top: 400px;
                        }
                        .form input {
                            border: 0px;
                            height: 40px;
                            width: 200px;
                            margin-bottom: 15px;
                        }
                        .form img {
                            margin-top: 15px;
                        }
                    </style>
                </head>
                <body>
                    <center>
                        <form action=\"\" method=\"POST\" class=\"form\">
                            <img src=\"https://partner.robokassa.ru/Content/images/robo_main_logo.png\">
                            <br />
                            <input type=\"text\" name=\"userid\" value=\"\" placeholder=\"Введите номер аккаунта\">
                            <br />
                            <input type=\"text\" name=\"money\" value=\"\" maxlength=\"5\" placeholder=\"Введите сумму платежа\">
                            <br />
                            <input type=\"submit\" value=\"Продолжить\" name=\"submit\">
                        </form>
                    </center>
                </body>
            </html>";
}
$mysqli->close();//Закрываем соединение с базой данных
Теперь нам необходимо создать ещё 4 файла
success.php
PHP:
<?php
require("config.php");
// регистрационная информация (пароль #1)
// registration info (password #1)
$mrh_pass1 = "" . mrh_pass1 . "";

// чтение параметров
// read parameters
$out_summ = $_REQUEST["OutSum"];
$inv_id = $_REQUEST["InvId"];
$shp_item = $_REQUEST["Shp_item"];
$crc = $_REQUEST["SignatureValue"];

$crc = strtoupper($crc);

$my_crc = strtoupper(md5("$out_summ:$inv_id:$mrh_pass1:Shp_item=$shp_item"));

// проверка корректности подписи
// check signature
if ($my_crc != $crc)
{
  //echo "bad sign\n";
    exit();
}

// проверка наличия номера счета в истории операций
// check of number of the order info in history of operations
$f = @fopen("order.txt","r+") or die("error");

while(!feof($f))
{
    $str = fgets($f);

    $str_exp = explode(";", $str);
    if ($str_exp[0] == "order_num :$inv_id")
    { 
    //echo "Операция прошла успешно\n";
    //echo "Operation of payment is successfully completed\n";
    }
}
fclose($f);
result.php

PHP:
<?php
require("config.php");
// регистрационная информация (пароль #2)
// registration info (password #2)
$mrh_pass2 = "" . mrh_pass2 . "";

//установка текущего времени
//current date
$tm = getdate(time()+9*3600);
$date = "$tm[year]-$tm[mon]-$tm[mday] $tm[hours]:$tm[minutes]:$tm[seconds]";

// чтение параметров
// read parameters
$out_summ = $_REQUEST["OutSum"];
$inv_id = $_REQUEST["InvId"];
$shp_item = $_REQUEST["Shp_item"];
$crc = $_REQUEST["SignatureValue"];

$crc = strtoupper($crc);

$my_crc = strtoupper(md5("$out_summ:$inv_id:$mrh_pass2:Shp_item=$shp_item"));

// проверка корректности подписи
// check signature
if ($my_crc != $crc)
{
  //echo "bad sign\n";
    exit();
}

// признак успешно проведенной операции
// success
//echo "OK$inv_id\n";

// запись в файл информации о прведенной операции
// save order info to file
$f = @fopen("order.txt","a+") or
          die("error");
fputs($f,"order_num :$inv_id;Summ :$out_summ;Date :$date\n");
fclose($f);
fail.php

PHP:
<?php
$inv_id = $_REQUEST["InvId"];
echo "Вы отказались от оплаты номер заказ #{$inv_id}\n";
и заключительный файл это обработчик

pay.php

PHP:
<?php
error_reporting(-1);//Выводим ошибки но тут их нет
ini_set("display_errors", -1);//Выводим ошибки но тут их нет
header("Content-Type: text/html; charaset=UTF-8");
require("config.php");//Подключаем файл конфигурации

$stage = isset($_GET['stage']) ? $_GET['stage'] : "";//Принимаем запрос от ROBOKASSA
$stage = $mysqli->escape_string($stage);
$stage = htmlspecialchars($stage);

if($stage == 'success')//Метод успешной оплаты
{
    if(file_exists('success.php'))//Проверяем есть ли файл success.php
    {
        require('success.php');//Инклудим файл
        $query = $mysqli->query("SELECT 
                                    `r`.`order_id`, 
                                    `r`.`userid`, 
                                    `r`.`money`, 
                                    `r`.`status`, 
                                    `r`.`date`, 
                                    `r`.`crc`, 
                                    `r`.`status1`,
                                    `u`.`" . userid . "`,
                                    `u`.`" . dmoney . "`,
                                    `u`.`" . online . "`
                                FROM 
                                    `rkassa` as r
                                LEFT JOIN
                                    `" . users . "` as u
                                ON 
                                    (`r`.`userid` = `u`.`" . userid . "`)
                                WHERE 
                                    `r`.`order_id` = '{$inv_id}'
                                LIMIT 1");//Делаем запрос в 2 таблицы для сравнения данных
        $result = $query->fetch_array();
        if($result['order_id'] != $inv_id)//Проверяем если не совпадает то выводим ошибку #1 или пишем о том что не совпадает номер счета
        {
            echo "<!DOCTYPE html>
                <html>
                    <head>
                        <meta charset=\"utf8\">
                    </head>
                    <body>
                        <h1>Неверный номер счета ошибка #1</h1>
                    </body>
                </html>";
        }
        else
        {
            //Идём дальше 
            if($result['status1'] == 0)//Проверяем а небыли ли ему начислены деньги на аккаунт раньше
            {
                //Сооствественно если равно 0 то небыли
                if($result[online] > 0)//проверяем в сети ли пользователь или нет 
                {
                    //Если в сети то 
                    echo "<!DOCTYPE html>
                        <html>
                            <head>
                                <meta charset=\"utf8\">
                            </head>
                            <body>
                                <h1>Данный персонаж находится в игре</h1>
                            </body>
                        </html>";
                }
                else
                {
                    $dmoney = $result[dmoney]+$result['money'];
                    //А если нет то начисляем ему денюшку на аккаунт
                    $update = $mysqli->query("UPDATE `" . users . "` SET `" . dmoney . "` = '{$dmoney}' WHERE `" . userid . "` = '{$result['userid']}'");//Реальные деньги загнали на аккаунт
                    //Обновляем параметры оплаты
                    $updatetwo = $mysqli->query("UPDATE `rkassa` SET `status` = '1', `status1` = '1' WHERE `order_id` = '{$inv_id}'");//Чтобы он себе ещё раз эти же деньги не начислил на свой аккаунт
                    //Выводим сообщение об успешной оплате
                    echo "<!DOCTYPE html>
                        <html>
                            <head>
                                <meta charset=\"utf8\">
                            </head>
                            <body>
                                <h1>Вы успешно пополнили аккаунт №{$result['userid']} на сумму: {$result['money']} руб.</h1>
                            </body>
                        </html>";
                }
            }
            else
            {
                echo "<!DOCTYPE html>
                        <html>
                            <head>
                                <meta charset=\"utf8\">
                            </head>
                            <body>
                                <h1>По данной транзакции вам уже были начислены деньги на аккаунт №{$result['userid']}</h1>
                            </body>
                        </html>";
            }
        }
    }
}
elseif($stage == 'fail')//Если пользователь отказался от оплаты или произошла какая либо другая ошибка
{
    if(file_exists('fail.php'))//Проверяем есть ли файл fail.php
    {
        require('fail.php');//Инклудим файл там находится сообщение с ошибкой
    }
}
elseif($stage == 'result')//Всё тоже самое что и success только подключаемый файл result.php и он обычно автоматически начисляет денюшку на аккаунт не обязательным возвращаясь в магазин
{
    if(file_exists('result.php'))//Проверяем есть ли файл result.php
    {
        require('result.php');//Инклудим файл
        $query = $mysqli->query("SELECT 
                                    `r`.`order_id`, 
                                    `r`.`userid`, 
                                    `r`.`money`, 
                                    `r`.`status`, 
                                    `r`.`date`, 
                                    `r`.`crc`, 
                                    `r`.`status1`,
                                    `u`.`" . userid . "`,
                                    `u`.`" . dmoney . "`,
                                    `u`.`" . online . "`
                                FROM 
                                    `rkassa` as r
                                LEFT JOIN
                                    `" . users . "` as u
                                ON 
                                    (`r`.`userid` = `u`.`" . userid . "`)
                                WHERE 
                                    `r`.`order_id` = '{$inv_id}'
                                LIMIT 1");//Делаем запрос в 2 таблицы для сравнения данных
        $result = $query->fetch_array();
        if($result['order_id'] != $inv_id)//Проверяем если не совпадает то выводим ошибку #1 или пишем о том что не совпадает номер счета
        {
            echo "<!DOCTYPE html>
                <html>
                    <head>
                        <meta charset=\"utf8\">
                    </head>
                    <body>
                        <h1>Неверный номер счета ошибка #1</h1>
                    </body>
                </html>";
        }
        else
        {
            //Идём дальше 
            if($result['status1'] == 0)//Проверяем а небыли ли ему начислены деньги на аккаунт раньше
            {
                //Сооствественно если равно 0 то небыли
                if($result[online] > 0)//проверяем в сети ли пользователь или нет 
                {
                    //Если в сети то 
                    echo "<!DOCTYPE html>
                        <html>
                            <head>
                                <meta charset=\"utf8\">
                            </head>
                            <body>
                                <h1>Данный персонаж находится в игре</h1>
                            </body>
                        </html>";
                }
                else
                {
                    $dmoney = $result[dmoney]+$result['money'];
                    //А если нет то начисляем ему денюшку на аккаунт
                    $update = $mysqli->query("UPDATE `" . users . "` SET `" . dmoney . "` = '{$dmoney}' WHERE `" . userid . "` = '{$result['userid']}'");//Реальные деньги загнали на аккаунт
                    //Обновляем параметры оплаты
                    $updatetwo = $mysqli->query("UPDATE `rkassa` SET `status` = '1', `status1` = '1' WHERE `order_id` = '{$inv_id}'");//Чтобы он себе ещё раз эти же деньги не начислил на свой аккаунт
                    //Выводим сообщение об успешной оплате
                    echo "<!DOCTYPE html>
                        <html>
                            <head>
                                <meta charset=\"utf8\">
                            </head>
                            <body>
                                <h1>Вы успешно пополнили аккаунт №{$result['userid']} на сумму: {$result['money']} руб.</h1>
                            </body>
                        </html>";
                }
            }
            else
            {
                echo "<!DOCTYPE html>
                        <html>
                            <head>
                                <meta charset=\"utf8\">
                            </head>
                            <body>
                                <h1>По данной транзакции вам уже были начислены деньги на аккаунт №{$result['userid']}</h1>
                            </body>
                        </html>";
            }
        }
    }
}
$mysqli->close();
Осталось создать файл в корне сайта order.txt и выставить ему права 777

Как зарегистрировать магазин и дальнейшие настройки рекомендую вам ознакомится с

Так же для настройки приёма платежей с этими скриптами вам при технический настройках необходимо будет сделать всё так же как указано на скриншоте

Автор мануала: CRAZy_Str

Ссылка на скачивание:

VT: ненужен.
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу