作者:互联网 时间: 2026-07-29 09:35:30
先说个最省心的结论:如果只是查现货价格、看K线,根本不用创建API Key;只有要读账户数据、查订单、做交易这类需要身份验证的接口,才得用到密钥和签名。先把公开行情的接口调通,再考虑要不要创建密钥,这是最稳的上手思路。
币安官方注册地址:
币安APP下载地址:

币安现货的REST API分两类:公开接口和鉴权接口。安全类型标了NONE的行情接口,直接就能请求;要是USER_DATA、TRADE这类接口,才需要API Key,其中要签名的接口还得传timestamp、recvWindow和signature这几个参数。
查公开行情可以用data-api.binance.vision这个地址;通用的现货REST接口就用api.binance.com。接口返回的是JSON格式,时间字段默认都是毫秒级的。提醒一句:主机名、接口路径、参数全都要以币安官方开发者文档为准,别从聊天记录或者第三方代码片段里抄什么“备用接口”,不靠谱。
要是真的需要查账户、订单这类数据,就登录币安账户,走Account → API Management → Create API这个路径。按官方现在的要求,创建前账户得完成身份认证、开了双重验证,还要满足页面列的所有账户激活条件;要是页面提示不满足,就先停手别创建,千万别绕开限制。

第一次对接的话,选系统生成的HMAC密钥就行;要是做长期服务,可以评估下Ed25519。币安现在更推荐Ed25519,性能和安全性都更好,但这两种方案的签名代码不一样,不能混着用。不管选哪种,权限都只开你当下要用的:只是查行情就别创建密钥;做账户看板就只开读取权限;要做交易程序的话,单独建个密钥再开现货交易权限。提现权限一定要保持关闭,还要加上可信IP白名单。
Secret Key千万别写进源码、别提交到Git,也别发到聊天框里。最好放到密钥管理器、受保护的配置文件或者环境变量里;要是不小心把密钥弄到公开仓库、日志、截图或者工单里了,赶紧删掉旧的,重新生成新的。

最小测试就用GET /api/v3/ticker/price这个接口。传个symbol=BTCUSDT的参数,正常返回的结果里会有symbol和price这两个字段。这一步根本不用API Key,也不该出现权限或者签名相关的错误。

下面的示例用的是Python 3和requests库。第一次跑的话,先在你当前的Python环境里装依赖;要是做生产项目,一定要放到独立的虚拟环境里,别直接用系统自带的Python当项目环境。
python3 -m pip install requests
import requests
SCHEME = "https"
BASE_URL = f"{SCHEME}://data-api.binance.vision"
response = requests.get(
f"{BASE_URL}/api/v3/ticker/price",
params={"symbol": "BTCUSDT"},
timeout=10,
)
response.raise_for_status()
data = response.json()
print(data["symbol"], data["price"])
要是能正常输出BTCUSDT和一串价格,就说明你的网络、主机名、路径、参数全都是对的。如果返回-1121错误,不是密钥的问题,是你填的交易对名称不对,先去调/api/v3/exchangeInfo核对下可用的交易对符号。
查K线用的是GET /api/v3/klines接口。最少得传交易对和周期这两个参数;limit是用来控制返回多少根K线的。每根K线都是一个数组,前6项分别是开盘时间、开盘价、最高价、最低价、收盘价、成交量,别把数组下标当成字段名瞎猜哈。

response = requests.get(
f"{BASE_URL}/api/v3/klines",
params={
"symbol": "BTCUSDT",
"interval": "1h",
"limit": 10,
},
timeout=10,
)
response.raise_for_status()
for row in response.json():
open_time, open_price, high, low, close, volume = row[:6]
print(open_time, open_price, high, low, close, volume)
正常情况下会返回10组数组,而且每组的字段顺序都是固定的。要是你的程序需要长期轮询接口,一定要记得读响应头里的请求权重;要是收到HTTP 429错误,赶紧停手退避,按照Retry-After的提示等够时间再试,一直硬请求的话会触发HTTP 418,直接被自动封禁。
比如要读账户信息,咱们就用系统生成的HMAC密钥举例:把API Key放到X-MBX-APIKEY请求头里,Secret Key只在本地用来算HMAC-SHA256签名。参数里得先带上当前的毫秒时间戳,还有一个数值不大的recvWindow,然后对编码后的查询字符串做签名就行。
import hashlib
import hmac
import os
import time
from urllib.parse import urlencode
API_KEY = os.environ["BINANCE_API_KEY"]
API_SECRET = os.environ["BINANCE_API_SECRET"]
PRIVATE_BASE = f"{SCHEME}://api.binance.com"
params = {
"timestamp": int(time.time() * 1000),
"recvWindow": 5000,
}
query = urlencode(params)
params["signature"] = hmac.new(
API_SECRET.encode(),
query.encode(),
hashlib.sha256,
).hexdigest()
response = requests.get(
f"{PRIVATE_BASE}/api/v3/account",
headers={"X-MBX-APIKEY": API_KEY},
params=params,
timeout=10,
)
response.raise_for_status()
print(response.json())
要是返回-1021错误,先同步下你本机的时间,再用/api/v3/time接口对照下服务器的时间;要是返回-2015,就去核对API Key对不对、IP在不在白名单里、有没有开对应的读取权限。千万别靠把所有权限都打开来“排错”,那本来只是配置问题,最后会变成账户安全风险。
最后再把边界说清楚:查公开行情的话,先用不需要密钥的接口把价格、K线都测通;真的需要账户数据了,再创建权限最小的密钥,同时用IP白名单、环境变量、签名校验这些手段把风险降到最低。只要Secret Key离开了你的受控环境,旧密钥就必须立刻作废。