I am getting a signature not valid error while connecting to Binance API endpoints that require authentication. There is a similar query in following link however it is specific to Binance, I guess and this question is specific to Binance US. I tried to use the methods in below link though and it didn't work.
Following is the Python code
import urllib.parse
import hashlib
import hmac
import base64
import requests
api_url = "https://api.binance.us"
# get binanceus signature
def get_binanceus_signature(data, secret):
postdata = urllib.parse.urlencode(data)
message = postdata.encode()
byte_key = bytes(secret, 'UTF-8')
mac = hmac.new(byte_key, message, hashlib.sha256).hexdigest()
return mac
# Attaches auth headers and returns results of a POST request
def binanceus_request(uri_path, data, api_key, api_sec):
headers = {}
headers['X-MBX-APIKEY'] = api_key
signature = get_binanceus_signature(data, api_sec)
params={**data, "signature": signature}
req = requests.get((api_url + uri_path), params=params, headers=headers)
return req.text
api_key = "vmPUZE6mv9SD5VNHk4HlWFsOr6aKE2zvsw0MuIgwCIPy6utIco14y7Ju91duEh8A"
secret_key = "NhqPtmdSJYdKjVHjA7PZj4Mge3R5YNiP1e3UZjInClVN65XAbvqqM6A7H5fATj0j"
uri_path = "/api/v3/openOrders"
data = {
"symbol": "BTCUSDT",
"timestamp": 1499827319559
}
get_open_order_result = binanceus_request(uri_path, data, api_key, secret_key)
Here is the full dart code.
class BinanceUSRestClient {
final String timestamp = DateTime.now().millisecondsSinceEpoch.toString();
Future<http.Response> getResponse({
required String secret,
required String apiKey,
required String path,
Map<String, dynamic>? queryParams,
}) async {
//Header
Map<String, String> headers = {};
headers['X-MBX-APIKEY'] = apiKey;
//Params
Map<String, dynamic> params = {};
if (queryParams != null) {
params.addAll(queryParams);
}
params['signature'] = createSignature(secret, queryParams);
params['timestamp'] = timestamp;
final Uri uri = Uri.https('api.binance.us', path, params);
http.Response response = await http.get(
uri,
headers: headers,
);
return response;
}
String createSignature(String secret, Map<String, dynamic>? data) {
final String jsonString = jsonEncode(data);
final List<int> message = utf8.encode(jsonString);
final List<int> key = utf8.encode(secret);
final List<int> mac = Hmac(sha256, key).convert(message).bytes;
final String signature = hex.encode(mac);
return signature;
}
}
If it helps, here is the API documentation. Could someone help me in resolving the error?