...

понедельник, 12 мая 2014 г.

Python Webmoney API

Потребовалось мне как то реализовать поддержку Webmoney API (Документация) в проекте. Библиотек на питоне я не нашел, поэтому решил написать свою.


Ссылка на репозиторий


Итак, есть два варианта запроса к апи вебманей.



  • Keeper Classic — каждый запрос подписывается с помощью проги WMSign

  • Keeper Light — запросы отправляются через защищенное HTTPS соединение с клиентским сертификатом.


Я рассматриваю только второй вариант. Для запроса потребуется сертификат. Как его получить написано Здесь. У меня получилось получить сертификат только из Firefox'а, Chrome вообще не поддерживает такую возможность, а Explorer (Windows 8) выдал ошибку. После получения сертификат нужно экспортировать в файл. Какк это сделать написано Тут


Сертификат экспортируется в pkcs12 файл. Нужно из него получить публичный и приватный ключи. Делается это командами:



openssl pkcs12 -in path.p12 -out crt.pem -clcerts -nokeys
openssl pkcs12 -in path.p12 -out key.pem -nocerts -nodes


Работа с API


Пакет можно установить через pip:



pip install webmoney-api


После установки импортируем библиотеки



from webmoney_api import ApiInterface, WMLightAuthInterface


WMLightAuthInterface — класс, описывающий аутентификацию через Keeper Light.

ApiInterface — класс апи.


Подключаем:



>>> api = ApiInterface(WMLightAuthInterface("/home/stas/wmcerts/crt.pem", "/home/stas/wmcerts/key.pem"))


При инициализации WMLightAuthInterface, передаем в него пути до наших сгенеренных публичного и приватного ключа

После подключения доступны следующие методы:


x1 — x10 — соответствуют аналогичным интерфейсам вебманей. Параметры передаются поименно в вызываемый метод.

Дополнительно можно передать параметр reqn — номер запроса.


Метод делает запрос и возвращает данные в формате:



{"retval": <retval>,
"retdesc": <retdesc>,
"response": <response}


где



  • retval — код ответа, возвращаемый вебманями. 0 если запрос успешен. Коды можно посмотреть тут

  • retdesc — если retval != 0, тут лежит описание ошибки

  • response — распарсенный в OrderedDict ответ запроса. Тут лежат только данные, касающиеся запроса. Например, для запроса

    <w3s.response>
    <reqn></reqn>
    <retval></retval>
    <retdesc></retdesc>
    <operation id="n1" ts="n2">
    <tranid></tranid>
    <pursesrc></pursesrc>
    <pursedest></pursedest>
    <amount></amount>
    <comiss></comiss>
    <opertype></opertype>
    <period></period>
    <wminvid></wminvid>
    <orderid></orderid>
    <desc></desc>
    <datecrt></dateupd>
    <dateupd></dateupd>
    </operation>
    </w3s.response>




    в response будет лежать распарсенный

    <operation id="n1" ts="n2">
    <tranid></tranid>
    <pursesrc></pursesrc>
    <pursedest></pursedest>
    <amount></amount>
    <comiss></comiss>
    <opertype></opertype>
    <period></period>
    <wminvid></wminvid>
    <orderid></orderid>
    <desc></desc>
    <datecrt></dateupd>
    <dateupd></dateupd>
    </operation>




    Парсинг осуществляется с помощью библиотеки http://ift.tt/1nxalRF


Пример: поиск ID юзера по кошельку



>>> api.x8(purse="R328079907035", reqn=int(time.time()))["response"]
OrderedDict([(u'wmid', OrderedDict([(u'@available', u'0'), (u'@themselfcorrstate', u'0'), (u'@newattst', u'110'), ('#text', u'407414370132')])), (u'purse', OrderedDict([(u'@merchant_active_mode', u'-1'), (u'@merchant_allow_cashier', u'-1'), ('#text', u'R328079907035')]))])

>>> api.x8(purse="R328079907035", reqn=int(time.time()))["response"]["wmid"]["#text"]
u'407414370132'

>>> api.x8(purse="R328079907035", reqn=int(time.time()))["response"]["wmid"]["@available"]
u'0'


Пример: получение истории всех выписанных счетов по кошельку



>>> api.x4(purse="R328079907035", datestart="20100101 00:00:00", datefinish="20140501 00:00:00")
ValueError: Error while requesting API. retval = -4, retdesc = wrong w3s.request/reqn step=2
Request data: {'cert': ('/home/stas/wmcerts/crt.pem', '/home/stas/wmcerts/key.pem'),
'data': '<w3s.request><reqn></reqn><getoutinvoices><datestart>20100101 00:00:00</datestart><datefinish>20140501 00:00:00</datefinish><purse>R328079907035</purse></getoutinvoices></w3s.request>',
'url': 'http://ift.tt/1lk5qAc',
'verify': False}


Ошибка, т.к. не передан параметр reqn. Передадим его:



>>> api.x4(purse="R328079907035", datestart="20100101 00:00:00", datefinish="20140501 00:00:00", reqn=int(time.time()))
{'response': OrderedDict([(u'@cnt', u'0'), (u'@cntA', u'0')]),
'retdesc': None,
'retval': u'0'}


Пример: получение списка счетов на оплату



>>> for order in api.x10(wmid="407414370132", datestart="20100101 00:00:00", datefinish="20140501 00:00:00", reqn=int(time.time()))["response"]["ininvoice"]:
>>> print order["orderid"], order["amount"], order["state"]

4640849 122.40 2
24 1.00 2
27 0.40 2


Ссылки


Буду рад замечаниям и помощи)


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


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

Отправить комментарий