Привет народ! Пытаюсь подключится по апи к лайвоину, запросы без авторизации без проблем стандартными кубами, но с авторизацией лыжи не едут. Может сталкивался кто?
Задача:
есть переменные проекта: url запроса, apikey, skretkey.
Нужно отправить Гет запрос на переменную URL с только двумя заголовками:
Api-Key: калябаля из переменной
Sign: другойкалябаля из переменной
На сайте написано:
" Для авторизации надо привести Api ключ и электронную подпись данных, передаваемых в запросах. API ключ и подпись передаются как HTTP заголовки "Api-key" и "Sign".
Подпись формируется на основе HMAC-SHA256 алгоритма. В качестве ключа используется секретный ключ, выданный в момент генерации API ключа. Сгенерированная подпись должна быть переведена в шестнадцатеричный формат и верхний регистр.
Важно (!) Для построения строки подписи параметры должны быть соединены в алфавитном порядке их имен. В противном случае проверка электронной подписи не будет проходить."
Такая вот неведомая херня.
Есть пример на сайте, но в нем мне кажется много лишнего т.к. пример создает ваучер
C#
POST запрос
using System;
using System.Text;
using System.Web;
using System.Net;
using System.Security.Cryptography;
using System.IO;
namespace apice
{
class Program
{
private static string HashHMAC(string key, string message)
{
System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
byte[] keyByte = encoding.GetBytes(key);
HMACSHA256 hmacsha256 = new HMACSHA256(keyByte);
byte[] messageBytes = encoding.GetBytes(message);
byte[] hashmessage = hmacsha256.ComputeHash(messageBytes);
return ByteArrayToString(hashmessage);
}
public static string ByteArrayToString(byte[] ba)
{
StringBuilder hex = new StringBuilder(ba.Length * 2);
foreach (byte b in ba)
hex.AppendFormat("{0:x2}", b);
return hex.ToString();
}
public static string http_build_query(String formdata ){
string str = formdata.Replace("/", "%2F");
str = str.Replace("@", "%40");
str = str.Replace(";", "%3B");
return str;
}
static void Main(string[] args)
{
string ApiKey = "gJx7Wa7qXkPtmTAaK3ADCtr6m5rCYYMy";
string SecretKey = "8eLps29wsXszNyEhOl9w8dxsOsM2lTzg";
string param = http_build_query("currencyPair=BTC/USD&price=60&quantity=0.01");
string Sign = HashHMAC(SecretKey, param).ToUpper();
string uri = "
https://api.livecoin.net/exchange/buylimit";
string ResponseFromServer = "";
HttpStatusCode StatusCode;
byte[] bytes = Encoding.UTF8.GetBytes(param);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = bytes.Length;
request.Headers["Api-Key"] = ApiKey;
request.Headers["Sign"] = Sign;
Stream dataStream = request.GetRequestStream();
dataStream.Write(bytes, 0, bytes.Length);
try{
WebResponse WebResponse = request.GetResponse();
dataStream = WebResponse.GetResponseStream();
StreamReader StreamReader = new StreamReader(dataStream);
ResponseFromServer = StreamReader.ReadToEnd();
dataStream.Close();
WebResponse.Close();
StatusCode = HttpStatusCode.OK;
}
catch (WebException ex)
{
if (ex.Response != null) {
dataStream =ex.Response.GetResponseStream();
StreamReader StreamReader = new StreamReader(dataStream);
StatusCode = ((HttpWebResponse)ex.Response).StatusCode ;
ResponseFromServer = ex.Message;
}else{
StatusCode = HttpStatusCode.ExpectationFailed;
ResponseFromServer = "Неизвестная ошибка";
}
}
catch (Exception ex){
StatusCode = HttpStatusCode.ExpectationFailed;
ResponseFromServer = "Неизвестная ошибка";
}
Console.WriteLine("Response Code: " + StatusCode);
Console.WriteLine("Response String: " + ResponseFromServer);
}
}
}
GET запрос
using System;
using System.Text;
using System.Web;
using System.Net;
using System.Security.Cryptography;
using System.IO;
namespace apice
{
class Program
{
static void Main(string[] args)
{
string param = "currencyPair=BTC/USD";
string uri = "
https://api.livecoin.net/exchange/ticker?";
string ResponseFromServer = "";
HttpStatusCode StatusCode;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri + param);
request.Method = "GET";
request.ContentType = "application/x-www-form-urlencoded";
Stream dataStream;
try
{
WebResponse WebResponse = request.GetResponse();
dataStream = WebResponse.GetResponseStream();
StreamReader StreamReader = new StreamReader(dataStream);
ResponseFromServer = StreamReader.ReadToEnd();
dataStream.Close();
WebResponse.Close();
StatusCode = HttpStatusCode.OK;
}
catch (WebException ex)
{
if (ex.Response != null)
{
dataStream = ex.Response.GetResponseStream();
StreamReader StreamReader = new StreamReader(dataStream);
StatusCode = ((HttpWebResponse)ex.Response).StatusCode;
ResponseFromServer = ex.Message;
}
else
{
StatusCode = HttpStatusCode.ExpectationFailed;
ResponseFromServer = "Неизвестная ошибка";
}
}
catch (Exception ex)
{
StatusCode = HttpStatusCode.ExpectationFailed;
ResponseFromServer = "Неизвестная ошибка";
}
Console.WriteLine("Response Code: " + StatusCode);
Console.WriteLine("Response String: " + ResponseFromServer);
}
}
}
Вообщем надо или адаптировать этот C# к зенке, либо просто сделать правильный запрос.