使用R调用Gemini私有API多参数接口遇HTTP 400错误求助
Fixing Gemini REST API /v1/mytrades 400 "Auction not open..." Error in R
我之前对接Gemini私有API时也踩过类似的多参数接口坑,这个"Auction not open..."错误其实很有迷惑性——大概率不是真的拍卖未开放,而是参数签名或格式出了问题。结合Gemini的API规则和R的HTTP请求特性,给你几个具体的排查方向:
1. 重点检查签名生成逻辑(90%的问题出在这)
Gemini私有API要求所有参数必须参与签名计算,而且序列化格式、加密方式不能错。很多人在R里踩坑就是因为JSON序列化或签名步骤不对:
- 必须把
request、nonce、symbol(以及其他可选参数)整合成一个列表,然后序列化为无空格的紧凑JSON字符串 - 签名是对这个JSON字符串做HMAC-SHA384加密,再转成Base64编码
nonce必须是严格递增的数字,建议用毫秒级时间戳(as.integer(Sys.time()*1000))避免重复
给你一个经过验证的R代码片段:
library(httr) library(digest) library(jsonlite) # 替换成你的API密钥 api_key <- "YOUR_GEMINI_API_KEY" api_secret <- "YOUR_GEMINI_API_SECRET" # 构造所有必填参数 trade_params <- list( request = "/v1/mytrades", nonce = as.integer(Sys.time() * 1000), symbol = "btcusd" # 换成你需要的交易对,比如ethusd ) # 生成紧凑无空格的JSON payload(关键!不能有空格) payload <- toJSON(trade_params, auto_unbox = TRUE, pretty = FALSE) # 生成签名:HMAC-SHA384加密后转Base64 signature <- hmac( key = api_secret, object = payload, algo = "sha384", raw = TRUE ) %>% base64_encode() # 发送POST请求 response <- POST( url = "https://api.gemini.com/v1/mytrades", add_headers( "X-GEMINI-APIKEY" = api_key, "X-GEMINI-PAYLOAD" = base64_encode(payload), "X-GEMINI-SIGNATURE" = signature ) ) # 查看响应内容 cat(content(response, "text"), "\n")
2. 验证参数的正确性
虽然错误提示是拍卖相关,但也要确认参数本身没问题:
symbol必须是Gemini支持的交易对,比如btcusd、ethusd,不能带任何符号或空格request参数必须和请求的端点完全一致,比如/v1/mytrades,不能少斜杠或者拼写错误- 如果添加了可选参数(比如
limit_trades),确保参数值是整数类型,不能是字符串
3. 确认请求方法和环境
/v1/mytrades是POST请求,绝对不能用GET- 如果是测试环境,要把URL换成
https://api.sandbox.gemini.com/v1/mytrades,同时使用测试网的API密钥
4. 排查R的JSON序列化坑
R的jsonlite::toJSON默认会生成带空格的格式化JSON,这会导致签名不匹配。一定要加上pretty = FALSE和auto_unbox = TRUE:
auto_unbox = TRUE确保单个数值(比如nonce)不会被包裹成数组(比如[1690000000000])pretty = FALSE生成紧凑无空格的JSON,保证签名计算的字符串和Gemini服务器端一致
如果还是不行,可以把生成的payload和signature打印出来,对比Gemini官方文档的签名示例,先验证签名逻辑是否正确。也可以用Postman手动构造请求测试,确认签名没问题后再回到R代码里调试。
内容的提问来源于stack exchange,提问作者jnnakhara
相关产品推荐
相关产品推荐

