币安 API 下单
Binance API place order
如何下单期货?我收到两个错误:“未发送所需的时间戳参数、为空/空或格式不正确。”或“此请求的签名无效。”
public static async void Order()
{
string base_uri = "https://fapi.binance.com/fapi/v1/order?";
string API_Key = "bSQQlu2k5tf0oSUGZsNGptisIxXLux8wb............................";
string Secret_Key = "gWPKP66geFL0ryijnlU3TTepS61.............................";
string symbol = "XRPUSDT";
string side = "BUY";
string type = "MARKET";
string timeInForce = "GTC";
decimal quantity = 20;
long recvWindow = 5000;
long timestamp = GetServerTime();
string queryString = "symbol=" + symbol + "&side=" + side + "type=" + type + "&timeInForce=" + timeInForce;
string signature = HMACHASH(queryString, Secret_Key);
var Payload = new Credentials
{
Quantity = quantity,
RecvWindow = recvWindow,
Timestamp = timestamp,
Signature = signature
};
var stringPayload = JsonConvert.SerializeObject(Payload);
var httpContent = new StringContent(stringPayload, Encoding.UTF8, "application/json");
httpContent.Headers.Add("X-MBX-APIKEY", API_Key);
using (var httpClient = new HttpClient())
{
var httpResponse = await httpClient.PostAsync(base_uri + queryString, httpContent);
if (httpResponse.Content != null)
{
var responseContent = await httpResponse.Content.ReadAsStringAsync();
Console.WriteLine(responseContent);
}
}
}
这就是我获取时间戳的方式
public static long GetServerTime()
{
string str = BinanceResponse("https://fapi.binance.com/fapi/v1/time");
string[] arr = str.Split('\"');
str = arr[2].Trim(':', '}');
return long.Parse(str);
}
凭据class
internal class Credentials
{
[JsonProperty("quantity")]
public decimal Quantity { get; set; }
[JsonProperty("recvWindow")]
public long RecvWindow { get; set; }
[JsonProperty("timestamp")]
public long Timestamp { get; set; }
[JsonProperty("signature")]
public string Signature { get; set; }
}
连载后
stringPayload = "{"quantity":20.0,"recvWindow":5000,"timestamp":1625061703897,"signature":"2794e66d4e5b5b6338782e058747a567db523.........................."}"
如果我这样尝试:
string queryString = "symbol=" + symbol + "&side=" + side + "&type=" + type +
"&timeInForce=" + timeInForce + "&quantity=" + quantity + "&recvWindow=" +
recvWindow + "×tamp=" + timestamp;
string signature = HMACHASH(queryString, Secret_Key);
queryString += "&signature=" + signature;
错误:“此请求的签名无效。”
已解决!
感谢你们!我使用了 Fiddler,发现类型 =“MARKET”不需要“timeInForce”参数。所有的问题都是因为他。
string queryString = "symbol=" + symbol + "&side=" + side + "&type=" + type +
̶"̶&̶t̶i̶m̶e̶I̶n̶F̶o̶r̶c̶e̶=̶"̶ ̶+̶ ̶t̶i̶m̶e̶I̶n̶F̶o̶r̶c̶e̶ + "&quantity=" + quantity + "&recvWindow=" +
recvWindow + "×tamp=" + timestamp;
响应在错误报告中。 Binance API 要求您发送时间戳。
所以您可能没有发送正确的时间戳或没有正确命名它。
您可以使用像 Fiddler 这样的 http 嗅探器检查您的请求。
可能 API 区分大小写,因此序列化后时间戳不应为“Timestamp”。检查一下
编辑:您能否提供用于创建请求的文档?因为官方 binance API 只要求 POST 参数
我强烈推荐 GitHub 上的 Binance Postman 集合,以了解如何构建您的请求:
Binance Postman Collection
在此之后,我还推荐在此处找到的币安签名示例:Binance Signature Examples
似乎正在生成您的签名但没有包括请求的所有参数。
Binance 支持在正文或 URL 中为 post 请求设置参数。就我个人而言,我只使用了 URL 中的所有内容,但签名必须验证所有参数,而您的 queryString 变量正在转换为签名,但其他数据随后在有效负载中发送,而不是包含在签名中。
如何下单期货?我收到两个错误:“未发送所需的时间戳参数、为空/空或格式不正确。”或“此请求的签名无效。”
public static async void Order()
{
string base_uri = "https://fapi.binance.com/fapi/v1/order?";
string API_Key = "bSQQlu2k5tf0oSUGZsNGptisIxXLux8wb............................";
string Secret_Key = "gWPKP66geFL0ryijnlU3TTepS61.............................";
string symbol = "XRPUSDT";
string side = "BUY";
string type = "MARKET";
string timeInForce = "GTC";
decimal quantity = 20;
long recvWindow = 5000;
long timestamp = GetServerTime();
string queryString = "symbol=" + symbol + "&side=" + side + "type=" + type + "&timeInForce=" + timeInForce;
string signature = HMACHASH(queryString, Secret_Key);
var Payload = new Credentials
{
Quantity = quantity,
RecvWindow = recvWindow,
Timestamp = timestamp,
Signature = signature
};
var stringPayload = JsonConvert.SerializeObject(Payload);
var httpContent = new StringContent(stringPayload, Encoding.UTF8, "application/json");
httpContent.Headers.Add("X-MBX-APIKEY", API_Key);
using (var httpClient = new HttpClient())
{
var httpResponse = await httpClient.PostAsync(base_uri + queryString, httpContent);
if (httpResponse.Content != null)
{
var responseContent = await httpResponse.Content.ReadAsStringAsync();
Console.WriteLine(responseContent);
}
}
}
这就是我获取时间戳的方式
public static long GetServerTime()
{
string str = BinanceResponse("https://fapi.binance.com/fapi/v1/time");
string[] arr = str.Split('\"');
str = arr[2].Trim(':', '}');
return long.Parse(str);
}
凭据class
internal class Credentials
{
[JsonProperty("quantity")]
public decimal Quantity { get; set; }
[JsonProperty("recvWindow")]
public long RecvWindow { get; set; }
[JsonProperty("timestamp")]
public long Timestamp { get; set; }
[JsonProperty("signature")]
public string Signature { get; set; }
}
连载后
stringPayload = "{"quantity":20.0,"recvWindow":5000,"timestamp":1625061703897,"signature":"2794e66d4e5b5b6338782e058747a567db523.........................."}"
如果我这样尝试:
string queryString = "symbol=" + symbol + "&side=" + side + "&type=" + type +
"&timeInForce=" + timeInForce + "&quantity=" + quantity + "&recvWindow=" +
recvWindow + "×tamp=" + timestamp;
string signature = HMACHASH(queryString, Secret_Key);
queryString += "&signature=" + signature;
错误:“此请求的签名无效。”
已解决! 感谢你们!我使用了 Fiddler,发现类型 =“MARKET”不需要“timeInForce”参数。所有的问题都是因为他。
string queryString = "symbol=" + symbol + "&side=" + side + "&type=" + type +
̶"̶&̶t̶i̶m̶e̶I̶n̶F̶o̶r̶c̶e̶=̶"̶ ̶+̶ ̶t̶i̶m̶e̶I̶n̶F̶o̶r̶c̶e̶ + "&quantity=" + quantity + "&recvWindow=" +
recvWindow + "×tamp=" + timestamp;
响应在错误报告中。 Binance API 要求您发送时间戳。
所以您可能没有发送正确的时间戳或没有正确命名它。
您可以使用像 Fiddler 这样的 http 嗅探器检查您的请求。
可能 API 区分大小写,因此序列化后时间戳不应为“Timestamp”。检查一下
编辑:您能否提供用于创建请求的文档?因为官方 binance API 只要求 POST 参数
我强烈推荐 GitHub 上的 Binance Postman 集合,以了解如何构建您的请求: Binance Postman Collection
在此之后,我还推荐在此处找到的币安签名示例:Binance Signature Examples
似乎正在生成您的签名但没有包括请求的所有参数。
Binance 支持在正文或 URL 中为 post 请求设置参数。就我个人而言,我只使用了 URL 中的所有内容,但签名必须验证所有参数,而您的 queryString 变量正在转换为签名,但其他数据随后在有效负载中发送,而不是包含在签名中。