我一直在这方面工作了一段时间,我只是无法从服务器获得成功的响应。 这一切文档可在Bittrex Exchange Wesite德尔福HMAC SHA512签名调用Bittrex交易所
找到签名位的主要症结可以在标题认证
我一直在使用可以在 Fundamentals在SourceForge上找到散列文件中找到。它是底部被称为基础散列的那个4.00.15
我一直在使用这个文件的原因很简单,它似乎是唯一给我一个正确答案的。或者我应该说,它给了我正确的答案,与此Hashing Website给我的结果相比。
我试过使用Indy组件来生成正确的散列,但它似乎从未匹配网站的值。也许我没有正确地使用它或正确的库或其他东西,但我将为我创建的示例添加该示例。当我写这个,我再次测试,它看起来像我得到正确的答案,去图,也许我正在使用一个更好的OpenSSL库。无论如何,我也将我的INDY示例下面作为好)。
function Test: String;
const
FAPIKey = 'APIKEY';
FAPISecret = 'APISECRET';
FURL = 'https://bittrex.com/api/v1.1/account/getbalances?apikey=%s&nonce=%d';
var
FPost, FSignature: String;
FNonce: Integer;
Response: TStringStream;
HTTP: TIdHTTP;
SSL:TIdSSLIOHandlerSocketOpenSSL;
begin
Result := '';
FNonce := DateTimeToUnix(Now);
FPost := Format(FURL, [FAPIKey, FNonce]);
HTTP := TIdHTTP.Create;
try
SSL := TIdSSLIOHandlerSocketOpenSSL.Create(HTTP);
try
HTTP.IOHandler := SSL;
FSignature := SHA512DigestToHex(CalcHMAC_SHA512(FAPISecret, FPost));
HTTP.Request.CustomHeaders.AddValue('apisign', FSignature);
Response := TStringStream.Create;
try
HTTP.Get(FPost, Response);
Result := Response.DataString;
finally
Response := nil;
end;
finally
SSL := nil;
end;
finally
HTTP := nil;
end;
end;
此前使用这个版本,我永远只能得到 散列 '{ “成功”:假的, “消息”: “APISIGN_NOT_PROVIDED”, “结果”:空}' 我终于移动了,当我制定了自定义HTTP头,现在变得 '{“success”:false,“message”:“INVALID_SIGNATURE”,“result”:null}' 它可能是一个简单的无效nonce,还是那个太旧了? 一切看起来不错,或者我缺少INDY组件的一些基本组件设置?
function Test: String;
const
FAPIKey = 'APIKEY';
FAPISecret = 'APISECRET';
FURL = 'https://bittrex.com/api/v1.1/account/getbalances?apikey=%s&nonce=%d';
var
FPost, FSignature: String;
FNonce: Integer;
Response: TStringStream;
HTTP: TIdHTTP;
SSL:TIdSSLIOHandlerSocketOpenSSL;
FSHA512Hasher: TIdHMACSHA512;
begin
Result := '';
if not LoadOpenSSLLibrary then exit;
FNonce := DateTimeToUnix(Now);
FPost := Format(FURL, [FAPIKey, FNonce]);
HTTP := TIdHTTP.Create;
try
SSL := TIdSSLIOHandlerSocketOpenSSL.Create(HTTP);
try
HTTP.IOHandler := SSL;
FSHA512Hasher := TIdHMACSHA512.Create;
try
FSHA512Hasher.Key := ToBytes(FAPISecret);
FSignature := Lowercase(ToHex(FSHA512Hasher.HashValue(ToBytes(FPost))));
finally
FSHA512Hasher := nil;
end;
HTTP.Request.CustomHeaders.AddValue('apisign', FSignature);
Response := TStringStream.Create;
try
HTTP.Get(FPost, Response);
Result := Response.DataString;
finally
Response := nil;
end;
finally
SSL := nil;
end;
finally
HTTP := nil;
end;
end;
你在考虑Unicode吗?Ansi字符串的散列与Unicode字符串的字符值> 127不同。 – 2014-10-09 17:29:45
只是一个旁注,有很多,如果':=零;'我期望一个'免费'。 – bummi 2014-10-09 19:33:07
我同意bummi,我懒惰,没有真正专注于内存泄漏atm – mikelittlewood 2014-10-09 21:55:41