Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

Автооплата через WebMoney [мануал]

Статус пользователя miRror
сообщение 8.3.2014, 11:19
Сообщение #1


Стаж: 15 лет

Сообщений: 1151
Благодарностей: 1002
Полезность: 967

Меценат Меценат

Немного изучив принцип работы WebMoney Merchant (WM) я решил с вами поделиться некоторыми знаниями. Возможно скрипт нельзя назвать универсальным, но взять как задумку - легко. Необходимо подтверждение паспортных данных (это бесплатно). Лимиты и прочую информацию ищите самостоятельно.

Первым делом переходим по ссылке: https://merchant.webmoney.ru/conf/purses.asp, выбираем нужный кошелек и заполняем данные:

Тестовый/Рабочий режимы: в процессе тестирования выбираете тестовый, в процессе работы рабочий. В тестовом режиме происходит процесс оплаты, но деньги не снимаются.
ResultUrl: ссылка на файл, который запускается, когда вы нажимаете в процессе оплаты на кнопку подтвердить платеж [рядом ставим галочку] (Далее буду называть [1])
Success URL: ссылка на файл, который запускается после успешной оплаты товара [ рядом выбираем тип этой ссылки: LINK ] (Далее буду называть [2])
Fail URL: ссылка на файл, который запускается после неудачной оплаты товара [ рядом выбираем тип этой ссылки: LINK ] (Далее буду называть [3])

Файл создания заказа буду называть [4].

[Первый этап] Создаем форму заказа:

Код:

<form id="formbuy" method="POST" action="ссылка на файл [4]" autocomplete="off">
/*input параметры, например <input type="text" name="free_col" value="1234"> */
/*тут будет что-то вроде <span onclick="checkbuy()" class="btn btn-danger">Купить</span>*/
</form>


Чтобы обработать кнопку купить, нужно создать js файл с функцией checkbuy(). Кратко расскажу как это работает: форма (id="formbuy") посылается в файл [4], и ее ответ далее посылается на сайт webmoney, если заказ успешно создался, иначе выводится ошибка.

Сам JS файл необходимо будет подключить на странице формы, необходимо наличие jquery:

Код:

function url_redirect(options){ /* совершает редирект по указанной ссылке c POST параметрами*/
var $form = $("<form />");

$form.attr("action",options.url);
$form.attr("method",options.method);

for (var data in options.data)
$form.append('<input type="hidden" name="'+data+'" value="'+options.data[data]+'" />');

$("body").append($form);
$form.submit();
}
function checkbuy()
{
$.ajax({
type: "POST",
url: "ссылка на файл [4]",
data: $('#formbuy').serialize(),
dataType: "json",
success: function(data) /* массив содержит поля status (error/success), id - номер заказа в таблице, order_id - номер заказа в WM, cost - цену на товар, desc - заголовок товара на странице оплаты в WM, purse - ваш кошелек*/
{
switch(data.status) {
case 'error':
alert(data.text) /* вывод ошибки, делайте на свой вкус */
break;
case 'success':
url_redirect({url: "https://merchant.webmoney.ru/lmi/payment.asp",
method: "POST",
data: { LMI_PREREQUEST: 1, LMI_PAYEE_PURSE: data.purse, LMI_PAYMENT_AMOUNT: data.cost, LMI_PAYMENT_DESC_BASE64: data.desc, LMI_PAYMENT_NO: data.order, id: data.id } /* эти параметры пойдут на обработку в файл [1] */
});
break;
}
}
});
return false;
}



[Второй этап] Создаем обработчик заказа (файл [4]):

Код:
<?php
#Здесь подключаете нужные вам файлы для проверки, открываете сессию

# Ниже проверяете поля на заполненность (те которые пришли из формы), если значение поля может быть 0, то используйте isset
if(empty($_POST['pole']))
exit( json_encode ( array ( 'status' => 'error', 'text' => 'Не все поля были заполнены' ) ) );

# [начало] маленький кусочек (не полный) моей проверки данных (наличие тарифов, услуг, т.е. проверка $_POST параметров)
# $db->num_rows = mysql_num_rows
# $db->query = mysql_query
$server = intval($_POST['server']);

