如何通过API在Binance Testnet交易?请求报错400排查求助
Binance测试网API下单400错误排查与修复
问题根源分析
你遇到的400错误主要来自三个核心问题:
- 签名传递方式错误:Binance API要求签名作为请求参数的一部分,而非HTTP请求头
- 请求内容格式错误:需要签名的POST请求必须用
application/x-www-form-urlencoded格式,而非JSON - 冗余参数:市价单(MARKET)不需要设置
timeInForce参数,多余参数会导致请求校验失败
修正后的代码
import requests import time import hashlib import hmac # 测试网基础URL BASE_URL = "https://testnet.binancefuture.com" # 期货下单接口 ENDPOINT = "/fapi/v1/order" # 替换为你的测试网API密钥和密钥 API_KEY = "你的测试网API_KEY" API_SECRET = "你的测试网API_SECRET" headers = { "X-MBX-APIKEY": API_KEY } # 订单核心参数 symbol = "EOSUSDT" side = "BUY" order_type = "MARKET" # 避免与Python内置关键字type冲突 quantity = 20 # 构造请求参数 payload = { "symbol": symbol, "side": side, "type": order_type, "quantity": quantity, "timestamp": int(time.time() * 1000) } # 生成API签名 query_string = "&".join([f"{k}={v}" for k, v in payload.items()]) signature = hmac.new(API_SECRET.encode(), query_string.encode(), hashlib.sha256).hexdigest() # 将签名加入请求参数 payload["signature"] = signature # 发送POST请求,使用表单格式传递参数 response = requests.post(BASE_URL + ENDPOINT, headers=headers, data=payload) # 处理响应结果 if response.status_code == 200: print("订单下单成功!") print(response.json()) else: print("下单失败,错误码:", response.status_code) print("错误详情:", response.json())
关键修复点说明
- 签名传递修正:把生成的
signature添加到payload字典中,作为请求参数的一部分,而非放在HTTP头里 - 请求格式修正:使用
data=payload替代json=payload,自动以application/x-www-form-urlencoded格式发送数据,与签名生成的查询字符串格式保持一致 - 移除冗余参数:删除市价单不需要的
timeInForce参数 - 变量名优化:将
type改为order_type,避免与Python内置关键字冲突,提升代码可读性
额外排查建议
- 确认API_KEY和API_SECRET是测试网专属,主网密钥无法在测试网使用
- 检查timestamp是否在Binance服务器允许的误差范围内(通常为5000ms以内),确保用
int(time.time() * 1000)生成整数时间戳 - 打印
response.json()查看具体错误描述,Binance的400错误会返回精准的问题提示(如签名无效、参数缺失等),是快速定位问题的核心依据
内容的提问来源于stack exchange,提问作者Dmitrii Domrachev
相关产品推荐
相关产品推荐

