From c750478af9a8da6acdf4bd915d20bb868cb104fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=96=87=E8=96=87=E5=AE=89?= Date: Mon, 16 Feb 2026 19:25:22 +0800 Subject: [PATCH] =?UTF-8?q?fix(binance=5Fclient):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E7=AD=BE=E5=90=8D=E8=AE=A1=E7=AE=97=E9=80=BB=E8=BE=91=E4=BB=A5?= =?UTF-8?q?=E7=AC=A6=E5=90=88=E5=B8=81=E5=AE=89=E8=A6=81=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在 `binance_client.py` 中更新了签名计算逻辑,确保参与签名的参数格式与币安REST API一致。新增 `_param_val_for_signature` 函数处理布尔值和空值,提升了签名的准确性和安全性。此改动增强了系统的稳定性和合规性。 --- trading_system/binance_client.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/trading_system/binance_client.py b/trading_system/binance_client.py index b806581..dd25517 100644 --- a/trading_system/binance_client.py +++ b/trading_system/binance_client.py @@ -2037,12 +2037,22 @@ class BinanceClient: ws_params["apiKey"] = self.api_key if "timestamp" not in ws_params: ws_params["timestamp"] = int(time.time() * 1000) - # 计算签名(和 REST 一样的方式) + # 计算签名:币安要求参与签名的值格式与 REST 一致(布尔小写、空值不参与或为空串) if "signature" not in ws_params: import hmac import hashlib from urllib.parse import urlencode - query_string = urlencode(sorted([(k, str(v)) for k, v in ws_params.items() if k != "signature"])) + def _param_val_for_signature(v): + if v is True: + return "true" + if v is False: + return "false" + if v is None: + return "" + s = str(v).strip() + return s if s else "" + sign_params = [(k, _param_val_for_signature(v)) for k, v in ws_params.items() if k != "signature"] + query_string = urlencode(sorted(sign_params)) signature = hmac.new( self.api_secret.encode('utf-8'), query_string.encode('utf-8'),