Pull to refresh

Автоматизированный приём webmoney платежей на вашем сайте.

Reading time6 min
Views2.5K
0. Вступление

Ни для кого не секрет, что в последнее время webmoney набрало достаточную популярность для того, чтобы стать одним из самых удобных и доступных средств для безналичного расчёта через интернет. Пополнить баланс своего мобильного, оплатить покупку товаров в веб-магазине — всё это можно сделать с помощью webmoney.

Я бы хотел рассказать вам несколько способов, как можно устроить приём оплаты за какие либо товары или услуги на вашем сайте электронной валютой webmoney. Это, кстати, не так сложно, как могло бы показаться на первый взгляд!

1. Merchant WebMoney Transfer

Это тот инструмент, который предоставили нам разработчики для автоматизации совершения платежей. Merchant WebMoney Transfer представляет из себя набор интерфейсов для взаимодействия с системой WebMoney. Ниже я попытаюсь вкратце описать их.

1.1 Web Merchant Interface — самый простой способ для организации оплаты webmoney, основан на специальным образом сформированной форме, которая просто посылает пользователя и его данные на сайт webmoney, где он и совершает основные действия по оплате средств.
Всё, что нужно для приёма оплаты данным способом, это разместить на своём сайте 3 страницы — страницу с формой для оплаты, страницу успешно выполненного платежа и страницу невыполненного платежа. Затем вы единожды настраиваете серверную часть для обработки платежей и наслаждаетесь денежным потоком, хлынувшим в ваш карман =) Более подробное описание этого интерфейса доступно здесь: https://merchant.webmoney.ru/conf/guide_simple.asp.

1.2 Click&Buy Merchant Interface — Этот интерфейс позволяет покупателю платить webmoney одним кликом мыши, используя WM Keeper. Суть в следующем: покупатель кликает по специальной ссылке webmoney (вида wmk:paylink...) и уже в WM Keeper'е происходит весь процесс оплаты. Более подробное описание этого интерфейса доступно здесь https://merchant.webmoney.ru/conf/guide_pci.asp.

1.3 WM Automation Interface — Самая вкусняжка =) Это набор XML интерфейсов (15 штук, от X1 до X15) основанных на запросах к web-серверу webmoney по протоколу https в формате XML с использованием специального модуля аутентификации для ключей WM Keeper Classic
или стандартных сертификатов x.509 (сертификаты WM Keeper Light). С помощью этих интерфейсов вы можете производить широкий перечень действий во своим кошельком, например:

— Выписать счёт покупателю (X1)
— Получение истории и проверка оплаты счетов (X4)
— Получение баланса(X9)

и ещё много всего интересного. Собственно на этом интерфейсе, а точнее, на этом наборе интерфейсов я хотел бы остановиться подробнее.

2.XML – выбор профессионалов!

2.1 Постановка задачи — Однажды мне понадобилось реализовать прием и выдачу WM на сайте, в автоматическом режиме, с логированием движения денег, воизбежание казусов. Чтобы обеспечить полный автоматизм работы нужно использовать WM Automation Interface, поскольку другие виды интерфейсов не дадут нам должной функциональности.

2.2 Инструмент — Велосипеды изобретать мы не будем, а используем готовую библиотеку под названием WMXI. Она живёт по адресу my-tools.net/wmxi. Для её успешного функционирования сервер должен удовлетворять следующим требованиям: BCMath или GMP, MHash или Hash, CURL, MBString, Enabled XML. Чтобы проверить, удовлетворяет ли ваш хостинг данным условиям, можно воспользоваться утилитой check.php из комплекта WMXI.

2.3 Выписка счёта. Для начала, давайте реализуем самую простую задачу: выписку счёта от магазина клиенту. Для этих целей предусмотрен интерфейс X1, его мы и будем использовать. Однако не стоит забывать о том, что выписка счёта вовсе не гарантирует того, что он будет оплачен =) Так что, нужно будет позже проверять оплату счёта.

Вот и сам код:
<?php
//подключаем компоненты
include_once("wmxi/wmsigner.php");
include_once("wmxi/wmxi.php");
include_once("wmxi/wmxiparser.php");
//Создаём объект класса WMXI. Передаваемые параметры:
//путь к сертификату, используемому для защиты от атаки с подменой ДНС
//кодировка, используемая на сайте. По умолчанию используется UTF-8
$wmxi = new WMXI(realpath("../WebMoneyCA.crt"), DOC_ENCODING);
//Инициализация с помощью резервной копии ключей
//от Webmoney Keeper Classic. Передаваемые параметры:
//WMID - идентификатор пользователя
//пароль пользователя от резервной копии файла ключей
//путь к резервной копии файла ключей размером 164 байта
//или бинарное содержимое файла ключа
$wmxi->Classic("000000000000", "password", "../keys/000000000000.kwm");
//Создаем парсер ответа сервера
$parser = new WMXIParser();
//Собственно, сам запрос
$response = $wmxi->X1(
$wm_transfer, //номер счета в системе учета магазина; любое целое число без знака.
$_POST[wmid], //wmid покупателя
"Z999988887777", //Кошелёк магазина
floatval($_POST[money]), //число с плавающей точкой без незначащих символов
"Пополнение счёта на сайте MYSITE.RU", //произвольная строка от 0 до 255 символов; пробелы в начале или конце не допускаются
"http://mysite.ru", //произвольная строка от 0 до 255 символов; пробелы в начале или конце не допускаются
0, //целое число от 0 до 255; если 0 - протекция сделки при оплате счета не разрешена
1 //целое число от 0 до 255; если 0 - срок оплаты не определен
);
//Преобразовываем ответ сервера в структуру. Входные параметры:
//XML-ответ сервера
//кодировка, используемая на сайте. По умолчанию используется UTF-8
$structure = $parser->Parse($response, DOC_ENCODING);
//преобразуем индексы структуры к более удобным для доступа.
//лично я не понял зачем это, но с этим всё работает =)
$transformed = $parser->Reindex($structure, true);
//Если код выполнения запроса == 0 (запрос выполнен)
if($structure["w3s.response"]["retval"] == 0)
{
$transformed["w3s.response"]["reqn"]; // Номер запроса в системе WM
$transformed["w3s.response"]["invoice"]["orderid"]; //номер счёта в вашей системе, первый параметр при запросе
echo "Счёт на оплату успешно выписан!";
}
else echo $structure["w3s.response"]["retdesc"]; //Если ошибка, то выводим её.
?>


Вот и всё =). Счёт выписан, осталось только дождаться денег. Только с виду это кажется сложным, на самом деле всё суперпросто!

2.4 Проверка состояния счёта. Счёт выписан, а как узнать оплачен или нет. Тут нам на помощь приходит интерфейс X4. Он позволяет получить историю выписанных счетов по кошельку, а также проверить оплату счета, что в общем то нам и нужно. Давайте посмотрим, как это сделать:
<?php
//подключаем компоненты
include_once("wmxi/wmsigner.php");
include_once("wmxi/wmxi.php");
include_once("wmxi/wmxiparser.php");
//Создаём объект класса WMXI. Передаваемые параметры:
//путь к сертификату, используемому для защиты от атаки с подменой ДНС
//кодировка, используемая на сайте. По умолчанию используется UTF-8
$wmxi = new WMXI(realpath("../WebMoneyCA.crt"), DOC_ENCODING);
//Инициализация с помощью резервной копии ключей
//от Webmoney Keeper Classic. Передаваемые параметры:
//WMID - идентификатор пользователя
//пароль пользователя от резервной копии файла ключей
//путь к резервной копии файла ключей размером 164 байта
//или бинарное содержимое файла ключа
$wmxi->Classic("000000000000", "password", "../keys/000000000000.kwm");
//Создаем парсер ответа сервера
$parser = new WMXIParser();
//Собственно, сам запрос
$response = $wmxi->X4(
"Z999988887777",//Кошелёк магазина
0,//целое число > 0, номер счета в системе WM
$wm_transfer,//номер счета в системе учета магазина; любое целое число без знака
date("Ymd H:i:s", time()-86400),//минимальное время и дата создания счета
date("Ymd H:i:s", time())//максимальное время и дата создания счета
);
//Преобразовываем ответ сервера в структуру. Входные параметры:
//XML-ответ сервера
//кодировка, используемая на сайте. По умолчанию используется UTF-8
$structure = $parser->Parse($response, DOC_ENCODING);
//преобразуем индексы структуры к более удобным для доступа.
//лично я не понял зачем это, но с этим всё работает =)
$transformed = $parser->Reindex($structure, true);
//Если код выполнения запроса == 0 (запрос выполнен)
if($structure["w3s.response"]["retval"] == 0)
{
$state = $transformed["w3s.response"]["outinvoices"]["outinvoice"]["state"];
switch($state)
{
case 0:
echo "не оплачен";
break;
case 1:
echo "оплачен по протекции";
break;
case 2:
echo "оплачен окончательно";
break;
case 3:
echo "отказан";
break;
}
else echo $structure["w3s.response"]["retdesc"]; //Если ошибка, то выводим её.
?>

Вот и всё. Осталось только реализовать учет выписки и оплаты счетов в вашей БД, и полноценный веб-магазин готов!

3.Итого. Надеюсь у меня получилось доступно изложить принципы автоматической работы в WM счетами, несмотря на то, что это — моя первая статья, на тему программирования. Буду рад вашим вопросам, на которые с радостью отвечу!
Tags:
Hubs:
Total votes 48: ↑43 and ↓5+38
Comments12

Articles