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-encoding、connection: 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×tamp=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




