我在连接到需要身份验证的Binance API端点时收到签名无效错误。在下面的链接中有一个类似的查询,但它是特定于Binance的,我猜这个问题是特定于Binance US的。我试图使用下面链接中的方法,但它不起作用。
Flutter binance api signature
下面是Python代码
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)
这里是完整的dart代码。
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;
}
}
如果有帮助,这里是API文档。有人能帮助我解决这个错误吗?
2条答案
按热度按时间mo49yndu1#
最后!!花了几个小时后,shammy 12的帖子帮助我找出了问题所在。这段时间我一直在尝试基于json格式的参数创建签名。尽管Binance US文档明确指出,
totalParams
定义为query string
与request body
级联这在我引用的大多数响应中都被忽略了。甚至
recvWindow
参数也与无效签名错误无关。我调试这个问题所用的全部时间就是找到一种方法将查询格式化为,并且,这是通过使用以下来实现的:
这里是完整的调试代码。如果有任何问题请随时告诉我。我已经重命名了一些变量,以提高可读性,避免一些可能的混乱。
oewdyzsn2#
另一种方式在 dart (Flutter)我如何让它工作使用crypto:^3.0.2和http:^0.13.5包
二进制的API类