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>
              

      Парсинг осуществляется с помощью библиотеки 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
    


    Ссылки





    Буду рад замечаниям и помощи)
    • +31
    • 9,3k
    • 6
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 6
    • +1
      Не изучал напрямую возможности webmoney api, на сколько я понимаю, практически каждый сервис его предоставляет.
      Сейчас полистал ваши исходники, не могу сходу понять, наименования запросов какие то не очевидные, как я вижу, запросить историю переводов, послать сообщение — можно, а где собственно создание исходящей транзакции? Это возможно?

      p.s. не сложно добавить API сервиса wm.exchange.ru?
      • +2
        Методы одноименные интерфейсам из API Webmoney.
        В случае исходящей транзакции используется интерфейс X2.

        К топик стартеру — добавьте в .hgignore запись *.pyc
        • +1
          а еще *.egg, *.egg-info, *.sublime-*, dist
          • 0
            Извините, постоянно забываю. Добавил
            • +2
              Для .gitignore есть прекраснейший сервис gitignore.io. Вводите список технологий, получаете .gitignore.
        • 0
          Не, у них совсем другой интерфейс запросов

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.