$sql = $db->query("SELECT * FROM `servers` WHERE `id` = '{$server}' AND `pay` = '1'");

if(!$db->num_rows($sql))
exit( json_encode ( array ( 'status' => 'error', 'text' => 'Сервера не существует, либо оплата недоступна' ) ) );
# [конец] маленький кусочек моей проверки (наличие тарифов, услуг, т.е. проверка $_POST параметров)

# Удаляем на всякий случай заказы, которые лежат в бд либо очень долго, либо какие-то ваши условия,
# можно вообще не использовать эту строку, смотрите сами по собственному скрипту
$db->query("DELETE FROM `buy_order` WHERE `time` < '".(time() - 86400)."'");

# Добавляем в нашу таблицу заказов те данные, с которыми придется работать файлу [1]
# Ниже указан пример запроса в таблицу `buy_order` - я ее так назвал у себя, вы можете назвать по другому и
# создать еще массу полей, которые понадобятся обработчику [1]. Даны лишь необходимые столбцы таблицы,
# используйте их названия и у себя, чтобы не нарушить структуру :)
# Переменная $cost - цена с копейками, к примеру 50.00
$db->query("INSERT INTO `buy_order` (`id`, `number_order`, `cost` `time`)
VALUES (NULL, '{$number_order}', '{$cost}', '".time()."')");

# Данные ниже несут результат для JS файла, успешный результат, далее они пойдут в файл [1]
$result = array('status' => 'success', /* заказ успешно создан (обязательно)*/
'id' => mysql_insert_id(), /* номер заказа в бд (обязательно)*/
'order' => $number_order, /* номер заказа для WM (ни на что не влияет)*/
'cost' => $cost, /* Цена с копейками (обязательно)*/
'desc' => $order_desc, /* Название заказа для WM (ни на что не влияет) */
'purse' => "R519870668159"); /* Ваш кошелек для оплаты */

echo json_encode($result);


[Третий этап] Обрабатываем заказ (файл [1]):

Код:
<?php
#Здесь подключаете нужные вам файлы для проверки, открываете сессию

if( !isset($_POST['LMI_PREREQUEST']) OR (isset($_POST['LMI_PREREQUEST']) AND $_POST['LMI_PREREQUEST'] != 1) )
exit("НЕИЗВЕСТНЫЙ ИСТОЧНИК ДАННЫХ");

foreach($_POST AS &$val)
$val = mysql_real_escape_string(trim($val));

extract($_POST, EXTR_SKIP); # Ваши $_POST параметры превращаются в переменные

if($LMI_PAYEE_PURSE != "R519870668159") /* Ваш кошелек */
exit("ПОДМЕНА КОШЕЛЬКА ОПЛАТЫ");

if(empty($LMI_PAYMENT_NO) OR empty($id))
exit("НЕВЕРНЫЙ НОМЕР ЗАКАЗА");

# Проверяем существование заказа
$sql = $db->query("SELECT * FROM `buy_order` WHERE `id` = '{$id}' AND `number_order` = '{$LMI_PAYMENT_NO}'");

if(!$db->num_rows($sql))
exit("ЗАКАЗ НЕ СУЩЕСТВУЕТ");

$row = $db->fetch_array($sql);

if($LMI_PAYMENT_AMOUNT != $row['cost'])
exit("НЕВЕРНАЯ СУММА ЗАКАЗА");

# [начало] У нас уже существует заказ, поэтому нужно вставить данные в нужное место, привожу небольшой рабочий пример
if($row['prolong'])
{
$acsql = $db->query("SELECT * FROM `accounts` WHERE `id` = '{$row['prolong']}'");

if(!$db->num_rows($acsql))
exit('ПРОДЛЕВАЕМЫЙ АККАУНТ НЕ СУЩЕСТВУЕТ');

$acrow = $db->fetch_array($acsql);

$srok = 0;

if($row['srok'])
$srok = ($row['srok']*86400);

if($srok)
{
if($acrow['date_end'] <= time())
$srok += time();
else
$srok += $acrow['date_end'];
}

$db->query("UPDATE `accounts` SET `server` = '{$row['server']}', `option` = '{$row['option']}', `date_create` = '".time()."', `date_end` = '{$srok}' WHERE `id` = '{$row['prolong']}'");
} else {
$srok = 0;
if($row['srok'])
$srok = (time()+($row['srok']*86400));

$db->query("INSERT INTO `accounts`
(`id`, `user_id`, `password`, `type`, `date_create`, `day_counts`, `date_end`, `server`, `value`, `option`, `comment`)
VALUES (NULL, '{$row['user_id']}', '".$eng->GenerateKey(6)."', '{$row['type']}', '".time()."', '{$row['srok']}', '{$srok}', '{$row['server']}', '{$row['value']}', '{$row['option']}', 'Купленный аккаунт')");
}
# [конец] У нас уже существует заказ, поэтому нужно вставить данные в нужное место, привожу небольшой рабочий пример

#Удаляем оплаченный заказ
$db->query("DELETE FROM `buy_order` WHERE `id` = '{$id}'");

# Выводим на экран единственное слово, которое понимает WM. Оно означает, что оплата прошла успешно
echo "YES";


[Четвертый этап] Отправка на страницу успешной/неудачной оплаты (файлы [2] и [3]):
Т.к. мы сделали уже все необходимые действия, то просто оповестим обычными страницами пользователей, что оплата удалась или нет. Ссылки мы указали в самом начале - в настройках.


P.S. Принимаю критику/поправки по статье, оперативно исправлю. Это всего лишь мое представление идеальной автооплаты. Возможности можно расширять.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 12 раз
   Цитировать сообщение
m1ku
сообщение 8.3.2014, 11:23
Сообщение #2
Стаж: 13 лет

Сообщений: 194
Благодарностей: 36
Полезность: < 0

Получить персональный аттестат и подключить его к робокассе куда проще. Чем мучить и т.д. Так и на будущее пригодиться.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя miRror
сообщение 8.3.2014, 11:25
Сообщение #3


Стаж: 15 лет

Сообщений: 1151
Благодарностей: 1002
Полезность: 967

Меценат Меценат

Причем тут аттестат. Мне лично не хочется, чтобы робокасса получала проценты с меня, поэтому использую прямые переводы. В робокассе алгоритм будет почти такой же, только поля немного другие.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 3 раз
   + Цитировать сообщение
m1ku
сообщение 8.3.2014, 11:27
Сообщение #4
Стаж: 13 лет

Сообщений: 194
Благодарностей: 36
Полезность: < 0

Цитата(miRror @ 8.3.2014, 12:25) *
Причем тут аттестат. Мне лично не хочется, чтобы робокасса получала проценты с меня, поэтому использую прямые переводы. В робокассе алгоритм будет почти такой же, только поля немного другие.


ты хочешь получать оплату только через вебмани? Какие проценты? 2 рубля от одного заказа это большой процент? При выводе денег в любой банк или на банковскую карту, вебмани тоже берет не плохой процент ~ 60руб.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя miRror
сообщение 8.3.2014, 11:42
Сообщение #5


Стаж: 15 лет

Сообщений: 1151
Благодарностей: 1002
Полезность: 967

Меценат Меценат

Я не собираюсь проводить дебаты о том, что плохо и что хорошо, будет нужно переделаю под робокассу. В данный момент я выложил пример автооплаты под WebMoney, а уж имеет ли смысл делать под эту систему или нет это дело каждого.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя Johnny
сообщение 8.3.2014, 11:45
Сообщение #6


Стаж: 13 лет

Сообщений: 2470
Благодарностей: 1086
Полезность: 515

Цитата(miRror @ 8.3.2014, 13:25) *
Мне лично не хочется, чтобы робокасса получала проценты с меня

Есть возможность, что бы она получала их только от клиентов.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя miRror
сообщение 8.3.2014, 11:55
Сообщение #7


Стаж: 15 лет

Сообщений: 1151
Благодарностей: 1002
Полезность: 967

Меценат Меценат

Ну это её дело с кого снимать деньги, мне лично другие способы оплаты не нужны, одного более чем хватает.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
am1go
сообщение 8.3.2014, 13:06
Сообщение #8
Стаж: 12 лет

Сообщений: 214
Благодарностей: 129
Полезность: 0

Меценат Меценат

Спасибо большое! нужна вешь thank_you2.gif
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
  Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: