Post Trade Order Ошибка подписи Binance - PullRequest
0 голосов
/ 14 мая 2018

Я пытаюсь совершить торговлю, используя api binance от ios.

Всегда выдает ошибку ["code": -1022, "msg": подпись для этого запроса недействительна.]

Код:

public override func requestFor(api: APIType) -> NSMutableURLRequest {
    let mutableURLRequest = api.mutableRequest
    if let key = key, let secret = secret, api.authenticated {
        var postData = api.postData 
        //postData["symbol"] = "BNBBTC"
        //postData["timestamp"] = "\(Int(Date().timeIntervalSince1970 * 1000))"
        postData["symbol"] = "BNBBTC"
        postData["side"] = "SELL"
        postData["type"] = "MARKET"
        postData["recvWindow"] = "5000"
        postData["quantity"] = "0.1"
        postData["timestamp"] = "\(Int(Date().timeIntervalSince1970 * 1000))"
        if let hmac_sha = try? HMAC(key: secret, variant: .sha256).authenticate(Array(postData.queryString.utf8)) {
            let signature = Data(bytes: hmac_sha).toHexString()
            postData["signature"] = signature
        }
        var postDataString = ""
        if let data = postData.data, let string = data.string, postData.count > 0 {
            postDataString = string
            if case .GET = api.httpMethod {
                mutableURLRequest.httpBody = data
            } else if case .POST = api.httpMethod {
                var urlString = mutableURLRequest.url?.absoluteString
                urlString?.append("?")
                urlString?.append(postData.queryString)
                let url = URL(string: urlString!)
                mutableURLRequest.url = url
            }
            api.print("Request Data: \(postDataString)", content: .response)
        }
        mutableURLRequest.setValue(key, forHTTPHeaderField: "X-MBX-APIKEY")
    }
    return mutableURLRequest
}

Редактировать: При использовании API учетной записи у меня не возникает проблем с подписью.Это дает ответ, как и ожидалось

1 Ответ

0 голосов
/ 30 августа 2018

У меня была такая же ... проблема, и я нашел ответ.Когда вы генерируете подпись, входные данные для заказа на тестирование и информации об учетной записи различаются.

Входные данные для информации об учетной записи:

string input = "timestamp=1535623795177"; string apiSecret = "YOUR API SECRET"

Входные данные для порядка предельных значений теста:

string input = "symbol=ETHBTC&side=BUY&recvWindow=6500&type=LIMIT&timeInForce=GTC&quantity=100&price=0.1&timestamp=1535623795177"; string apiSecret = "YOUR API SECRET"

и рабочий пример создания подписи (C #):

private string GenerateSignature(string input, string apiSecret)
    {
        var encoding = new UTF8Encoding();
        byte[] keyByte = encoding.GetBytes(apiSecret);
        byte[] messageBytes = encoding.GetBytes(input);

        using (var hmacsha256 = new HMACSHA256(keyByte))
        {
            byte[] hashMessage = hmacsha256.ComputeHash(messageBytes);
            return String.Concat(hashMessage.Select(b => b.ToString("x2")));
        }
    }
...