调用币安API用户账户签名端点遇HTTP 400错误,求排查方案
解决币安API账户端点GET请求返回400错误的问题
首先,咱们从你代码里能看到的问题入手,再逐一排查私有API调用的常见坑:
1. 立即修复参数连接符的错误
你的代码里拼接参数时用了&,这是HTML的转义字符,但币安API需要的是原始的&来分隔参数。这个错误会导致服务器无法正确解析timestamp参数,直接返回400。
把这行代码修改为:
String params = "recvWindow=" + DEFAULT_RECWINDOW + "×tamp=" + timeStamp ;
2. 检查签名生成的正确性
币安私有API的签名要求是用你的secret key对完整的参数字符串(也就是上面的params)进行HMAC SHA256加密,并且结果要转成小写的十六进制字符串。你代码里的Encry...部分需要确保:
- 签名的输入是未转义的原始参数串(修改后的
params) - 使用HMAC-SHA256算法,密钥是你的API secret
- 签名结果是小写的十六进制格式(不要大写或者其他编码)
正确的签名生成示例(Java):
Mac hmacSha256 = Mac.getInstance("HmacSHA256"); SecretKeySpec secretKeySpec = new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), "HmacSHA256"); hmacSha256.init(secretKeySpec); byte[] signatureBytes = hmacSha256.doFinal(params.getBytes(StandardCharsets.UTF_8)); String signature = Hex.encodeHexString(signatureBytes).toLowerCase();
3. 确保请求头包含API Key
币安私有API要求在请求头里添加X-MBX-APIKEY字段,值是你的API key。你的代码里没提到设置这个头,这也是400错误的常见原因。
在发送请求前,需要添加这个请求头:
HttpURLConnection conn = (HttpURLConnection) new URL(fullUri).openConnection(); conn.setRequestProperty("X-MBX-APIKEY", apikey.get("apiKey")); // 替换成你的API key
4. 验证时间戳与服务器时间的同步性
币安API要求你的本地时间戳(timeStamp)与服务器时间的差值不能超过recvWindow(默认5000毫秒)。如果你的本地时间偏差太大,会返回400错误。
你可以先调用币安的服务器时间接口(GET /api/v3/time)获取当前服务器时间,对比你的timeStamp是否在允许的范围内:
// 获取服务器时间示例 String timeUrl = "https://api.binance.com/api/v3/time"; HttpURLConnection timeConn = (HttpURLConnection) new URL(timeUrl).openConnection(); JSONObject timeJson = new JSONObject(new BufferedReader(new InputStreamReader(timeConn.getInputStream())).readLine()); long serverTime = timeJson.getLong("serverTime"); // 检查你的timeStamp与serverTime的差值是否小于recvWindow if (Math.abs(timeStamp - serverTime) > DEFAULT_RECWINDOW) { // 说明时间不同步,需要校准本地时间 }
5. 检查请求方法和URL正确性
确保你发送的是GET请求,并且URL是正确的:https://api.binance.com/api/v3/account(你的代码里的ACCOUNT_URL_V3要确认是这个地址,不要有多余的斜杠或者拼写错误)
按照上面的步骤逐一排查,应该能解决400错误的问题。
内容的提问来源于stack exchange,提问作者user3263016
相关产品推荐
相关产品推荐

