Как прикрутить к своем сайту Робокассу

Барин

Участник
Статус
offline
Регистрация
24.06.2016
Сообщения
70
Репутация
33
Рано или поздно любой веб-мастер столкнется с необходимостью использовать на своем или сайте клиента систему приема электронных платежей. Различных систем большое множество, можно использовать каждую в отдельности, но все же лучше воспользоваться уже готовым сервисом. Мой взгляд остановился на системе приема платежей под названием Робокасса (http://robokassa.ru/).

Прелесть данной системы в следующем:

  1. Принимает платежи практически всеми известными способами (от SMS-сообщений до MasterCard);
  2. Небольшая комиссия, которую можно возложить либо на клиентов, либо платить самому - 5%;
  3. Удобная система отчетов о проведенных, отмененных и замороженых платежах;
  4. Система работает как с юридическими лицами, так и физическими;
  5. Адекватная техподдержка.
Для начала пройдите регистрацию и заполните все необходимые поля. Выполните все требования робокассы и мы приступим к самому интересному, к настройке счета и скриптов. Я показывать вам буду на примере моего проекта - сервиса объявлений.

После успешной регистрации и всех формальностей вы попадете в личный кабинет. Сразу обращаю ваше внимание на то, что пока вы пользуетесь тестовым сервером, но после запроса на активацию сменить настройки уже будет нельзя, поэтому смотрите внимательно на следующее изображение, а ниже я объясню что к чему:
robokassa.jpg

С паролями все ясно. Нас интересуют поля с методами отправки и URLами. Сразу оговорюсь, что не так важно какой метод отправки вы выберите, но все же лучше метод POST. А вот URLы имеют самое важное значение. У меня на сайте за проведение всех денежных операций пользователей отвечает 1 страница, которая меняется в зависимости от передаваемых ей данных. Именно поэтому каждый URL имеет похожее значение, где меняется только переменная act. Именно эта переменная будет передавать нашему серверу значение о том, в какое состояние перешел платеж. Вы можете настроить все по своему, но главное чтобы смысл вам был понятен. В зависимости от значения данной переменной мы будем запускать тот или иной скрипт.

Рассмотрим поближе всю систему. Скачайте демонстрационную систему с сайта Робокассы, она нам очень поможет. Для начала форма отправки заявки на оплату:
HTML:
echo "<p>Стоимость 1 ОП равна 30 рублей. В зависимости от способа оплаты который вы выберете эта стоимость может изменится, т.к. некоторые платежные системы берут дополнительную комиссию.</p>
<div id="paymentform">
<form id="paymentForm" action="room.php#room_client" method="post">
<p class="coins" data-hc-id="e05152a3109005524e588e5430a8">Количество приобретаемых ОП: ";
    $setTime = time();
    $maxCoins = 10;
    $userNumber = $_SESSION["iduser"];
    $numberOfOrder = $userNumber+$setTime;
    echo "<select id="coins_choice" name="coinsToPay"><option value="".$choiceCoin."">".$choiceCoin."</option></select><span class="hcc hc__ht hc_e05152a3109005524e588e5430a8" data-hc-id="e05152a3109005524e588e5430a8" style="display: none;"><svg width="11" height="11" viewBox="0 0 511.626 511.626"><path d="M477.371,127.44c-22.843-28.074-53.871-50.249-93.076-66.523c-39.204-16.272-82.035-24.41-128.478-24.41c-34.643,0-67.762,4.805-99.357,14.417c-31.595,9.611-58.812,22.602-81.653,38.97c-22.845,16.37-41.018,35.832-54.534,58.385C6.757,170.833,0,194.484,0,219.228c0,28.549,8.61,55.3,25.837,80.234c17.227,24.931,40.778,45.871,70.664,62.811c-2.096,7.611-4.57,14.846-7.426,21.693c-2.855,6.852-5.424,12.474-7.708,16.851c-2.286,4.377-5.376,9.233-9.281,14.562c-3.899,5.328-6.849,9.089-8.848,11.275c-1.997,2.19-5.28,5.812-9.851,10.849c-4.565,5.048-7.517,8.329-8.848,9.855c-0.193,0.089-0.953,0.952-2.285,2.567c-1.331,1.615-1.999,2.423-1.999,2.423l-1.713,2.566c-0.953,1.431-1.381,2.334-1.287,2.707c0.096,0.373-0.094,1.331-0.57,2.851c-0.477,1.526-0.428,2.669,0.142,3.433v0.284c0.765,3.429,2.43,6.187,4.998,8.277c2.568,2.092,5.474,2.95,8.708,2.563c12.375-1.522,23.223-3.606,32.548-6.276c49.87-12.758,93.649-35.782,131.334-69.097c14.272,1.522,28.072,2.286,41.396,2.286c46.442,0,89.271-8.138,128.479-24.417c39.208-16.272,70.233-38.448,93.072-66.517c22.843-28.062,34.263-58.663,34.263-91.781C511.626,186.108,500.207,155.509,477.371,127.44z"></path></svg><span class="hcc hc__htcount">+</span></span></p>
             <p>Номер счета: ".$numberOfOrder."</p>
            <p>Общая стоимость <input id="full_sum" size="4"> рублей</p>
            <input name="numberOfOrder" type="hidden" value="".$numberOfOrder."">
            <p><input id="button" type="submit" value="Продолжить оплату"></p>
            </form>
            <div id="payment_system"><img src="images/tamplate_1/payment_system.jpg" alt=""></div>
            </div>
            ";
Данная форма позволит нам выбрать, сколько очков мы будем покупать - 1 очко стоит 30 рублей. Таким образом выбрав 4 очка мы купим их за 120 рублей. В поле Общая стоимость выводится сразу сумма средствами JS (мы не будем здесь показывать как это делать, урок не о том). После нажатия на кнопку Продолжить оплату, пользователь передаст номер заказа, свой ID, сумму покупки скрипту, который выполняется на этой же странице.+

При получении всех данных срабатывает следующий скрипт:
Код:
if (isset($_REQUEST["coinsToPay"]) && isset($_REQUEST["numberOfOrder"])) {
echo "<p><img src="images/tamplate_1/robokassa.gif" alt="" align="right"> Мы используем популярную систему приема платежей, которая гарантирует безопасность ваших переводов. В случае проблем просьба писать в техподдержку.</p>";
echo "<div id="paymentform" data-hc-id="a2d21270251724820012390a1140">";
echo "<p>Номер счета: ".$_REQUEST["numberOfOrder"]."</p>";
$coins = $_REQUEST["coinsToPay"];
echo "<p data-hc-id="c8005b00043510614010480a00e0">Вы приобретаете ".$coins." ОП<span class="hcc hc__ht hc_c8005b00043510614010480a00e0" data-hc-id="c8005b00043510614010480a00e0" style="display: none;"><svg width="11" height="11" viewBox="0 0 511.626 511.626"><path d="M477.371,127.44c-22.843-28.074-53.871-50.249-93.076-66.523c-39.204-16.272-82.035-24.41-128.478-24.41c-34.643,0-67.762,4.805-99.357,14.417c-31.595,9.611-58.812,22.602-81.653,38.97c-22.845,16.37-41.018,35.832-54.534,58.385C6.757,170.833,0,194.484,0,219.228c0,28.549,8.61,55.3,25.837,80.234c17.227,24.931,40.778,45.871,70.664,62.811c-2.096,7.611-4.57,14.846-7.426,21.693c-2.855,6.852-5.424,12.474-7.708,16.851c-2.286,4.377-5.376,9.233-9.281,14.562c-3.899,5.328-6.849,9.089-8.848,11.275c-1.997,2.19-5.28,5.812-9.851,10.849c-4.565,5.048-7.517,8.329-8.848,9.855c-0.193,0.089-0.953,0.952-2.285,2.567c-1.331,1.615-1.999,2.423-1.999,2.423l-1.713,2.566c-0.953,1.431-1.381,2.334-1.287,2.707c0.096,0.373-0.094,1.331-0.57,2.851c-0.477,1.526-0.428,2.669,0.142,3.433v0.284c0.765,3.429,2.43,6.187,4.998,8.277c2.568,2.092,5.474,2.95,8.708,2.563c12.375-1.522,23.223-3.606,32.548-6.276c49.87-12.758,93.649-35.782,131.334-69.097c14.272,1.522,28.072,2.286,41.396,2.286c46.442,0,89.271-8.138,128.479-24.417c39.208-16.272,70.233-38.448,93.072-66.517c22.843-28.062,34.263-58.663,34.263-91.781C511.626,186.108,500.207,155.509,477.371,127.44z"></path></svg><span class="hcc hc__htcount">+</span></span></p>";
$sumPay = $coins*30;
echo "<p>Сумма к оплате по счету: ".$sumPay." руб.</p>";
// регистрационная информация (логин, пароль #1)
// registration info (login, password #1)
$mrh_login = "*********";
$mrh_pass1 = "*********";
// номер заказа
// number of order
$inv_id = $_REQUEST["numberOfOrder"];
// описание заказа
// order description
$inv_desc = "Оплата очков Easy-bay";
// сумма заказа
// sum of order
$out_summ = $sumPay;
// тип товара
// code of goods
$shp_item = "Coins";
// предлагаемая валюта платежа
// default payment e-currency
$in_curr = "PCR";
// язык
// language
$culture = "ru";
// формирование подписи
// generate signature
$crc  = md5("$mrh_login:$out_summ:$inv_id:$mrh_pass1:Shp_item=$shp_item");
// форма оплаты товара
// payment form
print "".
    "<form action="https://merchant.roboxchange.com/Index.aspx" method="POST">".
    "<input name="MrchLogin" type="hidden" value="$mrh_login">".
    "<input name="OutSum" type="hidden" value="$out_summ">".
    "<input name="InvId" type="hidden" value="$inv_id">".
    "<input name="Desc" type="hidden" value="$inv_desc">".
    "<input name="SignatureValue" type="hidden" value="$crc">".
    "<input name="Shp_item" type="hidden" value="$shp_item">".
    "<input name="IncCurrLabel" type="hidden" value="$in_curr">".
    "<input name="Culture" type="hidden" value="$culture">".
    "<input type="submit" value="Оплатить">".
    "</form>";
echo "<span class="hcc hc__ht hc_a2d21270251724820012390a1140" data-hc-id="a2d21270251724820012390a1140" style="display: none;"><svg width="11" height="11" viewBox="0 0 511.626 511.626"><path d="M477.371,127.44c-22.843-28.074-53.871-50.249-93.076-66.523c-39.204-16.272-82.035-24.41-128.478-24.41c-34.643,0-67.762,4.805-99.357,14.417c-31.595,9.611-58.812,22.602-81.653,38.97c-22.845,16.37-41.018,35.832-54.534,58.385C6.757,170.833,0,194.484,0,219.228c0,28.549,8.61,55.3,25.837,80.234c17.227,24.931,40.778,45.871,70.664,62.811c-2.096,7.611-4.57,14.846-7.426,21.693c-2.855,6.852-5.424,12.474-7.708,16.851c-2.286,4.377-5.376,9.233-9.281,14.562c-3.899,5.328-6.849,9.089-8.848,11.275c-1.997,2.19-5.28,5.812-9.851,10.849c-4.565,5.048-7.517,8.329-8.848,9.855c-0.193,0.089-0.953,0.952-2.285,2.567c-1.331,1.615-1.999,2.423-1.999,2.423l-1.713,2.566c-0.953,1.431-1.381,2.334-1.287,2.707c0.096,0.373-0.094,1.331-0.57,2.851c-0.477,1.526-0.428,2.669,0.142,3.433v0.284c0.765,3.429,2.43,6.187,4.998,8.277c2.568,2.092,5.474,2.95,8.708,2.563c12.375-1.522,23.223-3.606,32.548-6.276c49.87-12.758,93.649-35.782,131.334-69.097c14.272,1.522,28.072,2.286,41.396,2.286c46.442,0,89.271-8.138,128.479-24.417c39.208-16.272,70.233-38.448,93.072-66.517c22.843-28.062,34.263-58.663,34.263-91.781C511.626,186.108,500.207,155.509,477.371,127.44z"></path></svg><span class="hcc hc__htcount">+</span></span></div>";
mysql_query("REPLACE INTO orders (id_order, userid, sum_pay, coins, status) VALUES ('$inv_id', '$userid', '$out_summ', '$coins', 0)");
}
В поля $mrh_login, $mrh_pass1 для начала оставьте те, что даны для тестового сервера, а после отладки всей системы смените на свои. Обратите внимание на переменную $crc, она необходима для того, чтобы передать серверам Робокассы зашифрованную подпись, без которой не пройдет платеж. Так же посоветую использовать свою базу для хранения всех заказов, как это сделано у меня. Так вам проще будет отследить кто оплатил, статус его платежа, дату и время и в случае какого-нибудь сбоя робокассы (или своих неверных настроек) вы сможете безболезненно все исправить.+

Теперь распакуйте все скачанные с робокассы файлы, из всех файлов нам понадобятся: result.php, success.php, fail.php. Эти файлы содержат всю необходимую информацию о проведении оплаты. Давайте подключим их опять же к нашему же файлу:
Код:
if ($_REQUEST["act"]==1) {
    if (file_exists("includes/success.php")) {
        require("includes/success.php");
        mysql_query("UPDATE orders SET status='1' WHERE id_order='$inv_id'");
        $result_coins = mysql_query("SELECT coins, userid FROM orders WHERE id_order='$inv_id'");
        $myrow_coins = mysql_fetch_array($result_coins);
        $result_old = mysql_query("SELECT coins FROM users WHERE id='$myrow_coins[userid]'");
        $myrow_old = mysql_fetch_array($result_old);
        $new_coins  = $myrow_old["coins"]+$myrow_coins["coins"];
        mysql_query("UPDATE orders SET status='1' WHERE id_order='$inv_id'");
        mysql_query("UPDATE users SET coins='$new_coins' WHERE id='$myrow_coins[userid]'");
    }
}
if ($_REQUEST["act"]==2) {
    if (file_exists("includes/fail.php")) {
        require("includes/fail.php");
        mysql_query("UPDATE orders SET status='2' WHERE id_order='$inv_id'");
    }
}
if ($_REQUEST["act"]==3) {
    if (file_exists("includes/result.php")) {
        require("includes/result.php");
        mysql_query("UPDATE orders SET status='3' WHERE id_order='$inv_id'");
    }
}
Обратите внимание, в зависимости от того, какое значение мы передали переменной act у нас грузится соответствующий файл - вот в этом и была вся идея. Если мы получили значение 1, то значит платеж прошел успешно, мы получили деньги и соответственно можем плательщику начислить очки, а сам заказ перевести в состояние исполненных. Если 2, то в базе пишем, что пользователь отказался от платежа. act=3 вы вряд ли когда увидите, хотя он соответственно проходит и сразу же запускает нам условие равное 1, т.е. это промежуточный шаг который в основе своей оповещает только администратора.+

Рассмотрим структуру каждого файла в отдельности. fail.php:
PHP:
$inv_id = $_REQUEST["InvId"];
echo "Вы отказались от оплаты. Заказ# $inv_id\n";
echo "You have refused payment. Order# $inv_id\n";
Тут все просто, если пользователь отказался от платежа то мы просто выводим ему это на экран.

success.php:
PHP:
// регистрационная информация (пароль #1)
// registration info (password #1)
$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);
Данный файл отвечает за финальное проведение платежа, сверяет контрольную подпись и успешно проводит платеж, а пользователю сообщает об успешном платеже. А также данный скрипт дописывает в файл order.txt лог проведенной операции.

result.php:
PHP:
// регистрационная информация (пароль #2)
// registration info (password #2)
$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);
Как уже говорилось выше, это промежуточный файл, который при отсутствии проблем в системе вернет вам переменную act=1.

Причем обратите внимание, что мы используем введенные нами при регистрации пароли практически во всех исполнительных файлах. В каждом файле свой. Это сделано с целью безопасности системы приема платежа и вашего личного кабинета в системе Робокасса.

Я вам показал лишь пример работы с фиксироваными ценами, таким же образом можно сделать систему приема донатов или настроить интернет-магазин. Хочется пожелать вам удачи с этой системой, внимательно все заполняйте и продумывайте систему, чтобы потом не испытать гнев обманутых пользователей. Подробнее о выплатах вы уже можете прочитать на сайте Робокассы.