Like It Exchange System

Ex4Me

четверг, 12 января 2012 г.

Robokassa – как настроить и использовать на своем сайте?


Robokassa  – система электронных платежей


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


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


Принимает платежи практически всеми известными способами (от SMS-сообщений до MasterCard);


Небольшая комиссия, которую можно возложить либо на клиентов, либо платить самому – 5%;


Удобная система отчетов о проведенных, отмененных и замороженых платежах;


Система работает как с юридическими лицами, так и физическими;


Адекватная техподдержка.


Для начала пройдите регистрацию и заполните все необходимые поля. Выполните все требования робокассы и мы приступим к самому интересному, к настройке счета и скриптов. Я показывать вам буду на примере моего проекта – сервиса объявлений.



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


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

Рассмотрим поближе всю систему. Скачайте демонстрационную систему с сайта Робокассы, она нам очень поможет. Для начала форма отправки заявки на оплату:


01 echo "
Стоимость 1 ОП равна 30 рублей. В зависимости от способа оплаты который вы выберете эта стоимость может изменится, т.к. некоторые платежные системы берут дополнительную комиссию.

02

03

04
Количество приобретаемых ОП: ";
05 $setTime = time();
06 $maxCoins = 10;
07 $userNumber = $_SESSION["iduser"];
08 $numberOfOrder = $userNumber+$setTime;
09 echo "

10
Номер счета: ".$numberOfOrder."

11
Общая стоимость рублей

12
13


14
15

16

17 ";

Данная форма позволит нам выбрать, сколько очков мы будем покупать – 1 очко стоит 30 рублей. Таким образом выбрав 4 очка мы купим их за 120 рублей. В поле Общая стоимость выводится сразу сумма средствами JS (мы не будем здесь показывать как это делать, урок не о том). После нажатия на кнопку Продолжить оплату, пользователь передаст номер заказа, свой ID, сумму покупки скрипту, который выполняется на этой же странице.

При получении всех данных срабатывает следующий скрипт:


01 if (isset($_REQUEST["coinsToPay"]) && isset($_REQUEST["numberOfOrder"])) {
02 echo "
Мы используем популярную систему приема платежей, которая гарантирует безопасность ваших переводов. В случае проблем просьба писать в техподдержку.
";
03 echo "
";
04 echo "
Номер счета: ".$_REQUEST["numberOfOrder"]."
";
05 $coins = $_REQUEST["coinsToPay"];
06 echo "
Вы приобретаете ".$coins." ОП
";
07 $sumPay = $coins*30;
08 echo "
Сумма к оплате по счету: ".$sumPay." руб.
";
09 // регистрационная информация (логин, пароль #1)
10 // registration info (login, password #1)
11 $mrh_login = "*********";
12 $mrh_pass1 = "*********";
13 // номер заказа
14 // number of order
15 $inv_id = $_REQUEST["numberOfOrder"];
16 // описание заказа
17 // order description
18 $inv_desc = "Оплата очков Easy-bay";
19 // сумма заказа
20 // sum of order
21 $out_summ = $sumPay;
22 // тип товара
23 // code of goods
24 $shp_item = "Coins";
25 // предлагаемая валюта платежа
26 // default payment e-currency
27 $in_curr = "PCR";
28 // язык
29 // language
30 $culture = "ru";
31 // формирование подписи
32 // generate signature
33 $crc = md5("$mrh_login:$out_summ:$inv_id:$mrh_pass1:Shp_item=$shp_item");
34 // форма оплаты товара
35 // payment form
36 print "".
37 "
".
38 "".
39 "".
40 "".
41 "".
42 "".
43 "".
44 "".
45 "".
46 "".
47 "";
48 echo "
";
49 mysql_query("INSERT INTO orders (id_order, userid, sum_pay, coins, status) VALUES ('$inv_id', '$userid', '$out_summ', '$coins', 0)");
50 }

В поля $mrh_login, $mrh_pass1 для начала оставьте те, что даны для тестового сервера, а после отладки всей системы смените на свои. Обратите внимание на переменную $crc, она необходима для того, чтобы передать серверам Робокассы зашифрованную подпись, без которой не пройдет платеж. Так же посоветую использовать свою базу для хранения всех заказов, как это сделано у меня. Так вам проще будет отследить кто оплатил, статус его платежа, дату и время и в случае какого-нибудь сбоя робокассы (или своих неверных настроек) вы сможете безболезненно все исправить.

Теперь распакуйте все скачанные с робокассы файлы, из всех файлов нам понадобятся: result.php, success.php, fail.php. Эти файлы содержат всю необходимую информацию о проведении оплаты. Давайте подключим их опять же к нашему же файлу:


