1 Отредактировано marlik (10:11:2010 19:46:37)

Тема: Инструкции для приема webmoney через Web Merchant Interface.

Всю подробную информацию Вы можете найти на:
http://web-developer.pro/2010/03/nastro … oney.shtml

www.webmoney.ru и merchant.webmoney.ru.

Относительно недавно появилась возможность оплачивать товары, услуги в интернете посредством безопасных электронных платежей, в отличие от кредитных карт, пин коды которых воровали все кому не лень. Самым распространенным и удобным средством оплаты является конечно-же Webmoney. В этой статье я расскажу Вам как на своем сайте организовать автоматический сбор дензнаков с помощью Web Merchant Interface.

Как это работает

На этом примере http://web-developer.pro/2010/03/nastro … oney.shtml Вы можете убедится насколько это все быстро и моментально и не требует человеческого вмешательства. Примите к сведению что, реально деньги переводятся, так как это все работает в рабочем режиме, стоимость такого теста 1 рубль.

Основные термины:

ПРОДАВЕЦ

Продавцом считается участник WebMoney Transfer, принимающий на свой WM-кошелек оплату от других участников системы с помощью сервиса Web Merchant Interface.
Предполагается, что продавец принимает оплату за товары или услуги, предоставляемые им через Интернет, и следовательно, имеет собственный веб-сайт.

ПОКУПАТЕЛЬ

Покупателем считается участник WebMoney Transfer, желающий оплачивать услуги или товары, предлагаемые продавцом через Интернет.

Для передачи информации между веб-сайтом ПРОДАВЦА и сервисом Web Merchant Interface используютcя пять основных HTML-формы:

Форма запроса платежа - генерируется веб-сайтом продавца для формирования запроса на проведение платежа в сервисе Web Merchant Interface и передачи его через веб-браузер покупателя.

Форма предварительного запроса - генерируется сервисом Web Merchant Interface для передачи параметров предварительного запроса на выполнение платежа на веб-сайт продавца, если установлен флаг Передавать параметры в предварительном запросе. Если флаг не установлен - не используется (запрос выполняется без параметров). Запрос передается без использования веб-браузера покупателя.

Форма оповещения о платеже - генерируется сервисом Web Merchant Interface для передачи оповещения о платеже на веб-сайт продавца. Оповещение передается без использования веб-браузера покупателя.

Форма выполненного платежа - генерируется сервисом Web Merchant Interface в случае успешного выполнения платежа и передается на веб-сайт продавца через веб-браузер покупателя.

Форма невыполненного платежа - генерируется сервисом Web Merchant Interface в случае невыполнения платежа и передается на веб-сайт продавца через веб-браузер покупателя.

Итак, поподробнее, ПРОДАВЕЦ генерирует или показывает ПОКУПАТЕЛЮ, уже заранее готовую форму с ссылкой(Форма запроса платежа). ПОКУПАТЕЛЬ кликает по ссылке и его перебрасывает на сайт Мерчанта, Мерчант проверяет все данные ПОКУПАТЕЛЯ. Затем Мерчант делает запрос на сайт продавца(Форма предварительного запроса), тут лучше проверить параметры с которыми Мерчант сделал запрос. Далее после того как проверили все параметры, возвращаем YES, если что-то пошло не так, то возвращаем что-то другое, например Строку с ошибкой, и это Мерчант покажет ПОКУПАТЕЛЮ и соответственно платеж не пройдет. После того как Мерчант получил YES, он забирает дензнаки у ПОКУПАТЕЛЯ и передает их ПРОДАВЦУ, соответственно уведомляя об этом ПРОДАВЦА(Форма оповещения о платеже). Ну и самое несложное, это Форма выполненного платежа и Форма невыполненного платежа, там тоже передаются параметры но это уже не суть важно, процесс завершился, можно просто создать две html-страницы ok.html и bad.html с соответствующей переадресацией на главную страницу сайта.

Вот как выглядит Форма запроса платежа, это обычная html-страница, но в ней в скрытом поле(hidden) содержатся параметры запроса к мерчанту:

Код


<html>
<head>
...
</head>
<body>
...
<form method="POST" action="https://merchant.webmoney.ru/lmi/payment.asp">
<input type="hidden" name="LMI_PAYMENT_AMOUNT" value="12.00">
<input type="hidden" name="LMI_PAYMENT_DESC" value="платеж по счету">
<input type="hidden" name="LMI_PAYMENT_NO" value="1234">
<input type="hidden" name="LMI_PAYEE_PURSE" value="Z145179295679">
<input type="hidden" name="LMI_SIM_MODE" value="0">
<input type="hidden" name="FIELD_1" value="VALUE_1">
<input type="hidden" name="FIELD_2" value="VALUE_2">
...
<input type="hidden" name="FIELD_N" value="VALUE_N"> ... </form> ..

</body>
</html>


LMI_PAYMENT_AMOUNT Сумма платежа, которую продавец желает получить от покупателя. Сумма должна быть больше нуля, дробная часть отделяется точкой.

