о WebMoney
Информационный портал о WebMoney
  
  
подписка  
реклама здесь 
обратная связь 
  Материалы      Вопросы и ответы     Курс обучения      Файлы
 Кофейня      WebMoney TOP      p2p      WM-Клуб      Гид   
о WebMoney / Материалы / XML-интрфейсы обменной биржи

XML-интрфейсы обменной биржи

© Никита Сенченко, 17.11.2013

моя оценка:
[средняя: 5]

У биржи wm.exchanger.ru есть XML-интерфейсы, с помощью которых работу с Биржей можно автоматизировать, поручить роботам. Какую выгоду это дает? Роботы круглосуточно могут отслеживать обменные курсы, "ловить" наиболее выгодные заявки и совершать обмен по ним.


Как известно, на Бирже WM Exchanger можно совершить обмен одного типа WM-денег на другой. Также известно, что менять здесь выгодно, поскольку обменные курсы формируются самими пользователями исходя из рыночной ситуации.

У Биржи есть XML-интерфейсы, с помощью которых работу с Биржей можно автоматизировать, поручить роботам. Какую выгоду это дает? Роботы круглосуточно могут отслеживать обменные курсы, "ловить" наиболее выгодные заявки и совершать обмен по ним. WM Exchanger - это внутренний Форекс в WebMoney, и интерфейсы помогут зарабатывать на курсовых колебаниях и спекулировать на этом (я вам этого не говорил ;) Здесь мы рассмотрим эти интерфейсы и реализуем некоторые их них на PHP.

Еще раз вспомним, как работает Биржа. Один пользователь ставит заявку на обмен, допустим, своих WMZ на WMR. А другой пользователь, которому нужно отдать WMR и получить WMZ, если его устраивают условия данной заявки - удовлетворяет её. Так происходит обмен. При этом Биржа гарантирует сделку, поскольку забирает с кошельков у обоих пользователей нужные суммы и передает их контрагентам по сделке.

Из заявок, поданных пользователями, формируется листинг - список заявок на обмен в одинаковом направлении, где первой идет наиболее выгодная заявка, а последней - наименее выгодная. Скажем, вот так выглядит листинг заявок, по которым юзеры готовы отдать свои WME и получить WMZ.



У каждой заявки есть 2 параметра: "Сумма, которую хочу отдать", "Сумма, которую хочу получить". Если поделить первое на второе - получится т.н. прямой курс обмена, а если поделить второе на первое - получится т.н. обратный курс обмена. Других существенных параметров у заявки нет, разве что её уникальный номер на Бирже.

Как работают XML-интерфейсы Биржи

Все XML-интерфейсы описаны здесь. На данный момент их 10.

Прежде, чем начать, есть одно замечание. Когда юзер удовлетворяет (принимает) чью-то существующую заявку, делая это через сайт Биржи, для него всё выглядит просто: выбрал направление, выбрал в нем заявку, отдал WM с кошелька, получил другие WM на кошелек. Если же мы делаем то же самое с помощью XML-интерфейсов, то процесс будет выглядеть по-другому:

А) Найти подходящую заявку. Запомнить ее номер, "Сумму, которую хочу отдать", "Сумму, которую хочу получить" - см. интерфейс номер 2.
В) Поставить свою заявку в противоположном направлении, зеркальную к заявке, которую только что нашли в п.А - см. интерфейс номер 8.
С) "Купить" найденную в п.А заявку из денег своей заявки - см. интерфейс номер 9.

Согласен, не очень очевидная модель (почему бы сразу не купить искомую заявку, не выставляя свою?), но так уж устроена Биржа.

Собственно говоря, в статье мы и рассмотрим эти 3 основных интерфейса. Остальные интерфейсы менее важны и для большинства задач могут не понадобиться, поэтому вы разберетесь с ними сами.

Допустим, нам нужно поменять наш 1 000 000 WMR на WMZ по наиболее выгодным на данный момент курсам. Понятное дело, встречной заявки ровно на такую огромную сумму на Биржи нет.

Вариант 1

