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»: , «retdesc»: , «response»:

retval — код ответа, возвращаемый вебманями. 0 если запрос успешен. Коды можно посмотреть тут retdesc — если retval!= 0, тут лежит описание ошибки response — распарсенный в OrderedDict ответ запроса. Тут лежат только данные, касающиеся запроса. Например, для запроса в response будет лежать распарсенный Парсинг осуществляется с помощью библиотеки github.com/martinblech/xmltodict Пример: поиск 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': '20100101 00:00:0020140501 00:00:00R328079907035', 'url': 'https://w3s.wmtransfer.com/asp/XMLOutInvoicesCert.asp', '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 Ссылки Буду рад замечаниям и помощи)

© Habrahabr.ru