о 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.
    группа: Материалы
    категории: Программинг |
    прочтений: 8347
    Если Вам понравилась статья, подпишитесь на оповещения:

    Комментарии (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 [4]
    ВОПРОС: Долго не пользовался своей симкой. Номер заблокирован, восстановлению не подлежит. Как востановить доступ к кошельку?
    Автомобилистам на заметку: как оплатить штраф по 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 [4]
    WebMoney предоставила возможность работы с кошельком, номинированным в молдавских леях. Однако, кошелек этот не совсем обычный.Во-первых, кошелек созд...
    В обновленных Киперах появились регулярные платежи 04.08.16
    Обновилась вся линейка мобильных Киперов (iOS, Android, Windows Phone, MacOs X и BlackBerry OS 10), а также браузерный Keeper Standard.Главное новшест...

       Кофейня (форум)
    Где купить Paymer чеки за КИВИ? 16.04.17
    Автоматизация masspayment 22.03.17
    Продам премиум домен для кредитного сайта 21.02.17

       p2p
    Меняют 1000 WMZ на 26170 UAH (курс:26.17) 26.04.17
    Меняют 18270 UAH на 700 WMZ (курс:26.1) 26.04.17
    Меняют 10000 UAH на 22300 Qiwi (курс:2.23) 26.04.17

       WebMoney TOP
    Зарегистрирован PVcash Наш On-line сервис предназначен для тех, кто хочет быстро, безопасно и по выгодному курсу обменять т...
    Зарегистрирован ЧANGE.ME Выгодный обмен PayPal, WebMoney, Яндекс.Денег, QIWI и других валют....
    Зарегистрирован Changedanger.com Сервис денежных обменов Changedanger.com Почему именно мы? Хороший вопрос, на который имеется очень ...

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


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