Находим заявку, по которой кто-то отдает 300 WMR и хочет получить 10 WMZ - используем для поиска ИНТЕРФЕЙС НОМЕР 2. Нас эти условия устраивают, и мы решаемся на обмен. Для этого выставляем свою заявку, по которой отдаем 10 WMZ и хотим получить 300 WMR - используем ИНТЕРФЕЙС НОМЕР 8. Затем покупаем ту заявку из своей - используем ИНТЕРФЕЙС НОМЕР 9.

Так поступаем до тех пор, пока не потратим наш 1 000 000 WMR, всякий раз подавая свою заявку и "покупая" за нее чью-то чужую.

Вариант 2

Ставим заявку, по которой отдаем 1 000 000 WMR и хотим получить WMZ - используем ИНТЕРФЕЙС НОМЕР 8. Теперь просматриваем встречный листинг (тех, кто отдает WMZ и хочет WMR) начиная от самой выгодной заявки - используем ИНТЕРФЕЙС НОМЕР 2. Покупаем каждую встречную заявку из денег собственной заявки до тех пор, пока не потратим весь 1 000 000 WMR - используем ИНТЕРФЕЙС НОМЕР 9.

В первом случае мы ставили и удовлетворяли каждую встречную заявку отдельно, а во втором случае сначала поставили свою одну большую заявку и скупили по ней столько встречных заявок, сколько это было возможно.

Механика в обоих случаях одинакова. XML-интерфейсы тоже используются одни и те же. В чем же разница? Только в наших потерях на комиссии 0.8%! Когда мы ставим заявку, мы отдаем WM с кошелька, при этом теряем 0.8%. За счет того, что минимальная комиссия в WebMoney = 0.01 WM , то на мелких суммах можно потерять больше, чем 0.8%. Наоборот, максимальная комиссия при переводе, допустим, WMR = 1500 WMR. Таким образом, переводя на Биржу сразу 1 000 000 WMR, мы теряем намного меньше, чем 0.8%

Итак, намного выгоднее поставить одну большую заявку на всю сумму и скупать из нее встречные заявки одну за другой.

Интерфейс 2. Получение списка заявок

Этот интерфейс простой, не требует наложения цифровой подписи. Просто читаете поток из определенного адреса и получаете XML, в котором содержится перечень текущих заявок, выставленных по заданному направлению, ровно такой же перечень, который вы можете видеть на сайте Биржи.

Какой именно адрес должен запрашивать этот интерфейс? URL такой: https://wm.exchanger.ru/asp/XMLWMList.asp?exchtype=X

В параметре exchtype вместо Х нужно передавать цифру, которая обозначает направление обмена. Вот их список этих цифр:

  • отдают WMZ хотят WMR - 1
  • отдают WMR хотят WMZ - 2
  • отдают WMZ хотят WME - 3
  • отдают WME хотят WMZ - 4
  • отдают WME хотят WMR - 5
  • отдают WMR хотят WME - 6
  • отдают WMZ хотят WMU - 7
  • отдают WMU хотят WMZ - 8
  • отдают WMR хотят WMU - 9
  • отдают WMU хотят WMR - 10
  • отдают WMU хотят WME - 11
  • отдают WME хотят WMU - 12
  • отдают WMB хотят WMZ - 17
  • отдают WMZ хотят WMB - 18
  • отдают WMB хотят WME - 19
  • отдают WME хотят WMB - 20
  • отдают WMR хотят WMB - 23
  • отдают WMB хотят WMR - 24
  • отдают WMZ хотят WMG - 25
  • отдают WMG хотят WMZ - 26
  • отдают WME хотят WMG - 27
  • отдают WMG хотят WME - 28
  • отдают WMR хотят WMG - 29
  • отдают WMG хотят WMR - 30
  • отдают WMU хотят WMG - 31
  • отдают WMG хотят WMU - 32
  • отдают WMZ хотят WMX - 33
  • отдают WMX хотят WMZ - 34
  • отдают WME хотят WMX - 35
  • отдают WMX хотят WME - 36
  • отдают WMR хотят WMX - 37
  • отдают WMX хотят WMR - 38
  • отдают WMU хотят WMX - 39
  • отдают WMX хотят WMU - 40

    Допустим, вы хотите получить список заявок, по которым вы сможете купить WMR в обмен на свои WMG - тогда вы запрашиваете https://wm.exchanger.ru/asp/XMLWMList.asp?exchtype=9

    Что в ответе? XML со списком заявок, в каждой из которых есть такие атрибуты:

  • id - уникальный номер заявки;
  • amountin - сколько по данной заявке отдают исходной валюты;
  • amountout - сколько по данной заявке хотят получить конечной валюты;
  • querydate - дата и время постановки заявки.

    Есть и другие параметры, но они маловажные. В частности, там есть и курс обмена, полученный путем деления amountin на amountout, но точность у него низкая - до 4 знака после запятой. Этого часто бывает недостаточно, поэтому этот курс мы легко вычислим сами (см. чуть ниже функцию GetOrders()).

    Кстати, заявки в ответе уже отсортированы от более выгодных к менее выгодным, так же, как они отображаются и на сайте Биржи.

    Как будем получать XML ответ? С помощью модуля curl. Напишем для этого короткую функцию:

    function GetAnswer($url, $method, $content) {
    if($method=="GET") {
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    } elseif($method=="POST") {
    $curl = curl_init($url);
    curl_setopt($curl, CURLOPT_POST,1);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $content);
    }
    curl_setopt($curl, CURLOPT_HEADER, 0);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER,true);
    $out = curl_exec($curl);
    curl_close($curl);
    return $out;
    }


    Эта функция универсальная, с ее помощью можно запрашивать удаленный адрес ($url) как методом GET, так и методом POST с передачей необходимого содержимого. На выходе функции содержится XML, который мы получили в ответе от Биржи.

    Как будем обрабатывать этот XML? С помощью модуля SimpleXML и его возможностей. Напишем полностью функцию, реализующую интерфейс 2:

    function GetOrders($direction) {
    $url = "https://wm.exchanger.ru/asp/XMLWMList.asp?exchtype=".$direction;
    $content = GetAnswer($url, "GET", "");
    $xmlres = simplexml_load_string($content);
    if($xmlres) {
    foreach ($xmlres->WMExchnagerQuerys->query as $item) {
    $Id=strval($item->attributes()->id);
    $AmountIn=strval($item->attributes()->amountin);
    $AmountIn=str_replace(",",".",$amountIn);
    $AmountOut=strval($item->attributes()->amountout);
    $AmountOut=str_replace(",",".",$AmountOut);
    $OrderDate=strval($item->attributes()->querydate);
    $DirectRate=round($AmountIn/$AmountOut,8);
    $ReverseRate=round($AmountOut/$AmountIn,8);
    $Arr[$Id] = Array($AmountIn, $AmountOut, $OrderDate, $DirectRate, $ReverseRate);
    }
    }


    Итак, на вход функции надо подать $direction с цифрой, которая обозначает запрашиваемое направление обмена (см. большой список выше), а на выходе имеем массив $Arr, в который уложены все полученные заявки.

    Мы самостоятельно посчитали прямой и обратный курс ($DirectRate и $ReverseRate) с точностью до 8 знаков после запятой и тоже уложили их в $Arr.

    Содержимое $Arr можно посмотреть так: print_r($Arr). Теперь с этим массивом можно работать так, как это требуется для вашей задачи.

    Интерфейс 8. Выставление своей заявки

    Если вы никогда раньше не работали с интерфейсами WebMoney, то тут вам придется остановится и прочитать вот эту статью. Данный интерфейс требует подписания запроса ключом от вашего WMID, поэтому нужно:
  • скачать и скомпилировать на сервере wmsigner,
  • разместить на сервере файл kwm от вашего Keeper Classic,
  • разместить на сервере файл вида XXXXXXXXXXXX.ini (где ХХХХХХХХХХХ - ваш WMID),
  • настроить на файлы соответствующие права.

    Пользователи Keeper Light должны использовать браузерный сертификат. Те, кто используют только Keeper Mini, не смогут воспользоваться эти интерфейсом - нужно зарегистрироваться в Classic или Light и получить файл kwm, либо браузерный сертификат.

    А еще после этого нужно выдать доверенность для WMID 128984249415 на выполнение переводов от вашего кошелька. С этого кошелька Биржа будет списывать вебмани в момент выставления вами заявки с помощью данного интерфейса. Например, если вы планируете выставить заявку, по которой отдаете WMZ и хотите получить WMR, тогда выдайте доверенность от вашего Z-кошелька. Сделать это нужно 1 раз.

    Теперь еще нам понадобится функция, которая будет генерировать цифровую подпись с помощью wmsigner и вашего kwm. Вот она:

    function _GetSign($inStr) { 
    $Path_Folder = "/path/to/kwm/";
    $Path_Signer = "/path/to/wmsigner/wmsigner";
    $MyWMID = "XXXXXXXXXXXX";
    chdir($Path_Folder);
    $descriptorspec = array(
    0 => array("pipe", "r"),
    1 => array("pipe", "w"),
    2 => array("pipe", "r") );
    $command=$Path_Signer." -i ".$MyWMID.".ini";
    $process = proc_open($command, $descriptorspec, $pipes);
    fwrite($pipes[0], "$inStr\004\r\n");
    fclose($pipes[0]);
    $s = fgets($pipes[1], 133);
    fclose($pipes[1]);
    $return_value = proc_close($process);
    return $s;
    }


    В переменной $Path_Folder запишите полный путь на сервере до директории, где лежит ваш kwm-файл и файл WMID.ini (их желательно поместить в одну директорию, причем для безопасности эта директория должна быть выше директории с веб-документами). В переменной $Path_Signer запишите полный путь на сервере до файла wmsigner в той директории, куда он был скомпилирован. В переменной $MyWMID - запишите ваш WMID.

    Теперь, собственно, напишем функцию, которая отправит запрос на Биржу о постановке новой обменной заявки. Такой запрос нужно отправлять на адрес https://wm.exchanger.ru/asp/XMLTrustPay.asp

    function SetOrder($frompurse, $topurse, $fromamount, $toamount) {
    $MyWMID = "XXXXXXXXXXXX";
    $sign = _GetSign($MyWMID.$frompurse.$topurse.$fromamount.$toamount);
    $xml = "
    <wm.exchanger.request>
    <wmid>$MyWMID</wmid>
    <signstr>$sign</signstr>
    <inpurse>$frompurse</inpurse>
    <outpurse>$topurse</outpurse>
    <inamount>$fromamount</inamount>
    <outamount>$toamount</outamount>
    </wm.exchanger.request>";
    $resxml = GetAnswer("https://wm.exchanger.ru/asp/XMLTrustPay.asp", "POST", $xml);
    $xmlres = simplexml_load_string($resxml);
    $result['retval'] = strval($xmlres->retval);
    $result['retdesc'] = iconv("UTF-8", "CP1251", strval($xmlres->retdesc));
    $result['operid'] = strval($xmlres->retval->attributes()->operid);
    $result['wmtransid'] = strval($xmlres->retval->attributes()->wmtransid);
    return $result;
    }


    На входе функции следующие параметры:

  • $frompurse - ваш кошелек, с которого будет списана исходная валюта;
  • $topurse - ваш кошелек, на который Биржа зачислит конечную валюту;
  • $fromamount - сумма исходной валюты;
  • $toamount - сумма конечной валюты.

    Внутри функции в $MyWMID - запишите ваш WMID.

    Внутри этой функции содержится вызов уже написанной ранее функции GetAnswer(). В данном случае мы передаем наш XML-запрос (он содержится в $xml) на адрес https://wm.exchanger.ru/asp/XMLTrustPay.asp методом POST.

    Что на выходе этой функции? Массив $result с параметрами ответа, полученными от Биржи. Если наша заявка была выставлена успешно, то в $result['retval'] будет "0", а в $result['operid'] будет уникальный номер нашей заявки на Бирже. $result['retdesc'] содержит текстовое описание ошибки, если заявка НЕ выставлена.

    Интерфейс 9. Покупка чужой заявки из своей заявки

    Этот интерфейс также требует цифровой подписи, поэтому см. что для этого нужно в описании интерфейса 8.

    Вот функция BuyOrder(), которая реализует данный интерфейс (отправляем XML-запрос на адрес https://wm.exchanger.ru/asp/XMLQrFromTrIns.asp методом POST).

    function BuyOrder($myid, $id, $orderdateStamp) {
    $MyWMID = "XXXXXXXXXXXX";
    $sign=_GetSign($MyWMID.$myid.$id);
    $xml="
    <wm.exchanger.request>
    <wmid>$MyWMID</wmid>
    <signstr>$sign</signstr>
    <isxtrid>$myid</isxtrid>
    <desttrid>$id</desttrid>
    <deststamp>$orderdateStamp</deststamp>
    </wm.exchanger.request>";
    $resxml=_GetAnswer("https://wm.exchanger.ru/asp/XMLQrFromTrIns.asp", "POST", $xml);
    $xmlres = simplexml_load_string($resxml);
    $result['retval']=strval($xmlres->retval);
    $result['retdesc']=iconv("UTF-8", "CP1251", strval($xmlres->retdesc));
    return $result;
    }


    На входе функции следующие параметры:

  • $myid - номер нашей заявки, которую мы только что выставили с помощью интерфейса 8. Этот номер вы получили на выходе функции SetOrder() в параметре $result['operid'];
  • $id - номер заявки, которую мы хотим купить. Этот номер мы получили в интерфейсе 2 наряду с id других заявок (номера заявок там содержались в ключах массива $Arr: $Arr[$Id]);
  • $orderdateStamp - специальное проверочное число, равное сумме часа, минуты и секунды из даты заявки, которую мы хотим купить. Напомним, эту дату заявки мы получили в параметре $OrderDate интерфейса 2. Как сформировать $orderdateStamp для передачи в функцию BuyOrder()? Вот так:

    $OrderDate = полученная из функции GetOrders() дата нужной нам заявки;
    $OrderDate=substr($OrderDate, -8); $OrderDate_expl=explode(":", $OrderDate);
    $orderateStamp=$OrderDate_expl[0]+$OrderDate_expl[1]+$OrderDate_expl[2];


    Внутри функции в $MyWMID - запишите ваш WMID.

    На выходе этой функции GetOrders() массив $result с параметрами ответа, полученными от Биржи:

  • $result['retval'] - код ответа (если заявка успешно куплена, то он равен "0");
  • $result['retdesc'] - текстовое описание ошибки, если заявка НЕ куплена.

    На этом всё. Вы можете собрать все функции, приведенные в данной статье, в один файл и использовать его для работы с интерфейсами Биржи. Не забудьте только разобраться с wmsigner, выложить на сервере файлы kwm и WMID.ini, а также прописать в приведенных выше функциях параметры $MyWMID, $Path_Folder и $Path_Signer.
    группа: Материалы
    категории: Программинг |
    прочтений: 7877
    Если Вам понравилась статья, подпишитесь на оповещения:

    Комментарии (5)
    ООО 02.12.13 22:51 #
    Это все фигня полная! Обмен в одну сторону 0.8% и в другую 0.8% теряем = 1.6% потерей. Да и дельта минимальная в 10-20 коп скачет постоянно. Можно и в минус уйти. А что касается 1 млн, то такие деньги можно куда выгоднее использовать в реальном деле.
    makoli 13.12.13 10:19 #
    При 1 млн рублей комиссия будет составлять 1500 руб, что равно 0.15%, а это уже намного меньше чем 0.8%.
    lol 30.01.14 19:50 #
    Считать разучились ребята.

    1 млн/30 у.е*10коп/100-3000р=333р прибыли, которую скрадут скачки курса в течении дня. Тоже самое с любой суммой. Ликвидность тоже имеет предел. Если бы можно было на этом заработать что-то стоящее, вебмани бы сами это сделали.
    шапиль 28.02.14 01:21 #
    Посиотрим
    Serg-vi 08.11.16 21:02 #
    Почему везде всё на PHP ? Что на нём свет клином сошёлся?
    Напишите, пожалуйста, как реализовать это на Delphi

    введите этот код
    Мое имя:
    я не зарегистрирован и не хочу
    это моё зарегистрированное имя
    хочу зарегистрировать это имя
    Email:      
     оповещать об ответах
  •    Что нового почитать?
    Мой номер телефона утерян и не подлежит восстановлению. Как быть? 06.10.16 [3]
    ВОПРОС: Долго не пользовался своей симкой. Номер заблокирован, восстановлению не подлежит. Как востановить доступ к кошельку?
    Автомобилистам на заметку: как оплатить штраф по WM 04.10.16
    Сегодня мы хотим напомнить о возможностях, которые существуют в WebMoney для оплаты штрафов ГАИ и дорожных сборов. Если неприятность всё же произошла ...
    На WebMoney Merchant можно принимать Биткоины 30.09.16 [5]
    Если вы на вашем сайте принимаете WebMoney и делаете это через WebMoney Merchant, то для вас есть хорошая новость. Теперь с вами смогут рассчитаться т...
    Муравей-бот отвечает на вопросы о WebMoney в Telegram 27.09.16
    WebMoney запустил интеллектуального бота-помощника для мессенджера Telegram. Он постарается понять ваш вопрос и дать на него ответ.Для начала, разбере...
    Автоплатежи помогут не забыть об оплате 27.09.16
    В WebMoney Keeper, а также в личный кабинет Telepay добавлена опция автоплатежа для 3х крупнейших мобильных операторов России: Билайна, МТС и Мегафона...
    Новая библиотека для платформы .Net 14.09.16
    Разработчикам будет полезно узнать, что выпущена новая версия библиотеки для работы с XML-интерфейсами WebMoney для платформы Microsoft .Net.В ней реа...
    WebMoney пришла в Молдову 14.09.16 [1]
    WebMoney предоставила возможность работы с кошельком, номинированным в молдавских леях. Однако, кошелек этот не совсем обычный.Во-первых, кошелек созд...
    В обновленных Киперах появились регулярные платежи 04.08.16
    Обновилась вся линейка мобильных Киперов (iOS, Android, Windows Phone, MacOs X и BlackBerry OS 10), а также браузерный Keeper Standard.Главное новшест...

       Кофейня (форум)
    Вчера на форуме вебмани обосрал вебмани, седне лок 09.12.16
    Проблема с Кипером WinPro версии 3.9.9.8 01.12.16
    Работает ли корректно в данный момент Х19? 30.11.16

       p2p
    Меняют 26300 UAH на 1000 WMZ (курс:26.3) 09.12.16
    Меняют 200000 Qiwi на 200000 WMR (курс:1:1) 09.12.16
    Меняют 10000 Яндекс.Д на 10000 Qiwi (курс:1:1) 09.12.16

       WebMoney TOP
    Зарегистрирован Обмен24 Ввод/Вывод WebMoney, ЯД, QIWI на Privat24, СберБанк, АльфаБанк, ТКСБ и другие. Быстрая обработка зая...
    Зарегистрирован Green Cash Обменный пункт WebMoney в Москве. Ввод/вывод WebMoney на выгодных условиях. Работаем 7 дней в неделю...
    Зарегистрирован Bestchange.ee Ввод и вывод WM в Эстонии и Европе. Карты (чеки Paymer), высылаем на e-mail. Оплату принимаем на бан...

       WM-Клуб
    Присоединился Василий Галанов
    Присоединился Евгений Кудрявцев
    Присоединился Николай Бирюк


     
    Все права на материалы, опубликованные на owebmoney.ru, охраняются в соответствии с законом об авторском праве. Разрешено копирование без согласования при условии указания гиперссылки на сайт (без атрибута nofollow и сокрытий) непосредственно до\после материала.