Alcon Divino
Alcon Divino

Reputation: 13

https post failure c++

I try to access the https://api.binance.com/wapi/v3/withdraw.html Endpoint of the Binance API

I need to send it as post order with my API key in a header and the parameters in the request body.

My code is Written in c++ and i am using libcurl.

The hmac_sha256() function is also working.

I have this code:

bool BinanceAPI::make_Withdrawal(string api_key , string secret_key ,string asset , string address , double amount , string &id ){

    cout << "BINANCE: MAKE WITHDRAWAL"<<endl;

    ArbUtils au;
    Json::Value result;
    CURL * hand;

    bool ret = false;

    hand = curl_easy_init();

    string url = "https://api.binance.com/wapi/v3/withdraw.html";

    string post_data("asset=");
    post_data.append( asset);

    post_data.append("&address=");
    post_data.append(address);

    post_data.append( "&amount" );
    post_data.append( to_string(amount) );

    post_data.append( "&timestamp=" );
    post_data.append( to_string(au.get_msTime() ) );

    string signature = hmac_sha256( secret_key.c_str() , post_data.c_str());

    post_data.append( "&signature=" );
    post_data.append( signature );

    vector<string>extra_http_header;
    string header_chunk("X-MBX-APIKEY: ");
    header_chunk.append( api_key );
    extra_http_header.push_back( header_chunk );

    string str_result;

    curl_easy_setopt(hand , CURLOPT_URL , url.c_str() );
    curl_easy_setopt(hand , CURLOPT_WRITEFUNCTION , BinanceAPI::callback);
    curl_easy_setopt(hand , CURLOPT_WRITEDATA , &str_result );
    curl_easy_setopt(hand , CURLOPT_SSL_VERIFYPEER , false);
    curl_easy_setopt(hand , CURLOPT_ACCEPT_ENCODING , "gzip" );
    curl_easy_setopt(hand , CURLOPT_POST , 1);

    struct curl_slist *chunk = NULL;
    for(int i= 0 ; i < extra_http_header.size() ; i++){

        chunk = curl_slist_append(chunk , extra_http_header[i].c_str() );
    }
    curl_easy_setopt(hand , CURLOPT_HTTPHEADER , chunk);
    curl_easy_setopt(hand , CURLOPT_POSTFIELDS , post_data.c_str() );

    CURLcode res;

    res = curl_easy_perform(hand);

    curl_easy_cleanup(hand);
}

Well i now get the a errormessage from the server :

code: -1105 msg: "parameter 'payload' was empty"

I tried and asked the support but they don't know the answer neither. I don't know why that is the case tho. I have other endpoints accessed by the same structure which also need that exact same form and they work.

Any idea why this could be happening?

Upvotes: 0

Views: 567

Answers (1)

Ozichukwu
Ozichukwu

Reputation: 414

I've been facing the same problem for some days now. Just got it fixed. My code is in python tho. Hope you can reference it.

import time, hmac, hashlib, urllib, json, requests

key = "my key"
secret_key = "my sk"
asset = "BTC"
addr = "abcdef" #btc address
amount = 1
timestamp = int(time.time() * 1000) #timestamp in ms

#the request parameters
request_body = {"asset": asset, "address": addr, \
                "amount": amount, "timestamp": timestamp}

#sign the request parameters with the secret key
#urllib.parse.urlencode(request_body) convert request body to a query string format

signature = hmac.new(bytes(secret_key, "utf-8"), \
                     bytes(urllib.parse.urlencode(request_body), "utf-8"), \
                     hashlib.sha256).digest().hex()

#add the signature to the request parameters
request_body["signature"] = signature

header = {"X-MBX-APIKEY": key, \
          "Content-Type": "application/x-www-form-urlencoded"}

#append the query string to the url
url = "https://api.binance.com/wapi/v3/withdraw.html?" +\
       urllib.parse.urlencode(request_body)

response = requests.post(url, headers=header) #send post request
print(response.json())

The problem is from the poor documentation. The endpoint requires a post request but it fails if the request body is sent alone and works if the query string is sent rather. Hope it helps.

Upvotes: 2

Related Questions