0

我的代码:

func testApi() {
        Alamofire.request("https://www.poloniex.com/tradingApi", withMethod: .post, parameters: ["command":"returnDepositAddresses","nonce":nonce()], encoding: .json, headers: ["Key":apiKey,"Sign":newSecret]).responseJSON() { (dataBack) in
            print(dataBack)
        }
    }
func nonce() -> Int {
        let date = "\(NSDate().timeIntervalSince1970)"
        let UnixInt = Double(date)!
        return Int(UnixInt)
    }

我明白了:

SUCCESS: {
error = "Invalid command.";}

我找不到任何关于使用 Swift 或 Objective C 的 poloniex api 的信息......所以如果有人可以提供帮助 - 我将非常感激

4

2 回答 2

2

这是一个如何形成NSURLRequestfor的示例poloniex.com

想象一下你的:

  1. API Key= @"apikey"
  2. Secret= @“秘密”
  3. nonce= @“1”

从最简单的事情开始:

NSMutableURLRequest *theURLRequest = [NSMutableURLRequest new];
theURLRequest.URL = [NSURL URLWithString:@"https://poloniex.com/tradingApi"];
theURLRequest.HTTPMethod = @"POST";

NSString *theBodyString = @"command=returnBalances&nonce=1";

theURLRequest.HTTPBody = [theBodyString dataUsingEncoding:NSUTF8StringEncoding];
[theURLRequest setValue:@"apikey" forHTTPHeaderField:@"Key"];

现在最难的一点...

对我而言,Poloniex 文档并不太清楚他们想要在"Sign"标头字段值下什么,但基本上他们希望您传递一个字符串,这应该是HMAC SHA512应用于两者的加密算法theBodyString Secret结果(在我们的示例中只是@“秘密”)。

这是返回给你的函数HMAC SHA512 NSData

#import <CommonCrypto/CommonHMAC.h>
NSData * getHMACSHA512FromSecretKeyStringAndBodyString(NSString *theSecretKeyString, NSString *theBodyString)
{
    const char *cSecret  = [theSecretKeyString cStringUsingEncoding:NSUTF8StringEncoding];
    const char *cBody = [theBodyString cStringUsingEncoding:NSUTF8StringEncoding];
    unsigned char cHMAC[CC_SHA512_DIGEST_LENGTH];
    CCHmac(kCCHmacAlgSHA512, cSecret, strlen(cSecret), cBody, strlen(cBody), cHMAC);
    return [[NSData alloc] initWithBytes:cHMAC length:sizeof(cHMAC)];
}

所以,运行:

NSData *theData = getHMACSHA512FromSecretKeyStringAndBodyString(@"secret", @"command=returnBalances&nonce=1");
NSString *theString = [NSString stringWithFormat:@"%@", theData];

会给我们几乎我们想要的东西。

我们的结果等于:

<c288f881 a6808d0e 78827ec6 ca9d6b9c 34ec1667 07716303 0d6d7abb 2b225456 31176f52 8347ab0f d6671ec5 3aec1f7d 3b6de8b8 e3ccc23d e62fd594 52d70db5>

虽然我们真正想要的(根据http://www.freeformatter.com/hmac-generator.html)是:

c288f881a6808d0e78827ec6ca9d6b9c34ec1667077163030d6d7abb2b22545631176f528347ab0fd6671ec53aec1f7d3b6de8b8e3ccc23de62fd59452d70db5

因此,基本上,只需从字符串中删除<,>符号;

theString = [theString stringByReplacingOccurrencesOfString:@"<" withString:@""];
theString = [theString stringByReplacingOccurrencesOfString:@">" withString:@""];
theString = [theString stringByReplacingOccurrencesOfString:@" " withString:@""];
[theURLRequest setValue:theString forHTTPHeaderField:@"Sign"];

theURLRequest现在已经准备好了,应该可以成功获得tradingApiof poloniex.com

于 2017-04-17T21:58:22.893 回答
0

实际上,这既不是 Swift 也不是 iOS 问题。这是因为您正在访问 Trading API 方法,它们可能需要在您的 POST 请求中添加一些额外的参数(nonce 除外):

检查这个:

所有对交易 API 的调用都通过 HTTP POST 发送到 https://poloniex.com/tradingApi,并且必须包含以下标头:

密钥 - 您的 API 密钥。签名 - 查询的 POST 数据由您的密钥的“秘密”根据 HMAC-SHA512 方法签名。此外,所有查询都必须包含“nonce”POST 参数。nonce 参数是一个整数,它必须始终大于先前使用的 nonce。

因此:

来自交易 API 的所有响应都是 JSON 格式。如果发生错误,响应将始终采用以下格式:

{“错误”:””}

https://temp.poloniex.com/support/api/

于 2016-09-05T05:26:42.963 回答