Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Python Webmoney API

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

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

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

Я рассматриваю только 2-й вариант. Для запроса понадобится сертификат. Как его получить написано Тут. У меня получилось получить сертификат только из 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>
            

    Парсинг осуществляется с поддержкой библиотеки 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': '<w3s.request><reqn></reqn><getoutinvoices><datestart>20100101 00:00:00</datestart><datefinish>20140501 00:00:00</datefinish><purse>R328079907035</purse></getoutinvoices></w3s.request>',
 '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

Ссылки

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

Источник: programmingmaster.ru

 

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB