Ошибка подписи Binance на размещение торгового ордера

Я пытаюсь торговать, используя binance api от 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 учетной записи у меня не возникает проблем с подписью. Он дает ожидаемый ответ


person Moin Shirazi    schedule 14.05.2018    source источник


Ответы (1)


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

Входы для информации об аккаунте:

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")));
        }
    }
person Yura G    schedule 30.08.2018