Как работать с WebMoney из Perl?

| Нет комментариев | Нет трекбэков

Вы пишите на 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;

Тем, кому это интересно, и кто будет использовать

Просьба ко всем, кто будет использовать модуль (даже в тестовых целях) - напишите свои отзывы, замечания и предложения - это поможет дальше поддерживать и совершенствовать модуль

Источник

Нет трекбэков

URL для трекбэков: http://perlmonks.org.ru/cgi-bin/MT/engine/mt-tb.cgi/6

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

Об этой записи

Сообщение опубликовано 24.03.2009 14:37. Автор — Monks.

Предыдущая запись — Основатель движения свободного ПО нашел в браузере несвободные скрипты

Следующая запись — Perl & LWP часть 1

Смотрите новые записи на главной странице или загляните в архив, где есть ссылки на все сообщения.

Страницы


 


 

Page copy protected against web site content infringement by Copyscape