01 if ($_REQUEST["act"]==1) {
02 if (file_exists("includes/success.php")) {
03 require("includes/success.php");
04 mysql_query("UPDATE orders SET status='1' WHERE id_order='$inv_id'");
05 $result_coins = mysql_query("SELECT coins, userid FROM orders WHERE id_order='$inv_id'");
06 $myrow_coins = mysql_fetch_array($result_coins);
07 $result_old = mysql_query("SELECT coins FROM users WHERE id='$myrow_coins[userid]'");
08 $myrow_old = mysql_fetch_array($result_old);
09 $new_coins = $myrow_old["coins"]+$myrow_coins["coins"];
10 mysql_query("UPDATE orders SET status='1' WHERE id_order='$inv_id'");
11 mysql_query("UPDATE users SET coins='$new_coins' WHERE id='$myrow_coins[userid]'");
12 }
13 }
14 if ($_REQUEST["act"]==2) {
15 if (file_exists("includes/fail.php")) {
16 require("includes/fail.php");
17 mysql_query("UPDATE orders SET status='2' WHERE id_order='$inv_id'");
18 }
19 }
20 if ($_REQUEST["act"]==3) {
21 if (file_exists("includes/result.php")) {
22 require("includes/result.php");
23 mysql_query("UPDATE orders SET status='3' WHERE id_order='$inv_id'");
24 }
25 }

Обратите внимание, в зависимости от того, какое значение мы передали переменной act у нас грузится соответствующий файл – вот в этом и была вся идея. Если мы получили значение 1, то значит платеж прошел успешно, мы получили деньги и соответственно можем плательщику начислить очки, а сам заказ перевести в состояние исполненных. Если 2, то в базе пишем, что пользователь отказался от платежа. act=3 вы вряд ли когда увидите, хотя он соответственно проходит и сразу же запускает нам условие равное 1, т.е. это промежуточный шаг который в основе своей оповещает только администратора.

Рассмотрим структуру каждого файла в отдельности. fail.php:


1 $inv_id = $_REQUEST["InvId"];
2 echo "Вы отказались от оплаты. Заказ# $inv_id\n";
3 echo "You have refused payment. Order# $inv_id\n";

Тут все просто, если пользователь отказался от платежа то мы просто выводим ему это на экран.

success.php:

01 // регистрационная информация (пароль #1)
02 // registration info (password #1)
03 $mrh_pass1 = "*******";
04 // чтение параметров
05 // read parameters
06 $out_summ = $_REQUEST["OutSum"];
07 $inv_id = $_REQUEST["InvId"];
08 $shp_item = $_REQUEST["Shp_item"];
09 $crc = $_REQUEST["SignatureValue"];
10 $crc = strtoupper($crc);
11 $my_crc = strtoupper(md5("$out_summ:$inv_id:$mrh_pass1:Shp_item=$shp_item"));
12 // проверка корректности подписи
13 // check signature
14 if ($my_crc != $crc)
15 {
16 echo "bad sign\n";
17 exit();
18 }
19 // проверка наличия номера счета в истории операций
20 // check of number of the order info in history of operations
21 $f=@fopen("order.txt","r+") or die("error");
22 while(!feof($f))
23 {
24 $str=fgets($f);
25
26 $str_exp = explode(";", $str);
27 if ($str_exp[0]=="order_num :$inv_id")
28 {
29 echo "Операция прошла успешно\n";
30 echo "Operation of payment is successfully completed\n";
31 }
32 }
33 fclose($f);

Данный файл отвечает за финальное проведение платежа, сверяет контрольную подпись и успешно проводит платеж, а пользователю сообщает об успешном платеже. А так же данный скрипт дописывает в файл order.txt лог проведенной операции.

result.php:

01 // регистрационная информация (пароль #2)
02 // registration info (password #2)
03 $mrh_pass2 = "*********";
04 //установка текущего времени
05 //current date
06 $tm=getdate(time()+9*3600);
07 $date="$tm[year]-$tm[mon]-$tm[mday] $tm[hours]:$tm[minutes]:$tm[seconds]";
08 // чтение параметров
09 // read parameters
10 $out_summ = $_REQUEST["OutSum"];
11 $inv_id = $_REQUEST["InvId"];
12 $shp_item = $_REQUEST["Shp_item"];
13 $crc = $_REQUEST["SignatureValue"];
14 $crc = strtoupper($crc);
15 $my_crc = strtoupper(md5("$out_summ:$inv_id:$mrh_pass2:Shp_item=$shp_item"));
16 // проверка корректности подписи
17 // check signature
18 if ($my_crc !=$crc)
19 {
20 echo "bad sign\n";
21 exit();
22 }
23 // признак успешно проведенной операции
24 // success
25 echo "OK$inv_id\n";
26 // запись в файл информации о прведенной операции
27 // save order info to file
28 $f=@fopen("order.txt","a+") or die("error");
29 fputs($f,"order_num :$inv_id;Summ :$out_summ;Date :$date\n");
30 fclose($f);

Как уже говорилось выше, это промежуточный файл, который при отсутствии проблем в системе вернет вам переменную act=1.

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

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



1 комментарий:

mavspb комментирует...

Добрый день.
Нужна помощь в настройке учета % системы в цене.
Посмотрел инструкцию Робокассы и понял, что ничего не понял.
Поможете на возмездной основе?
Алексей.