Pull to refresh

Работа с WebMoney API

Reading time 4 min
Views 54K
WebMoney Transfer уже давно является для многих привычным способом расчётов в интернете. Одним из достоинств системы является богатый API для взаимодействия со программным обеспечением сторонних сервисов. Через него можно получать состояния ваших счетов, осуществлять денежные переводы, выставлять клиентам счета на оплату, контролировать их оплату, возвращать платежи без комиссии, работать с платежами с протекцией, получать информацию из аттестатов других пользователей, отправлять сообщения по внутренней почте WM. На сайте WebMoney есть хорошая документация на API.

Вашим покорным слугой написан модуль Business::WebMoney, который распространяется по свободной лицензии и получил статус официального Perl-интерфейса системы.

Подключение Business::WebMoney — всё, как обычно, без сюрпризов


Сначала установим модуль из CPAN:

# perl -MCPAN -e 'install Business::WebMoney'

После установки модуля добавим в скрипт, который будет использовать API, строчку:

use Business::WebMoney;

Для работы модуля нужны секретный ключ и сертификат, которые эскпортируются из браузера в виде файла PKCS12 (.p12) после регистрации в WebMoney Keeper Light. Ключи от WebMoney Keeper Classic не подходят — модуль не поддерживает работу с ними (хотя есть обходной путь — см. последний абзац). Путь к файлу p12 и пароль от него указываются в виде параметров конструктора:

my $wm = Business::WebMoney->new(
        p12_file => '/path/to/your/certificate.p12',
        p12_pass => 'certificate_password',
);

Первая проверка — сколько у нас денег осталось


Сначала посмотрим, какие кошельки у нас есть, и сколько денег в них лежит:

my $res = $wm->get_balance(
        reqn => ++$reqn,
        wmid => '123456789012',
) or die $wm->errstr;

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

Параметр wmid — это ваш Webmoney ID. Если у вашего основного WMID есть доступ к другим WMID, то можно смотреть кошельки любого из них. Метод get_balance возвращает ссылку на список кошельков, для каждого из которых получается его имя (поле pursename), валюта (поле desc) и остаток денег (поле amount).

Для интернет-магазина — выставим счет, проверим оплату, вернем деньги


Самый простой способ сделать интернет-магазин — воспользоваться сервисом WebMoney Merchant: зарегистрировались, получили код для формы, установили на сайт. В случае успешной оплаты вы получите http-запрос от сервера системы Merchant с номером платежа, суммой, валютой и защитной md5-сверткой. В случае возникновения нештатных ситуаций будут возникать необработанные ситуации. Например, если по каким-то причинам http-запрос об успешном платеже не пройдёт, то вы получите жалобу от клиента, что он заплатил деньги, а услуга ему не была оказана. Это значит, что нужно периодически проверять оплату счетов по инициативе сервера интернет-магазина. Или ситуация, когда выполнить заказ клиента невозможно, и необходимо вернуть деньги. Все это можно автоматизировать при помощи WebMoney API.

Для начала выставим счет (при использовании Merchant это делается автоматически, и этот шаг необходимо пропустить):

my $res = $wm->invoice(
        reqn => ++$reqn,
        orderid => $orderid,
        customerwmid => $contragent_wmid,
        storepurse => $my_purse,
        amount => 1000000,
        desc => 'Заплати миллион, и будет тебе счастье'
) or die $wm->errstr;

orderid — это номер счета в нашей собственной БД. customerwmid — это WMID покупателя, которому выставляем счет. storepurse — кошелек, на который мы ждем денег. amount — сумма, desc — описание.

Теперь будем периодически запрашивать список счетов, выставленных нами за интервал времени $datestart — $datefinish, и контролировать оплату по ним:

my $res = $wm->get_out_invoices(
        reqn => ++$reqn,
        purse => $my_purse,
        datestart => $datestart,
        datefinish => $datefinish,
) or die $res->errstr;

Возвращается ссылка на массив хэшей, проверяем поле state у каждого. Если там 0, значит счет еще не оплачен. Если 2, то счет оплачен — можно оказывать услугу, если мы еще этого не сделали. 1 — счёт оплатили с протекцией, 3 — отказались от оплаты. Поле wmtranid — это ID транзакции, которой был оплачен счет. Он нам еще пригодится.

Если мы хотим вернуть деньги за неоказанную услугу, достатчно вызвать метод money_back:

my $res = $wm->money_back(
        reqn => ++$reqn,
        inwmtranid => $wmtranid,
        amount => $amount,
) or die $wm->errstr;

Передаем туда в поле inwmtranid ID транзакции, которой нам заплатили деньги, а в amount — сумму платежа. Деньги будут возвращены покупателю, причем (внимание!) без комиссии 0.8%.

И, наконец, передадим спасибо за покупку (разумеется, это лишь демонстрация возможностей. Спамить покупателям не надо):

my $res = $wm->message(
        reqn => ++$reqn,
        receiverwmid => $contragent_wmid,
        msgsubj => 'Тема сообщения',
        msgtext => 'Текст сообщения',
) or die $wm->errstr;

Подключение доступа к API


Чтобы получить доступ к большинству из перечисленных функций необходимо иметь персональный аттестат и написать письмо через внутреннюю почту WebMoney в WM Technical Support с просьбой о подключении и списком IP, с которых будет производиться доступ.

Безопасность ключей


В большинстве случаев можно обойтись без выкладывания на боевой сервер основных ключей от кошелька. Этого можно добиться через механизм доверенностей WebMoney. Вы можете создать отдельный WMID, делегировать ему полномочия на выставление счетов и контроль оплаты от имени основного WMID, и даже в случае компрометации ключа ваши деньги будут в безопасности.
Tags:
Hubs:
+29
Comments 34
Comments Comments 34

Articles