LMI_PAYMENT_DESC Описание товара или услуги. Формируется продавцом. Если присутствует, добавляется в назначение платежа в операцию перевода WM.

LMI_PAYMENT_NO В этом поле продавец задает номер покупки в соответствии со своей системой учета.

LMI_PAYEE_PURSE Кошелек продавца, на который покупатель должен совершить платеж. Формат - буква и 12 цифр.

LMI_SIM_MODE Режим тестирования, если 0 или отсутствует, для всех тестовых платежей сервис будет имитировать успешное выполнение, если в 1, для всех тестовых платежей сервис будет имитировать выполнение с ошибкой (платеж не выполнен), ну и в 2 около 80% запросов на платеж будут выполнены успешно, а 20% - не выполнены.

Об остальных полях читайте на сайте merchant.webmoney.ru


Об остальных полях читайте на сайте merchant.webmoney.ru

Теперь об интересном, все поля формы, не имеющие в названии префикса "LMI_", не обрабатываются сервисом Web Merchant Interface и передаются на веб-сайт продавца после выполнения платежа. Таким образом можно положить в скрытое поле какое-то значение и потом его проверить.

Для того что-бы контролировать процесс необходимо где-то сохранять данные о платеже. Можно использовать какую-нибудь БД. Можно просто сохранить в файлик на сервере. Я для этих целей использовал модуль Session.pm. Я создавал сессию минут на двадцать, что вполне достаточно, для совершения покупки и сохранял различные параметры ПОКУПАТЕЛЯ в неё, а в Форму запроса платежа вставлял идентификатор сессии, таким образом можно контролировать ПОКУПАТЕЛЯ на всей стадии проведения платежа. В принципе все видно в этом коде:

Код


sub sess {

my $sess_ID = new CGI::Session("driver:File", undef, {Directory=>'tmp/'}) || die;
$sess_ID -> expire('+20m');
my $id = $sess_ID->id();

# Сохраняем в сессию номер своего кошелька
# Цену которую хотим получить для последующей проверки
# Рекомендую сюда-же сохранить id товара, дабы избежать подмены

$sess_ID -> param("PAYMENT","$LMI_PAYMENT_AMOUNT");
$sess_ID -> param("PURSE","$LMI_PAYEE_PURSE");
$sess_ID -> close();               
return "$id";                     
}


sub show{
my $sid = sess(); 
print<<TT;
<center>
<form method="POST" action="https://merchant.webmoney.ru/lmi/payment.asp">
  <input type="hidden" name="LMI_PAYMENT_AMOUNT" value="1.00">
  <input type="hidden" name="LMI_PAYMENT_DESC" value="access">
  <input type="hidden" name="LMI_PAYMENT_NO" value="1234">
  <input type="hidden" name="LMI_PAYEE_PURSE" value="Z756713389772">
  <input type="hidden" name="LMI_SIM_MODE" value="0">
  <input type="hidden" name="SID" value="$sid">   
  <font color="red" size="4"><b>Нажмите на значок для оплаты 1\$ </b></font>
<input type="image" name="webmoney" value="payment" src="../m_wm.gif" alt="click it" align="middle"></a>
</form>
</center>
TT
   }


Вот Форма предварительного запроса. Параметр <Result URL> выставляется в настройках кошелька, на сайте Мерчанта, но об этом позже.

Код


<html>
<head>
...
</head>
<body>
...
<form method="POST" action="<Result URL>">
<input type="hidden" name="LMI_PREREQUEST" value="1">
<input type="hidden" name="LMI_PAYMENT_AMOUNT" value="1.0">
<input type="hidden" name="LMI_PAYMENT_NO" value="1">
<input type="hidden" name="LMI_PAYEE_PURSE" value="R222211112222">
<input type="hidden" name="LMI_MODE" value="1">
<input type="hidden" name="LMI_PAYER_WM" value="111122221111">
<input type="hidden" name="LMI_PAYER_PURSE" value="R111122221111">
<input type="hidden" name="FIELD_1" value="VALUE_1">
<input type="hidden" name="FIELD_2" value="VALUE_2"> ...
</form>
..
</body>
</html>


LMI_PREREQUEST Индикатор предварительного запроса, выставлен в 1. По нему мы узнаем что это предварительный запрос.

LMI_PAYMENT_AMOUNT Сумма платежа, которую продавец желает получить от покупателя. Сумма должна быть больше нуля, дробная часть отделяется точкой.

LMI_PAYMENT_NO В этом поле продавец задает номер покупки в соответствии со своей системой учета.

LMI_PAYEE_PURSE Кошелек продавца, на который покупатель должен совершить платеж. Формат - буква и 12 цифр.

LMI_MODE Флаг тестового режима, если в 0, Платеж выполнялся в реальном режиме, средства переведены с кошелька покупателя на кошелек продавца, если в 1, платеж выполнялся в тестовом режиме, средства реально не переводились.

