You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Ring语言调用Binance API报API-key格式无效错误的排查求助

解决Binance API调用中的API-key format invalid错误

我来帮你排查这个问题!你遇到的{"code":-2014,"msg":"API-key format invalid."}错误,核心是两个关键配置错误导致的,下面逐一说明并给出修正方案:

1. 请求头的API Key传递方式错误

你的原curl命令是通过**自定义请求头X-MBX-APIKEY**直接传递API密钥的,但在Ring代码里,你错误地把它放到了authorization头里,这完全不符合Binance API的要求。

错误代码片段:

mylist = curl_slist_append(mylist,'authorization: X-MBX-APIKEY: ' + my_api_key )

修正后:

mylist = curl_slist_append(mylist,'X-MBX-APIKEY: ' + my_api_key )

2. Content-Type设置错误

Binance的/api/v3/order接口接收的是表单格式数据(application/x-www-form-urlencoded,但你设置了application/json,这会导致服务器无法正确解析请求参数,甚至间接干扰API密钥的验证流程。

错误代码片段:

mylist = curl_slist_append(mylist,'content-type: application/json')

修正后:

mylist = curl_slist_append(mylist,'content-type: application/x-www-form-urlencoded')

额外建议

  • 不要硬编码timestamp和signature:你当前使用的是示例中的固定时间戳和签名,实际运行时这些值会很快过期失效。需要动态生成当前的Unix时间戳(毫秒级),然后用你的API Secret对请求参数进行HMAC-SHA256签名。
  • 清理不必要的请求头accept-encodingconnection: close等头信息libcurl默认会处理,不需要手动设置,可酌情移除以简化代码。

完整修正后的Ring代码

Load "libcurl.ring"
Load "guilib.ring"
load "stdlib.ring"

my_api_key = "---API KEY HERE ---"
# 注意:实际使用时请替换为动态生成的timestamp和signature
my_part = "symbol=LTCBTC&side=BUY&type=LIMIT&timeInForce=GTC&quantity=1&price=0.1&recvWindow=5000&timestamp=1499827319559&signature=c8db56825ae71d6d79447849e617115f4a920fa2acdcab2b053c4b2838bd6b71"
my_URL= "https://api.binance.com/api/v3/order"
userAgent = "Mozilla/5.0 (Windows NT 5.1; rv:31.0) Gecko/20100101 Firefox/31.0"

curl = curl_easy_init()
curl_easy_setopt(curl, CURLOPT_POST, 1)
curl_easy_setopt(curl, CURLOPT_USERAGENT, userAgent)
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE)
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 2)

# 修正后的请求头
mylist = curl_slist_append(null,'X-MBX-APIKEY: ' + my_api_key )
mylist = curl_slist_append(mylist,'content-type: application/x-www-form-urlencoded')

curl_easy_setopt(curl, CURLOPT_HTTPHEADER, mylist)
curl_easy_setopt(curl, CURLOPT_URL, my_URL)
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, my_part )

cOutput = curl_easy_perform(curl)

# 记得清理curl资源,避免内存泄漏
curl_slist_free_all(mylist)
curl_easy_cleanup(curl)

内容的提问来源于stack exchange,提问作者armanvanlendel

火山引擎 最新活动