You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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())

关键修复点说明

  1. 签名传递修正:把生成的signature添加到payload字典中,作为请求参数的一部分,而非放在HTTP头里
  2. 请求格式修正:使用data=payload替代json=payload,自动以application/x-www-form-urlencoded格式发送数据,与签名生成的查询字符串格式保持一致
  3. 移除冗余参数:删除市价单不需要的timeInForce参数
  4. 变量名优化:将type改为order_type,避免与Python内置关键字冲突,提升代码可读性

额外排查建议

  • 确认API_KEY和API_SECRET是测试网专属,主网密钥无法在测试网使用
  • 检查timestamp是否在Binance服务器允许的误差范围内(通常为5000ms以内),确保用int(time.time() * 1000)生成整数时间戳
  • 打印response.json()查看具体错误描述,Binance的400错误会返回精准的问题提示(如签名无效、参数缺失等),是快速定位问题的核心依据

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 23:08:21