CRAZy_Str
Специалист
Всем привет, решил написать небольшой мануал по пополнению счета с использованием ROBOKASSA а так же с последующей интеграцией в другие платёжные системы где это возможно к примеру
Приступим, создадим таблицу rkassa
Создали? Поехали дальше
для примера я создал таблицу с зарегистрированными игроками для проверки работоспособности тоже можете её добавить
Всё база готова, приступим к форме и обработчику.
Создадим файл config.php в нём нам все необходимые конфигурации для работы
Создали, теперь приступим к форме пополнения счёта и оформлении платежа создадим к примеру файл index.php или payment.php
Теперь нам необходимо создать ещё 4 файла
success.php
result.php
fail.php
и заключительный файл это обработчик
pay.php
Осталось создать файл в корне сайта order.txt и выставить ему права 777
Как зарегистрировать магазин и дальнейшие настройки рекомендую вам ознакомится с
Так же для настройки приёма платежей с этими скриптами вам при технический настройках необходимо будет сделать всё так же как указано на скриншоте
Автор мануала: CRAZy_Str
Ссылка на скачивание:
VT: ненужен.
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Приступим, создадим таблицу 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();
}
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();//Закрываем соединение с базой данных
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);
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);
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();
Как зарегистрировать магазин и дальнейшие настройки рекомендую вам ознакомится с
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Так же для настройки приёма платежей с этими скриптами вам при технический настройках необходимо будет сделать всё так же как указано на скриншоте
Автор мануала: CRAZy_Str
Ссылка на скачивание:
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
VT: ненужен.
Последнее редактирование:
