Bitcoin Forum

Local => Кодеры => Topic started by: gerzikon on September 24, 2015, 01:22:29 PM



Title: API для биржи bitfinex.com (PHP)
Post by: gerzikon on September 24, 2015, 01:22:29 PM
Пытаюсь создать PHP-скрипт для API биржи https://www.bitfinex.com
Прошу помочь тем кто знаком с API этой биржи.
На сайте биржи есть документация https://www.bitfinex.com/pages/api (с пояснениями, но без примеров целого скрипта, как на других биржах). Делаю все вроде по этим инструкциям, но получаю ошибку. Я создал на бирже ключи, написал скрипт, но получаю такую ошибку:
Code:
{"message":"Invalid json."}
Вот сам скрипт
Quote
<?php
$key = ""; // Ключ
$secret = ""; // Секретный ключ

// Формирование массива с данными
$arr = array();
$arr["request"] = "/v1/account_infos";
$arr["nonce"] = time()."";

// Кодирование данных в JSON-формат
$payload = json_encode($arr);
$payload = str_replace("\/", "/", $payload);

// Хеширование
$signature = hash_hmac("sha384", $payload, $secret);

// Формирование массива c заголоавками headers
$headers = array();
$headers[0] = "X-BFX-APIKEY: $key";
$headers[1] = "X-BFX-PAYLOAD: $payload";
$headers[2] = "X-BFX-SIGNATURE: $signature";

// Запрос
$ch = curl_init("https://api.bitfinex.com/v1/account_infos");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$resultat = curl_exec($ch);

// Вывод результата
echo $resultat;
?>
В документации на сайте сказано что, к примеру, для создания нового ордера нужно делать запрос на адрес https://api.bitfinex.com/v1/order/new и формировать json такого типа
Code:
{
 "request": "/v1/order/new",
 "nonce": "1234",
 "option1": ...
}
Я для начала, чтобы не ошибиться с параметрами ("option1": ... и т. д.) взял такой запрос где параметры не нужны - это информационный запрос на адрес https://api.bitfinex.com/v1/account_infos
По аналогии с приведенным выше примером, json должен быть таким
Code:
{
 "request": "/v1/account_infos",
 "nonce": "1234"
}
В скрипте выше он такой и есть, с учетом того что параметр "nonce" при каждом запросе увеличивается, но ответ приходит
Code:
{"message":"Invalid json."}
В коде выше я, разумеется, удалил свои ключи.
Как модифицировать этот скрипт чтобы в него можно было в самом начале добавить свои ключи и в результате получался правильный api-запрос на https://api.bitfinex.com/v1/account_infos
Или может быть у кого-то есть другой готовый скрипт, в котором можно было бы только добавить свои ключи и сделать какой-либо корректный запрос через API на биржу bitfinex.com?


Title: Re: API для биржи bitfinex.com (PHP)
Post by: cryptodev on September 24, 2015, 01:54:44 PM
Вот это уберите:

$payload = str_replace("\/", "/", $payload);

...и инвалиды отстанут.


Title: Re: API для биржи bitfinex.com (PHP)
Post by: gerzikon on September 24, 2015, 02:04:44 PM
Без разницы. Да и зачем убирать, если убрать то json-данные будут
Code:
{
 "request": "\/v1\/account_infos",
 "nonce": "1234"
}
если не убирать, то будет аналогично как в примере на https://www.bitfinex.com/pages/api
Code:
{
 "request": "/v1/account_infos",
 "nonce": "1234"
}


Title: Re: API для биржи bitfinex.com (PHP)
Post by: cryptodev on September 24, 2015, 02:20:25 PM
Без разницы. Да и зачем убирать, если убрать то json-данные будут
Code:
{
 "request": "\/v1\/account_infos",
 "nonce": "1234"
}
если не убирать, то будет аналогично как в примере на https://www.bitfinex.com/pages/api
Code:
{
 "request": "/v1/account_infos",
 "nonce": "1234"
}

А все ж уберите. Ваш вариант тоже вполне валидный JSON, но при обработке может неправильно раскодироваться.

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

В описании они намекают на то, что JSON ожидается в payload POST-запроса (т.е. нужно сделать что-нибудь вроде:
Code:
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);

А что касается X-BFX-PAYLOAD хедера, то это у них для аутентификации, и в этом поле ожидается то, что вы подготовили (payload), еще и свернутое base64:

payload = parameters-dictionary -> JSON encode -> base64
signature = HMAC-SHA384(payload, api-secret) as hexadecimal
send (api-key, payload, signature)


И для основы подписи для X-BFX-SIGNATURE тоже ожидается payload в base64.


Title: Re: API для биржи bitfinex.com (PHP)
Post by: gerzikon on September 24, 2015, 05:01:07 PM
Спасибо, разобрался. Строчка с "str_replace" ни на что не влияет - работает и с ней и без нее. POST-данные никакие не отправлял, только добавил одну строчку
Code:
$payload = base64_encode($payload);
и все заработало


Title: Re: API для биржи bitfinex.com (PHP)
Post by: Deres on September 24, 2015, 08:55:53 PM
Все решили а я зря топик читал(


Title: Re: API для биржи bitfinex.com (PHP)
Post by: gerzikon on September 25, 2015, 04:04:38 AM
Все решили а я зря топик читал(
Для вас тоже занятие найдется)
То что в этой теме решили, но появилась другая проблема. Поскольку она уж очень специфическая (только для тех кто сам пользуется API этой биржи), я ее описал в этом сообщении в топике биржи Bitfinex (https://bitcointalk.org/index.php?topic=1143666.msg12513864#msg12513864)


Title: Re: API для биржи bitfinex.com (PHP)
Post by: hazarun on September 25, 2015, 07:51:03 PM
Все решили а я зря топик читал(
Для вас тоже занятие найдется)
То что в этой теме решили, но появилась другая проблема. Поскольку она уж очень специфическая (только для тех кто сам пользуется API этой биржи), я ее описал в этом сообщении в топике биржи Bitfinex (https://bitcointalk.org/index.php?topic=1143666.msg12513864#msg12513864)

Заметим, что проблема - еще более специфическа, чем Вы отметили.
Еще нужно, не просто пользоваться АПИ этой биржи, а разбираться именно в АПИ + ПХП.  ))