生成API签名(HMAC SHA256)时出现签名错误,求排查方案
Azbit API签名错误排查与修复
你的代码生成的API签名始终错误,核心问题出在请求体的序列化方式上,具体问题和修复方案如下:
问题根源
你使用str(data)将Python字典转为字符串,生成的是类似{'side': 'sell', 'currencyPairCode': 'BTC_USDT', ...}的Python格式字符串——其中用单引号、键值对顺序不固定,还可能包含多余空格,但Azbit API要求签名使用标准JSON格式的请求体字符串(双引号包裹键值、固定键顺序、无冗余空格)。
修正后的代码
import requests import json import hmac import hashlib pkey = "你的公钥" skey = "你的密钥" url = "https://data.azbit.com/api/orders" data = {"side":"sell","currencyPairCode":"BTC_USDT","amount":0.01,"price":29700} # 关键修正:用json.dumps生成标准JSON字符串,确保格式严格匹配API要求 request_body_str = json.dumps(data, separators=(',', ':')) sigtext = pkey + url + request_body_str sighmac = hmac.new(skey.encode('utf-8'), sigtext.encode('utf-8'), hashlib.sha256).hexdigest() rheaders = {"API-PublicKey": pkey, "API-Signature": sighmac} # 可选:如果担心requests的json参数序列化和签名用的字符串不一致,可直接发送序列化后的字符串 # response = requests.post(url, headers={**rheaders, "Content-Type": "application/json"}, data=request_body_str) response = requests.post(url, headers=rheaders, json=data) print("状态码", response.status_code) print("响应内容 ", response.json())
额外注意事项
- 确保
json.dumps生成的字符串和实际发送给API的请求体完全一致:如果使用requests.post的json参数,内部会自动序列化,但部分API要求签名用的请求体必须和实际发送的字节完全匹配,此时建议直接发送request_body_str并添加Content-Type: application/json请求头。 - 检查公钥、密钥是否正确,无复制错误或多余空格。
内容的提问来源于stack exchange,提问作者kk3nny
相关产品推荐
相关产品推荐