LMI_PAYER_WM WM-идентификатор покупателя, совершаюшего платеж.

LMI_PAYER_PURSE WM-кошелек покупателя, совершаюшего платеж.

Об остальных полях читайте на сайте merchant.webmoney.ru

Тут мы должны проверить все параметры и если все правильно, выдать ответ YES Мерчанту. Вот код:

Код


my $secret_key="afdjkDdfngiuF{fhlgiukUJkf'hJgiurlkehgiUJurhghearonvkernhiuhvyrhghEJV";
   
print $cgi->header(-charset => 'windows-1251');

my $sid = $cgi -> param('sid');
my $LMI_PREREQUEST = $cgi -> param('LMI_PREREQUEST');
my $LMI_PAYEE_PURSE = $cgi -> param('LMI_PAYEE_PURSE');
my $LMI_PAYMENT_AMOUNT = $cgi -> param('LMI_PAYMENT_AMOUNT');
my $LMI_MODE = $cgi -> param('LMI_MODE');

my $sess_ID = new CGI::Session("driver:File", "$sid", {Directory=>'tmp/'}) || die;
my $PURSE = $sess_ID -> param("LMI_PAYEE_PURSE","$LMI_PAYEE_PURSE");
my $PAYMENT = $sess_ID -> param("LMI_PAYMENT_AMOUNT","$LMI_PAYMENT_AMOUNT");
$sess_ID -> close();


if($LMI_PREREQUEST == '1'){

if($PURSE ne $LMI_PAYEE_PURSE){
print "НЕВЕРНЫЙ КОШЕЛЕК ПОЛУЧАТЕЛЯ!!!";
}

if($PAYMENT ne $LMI_PAYMENT_AMOUNT){
  print "НЕВЕРНАЯ СУММА!!!";
}

if($MODE == $LMI_MODE){
print "ТЕСТОВЫЙ РЕЖИМ!!!";
}

ptint "YES";

}else{

my $LMI_PAYMENT_NO = $cgi -> param('LMI_PAYMENT_NO');
my $LMI_SYS_INVS_NO = $cgi -> param('LMI_SYS_INVS_NO');
my $LMI_SYS_TRANS_NO = $cgi -> param('LMI_SYS_TRANS_NO');
my $LMI_SYS_TRANS_DATE = $cgi -> param('LMI_SYS_TRANS_DATE');
my $LMI_PAYER_PURSE = $cgi -> param('LMI_PAYER_PURSE');
my $LMI_PAYER_WM = $cgi -> param('LMI_PAYER_WM');
my $LMI_HASH = $cgi -> param('LMI_HASH');

my $hash=md5_hex("$LMI_PAYEE_PURSE.$LMI_PAYMENT_AMOUNT. $LMI_PAYMENT_NO.$LMI_MODE.$LMI_SYS_INVS_NO.$LMI_SYS_TRANS_NO.
$LMI_SYS_TRANS_DATE.$LMI_PAYER_PURSE.$LMI_PAYER_WM");

if($hash != $LMI_HASH){

my $str = get('http://webmaster.blogsite.org/rezul-tat-vashego-platezha.shtml');
print "$str";

}else{

# В этом блоке пишем что мы должны сделать после того как платеж прошел,
# в связи со спецификой каждого магазина, возможно кто-то захочет сохранить
# в базу данных заказ, и послать e-mail владельцу ресурса

}

       }


Ну вот в принципе и все, осталось только настроить свой кошелек, идем на merchant.webmoney.ru логинимся в систему, и настраиваем тот кошелёк на который вы хотели принимать платежи.

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

Secret Key: здесь можно ввести пароль, да позаковыристие, этот параметр знает только Мерчант и Вы, можно использовать при проверке параметров запроса, например : afdjkDdfngiuF{fhlgiukUJkf'hJgiurlkehgiUJurhghearonvkernhiuhvyrhghEJV.

Result URL: тут вставляем путь к нашему скрипту например http://your_site/cgi-bin/result.pl
Передавать параметры в предварительном запросе: ставим в этом чекбоксе галочку.

Succsess URL: тут вставляем путь к странице ok.html например http://your_site/ok.html в самой странице пишем что все о-кей и переадресуем ПОКУПАТЕЛЯ.
Метод вызова Succsess URL: выставляем LINK.

Fail URL: тут вставляем путь к странице bad.html например http://your_site/bad.html в самой странице пишем что все плохо и переадресуем ПОКУПАТЕЛЯ.

Метод вызова Fail URL: выставляем LINK.

Высылать оповещение об ошибке платежа на кипер: ставим галочку, на всякий случай.

Метод формирования контрольной подписи: SIGN, хотя это роли не играет, все равно проверку контрольной подписи делать не будете из-за 100 баксов.

Тестовый/Рабочий режимы: пока не настроили прием денюжек лучше оставить Тестовый.

Активность: ВКЛ. Это что-бы уже тестить можно было, иначе работать не будет.

Жмем сохранить.