Вы пишите на Perl свой сайт, и хотели бы добавить возможность оплаты по WM ваших товаров,услуг и т.п?
Для этих целей подойдет модуль Business::WebMoney, написанный a-lourier
Выдержки из описания самим автором использования этого модуля далее. Сам модуль можно найти на CPAN
WebMoney Transfer - полноценная среда финансовых взаимоотношений в интернете. Её ядром является платежная система, которая позволяет участникам обмениваться цифровой наличностью безопасным способом. В отличие от многих других платежных систем, WebMoney предоставляет богатый API, позволяющий не только принимать платежи от покупателей в интернет-магазине, но и выполнять другие действия (передавать деньги, работать с платежами, защищенными кодом протекции, получать историю операций, обмениваться сообщениями по WM-почте).
Мной написан модуль Business::WebMoney, который распространяется по свободной лицензии, и уже получил статус официального Perl-интерфейса системы.
Подключение Business::WebMoney - всё, как обычно, без сюрпризов
Сначала установим модуль из CPAN:
# perl -MCPAN -e 'install Business::WebMoney'
Если у вас Debian или основанный на нем дистрибутив, то можно добавить в /etc/apt/sources.list строчку:
deb http://deb.rulezz.ru/debian/ aml main
и выполнить:
# aptitude update # aptitude install libbusiness-webmoney-perl
После установки модуля добавим в скрипт, который будет использовать 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 транзакции, которой был оплачен счет. Он нам еще пригодится.
Если мы хотим вернуть деньги за неоказанную услугу, достатчно вызвать соответствующий метод:
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;
Тем, кому это интересно, и кто будет использовать
Просьба ко всем, кто будет использовать модуль (даже в тестовых целях) - напишите свои отзывы, замечания и предложения - это поможет дальше поддерживать и совершенствовать модуль



Комментировать