
本文旨在帮助开发者解决在使用Pionex API进行交易时遇到的"INVALID_SIGNATURE"错误。通过详细的代码示例和问题分析,本文将指导你正确生成API签名,从而成功地向Pionex平台发送交易请求。核心问题在于签名生成过程中JSON序列化格式的细微差别,本文将提供明确的解决方案。
在对接Pionex API进行交易时,签名验证是至关重要的一环。INVALID_SIGNATURE错误通常表示你生成的签名与服务器期望的签名不匹配。这可能是由于多种原因引起的,包括参数顺序错误、时间戳不一致或签名算法实现错误。本文将重点介绍一个常见的、容易被忽视的错误,并提供相应的解决方案。
在生成Pionex API签名时,如果你的请求包含data(例如,POST请求的payload),你需要将data进行JSON序列化,并将序列化后的字符串包含在签名消息中。然而,默认的JSON序列化格式可能与Pionex API期望的格式不一致,导致签名验证失败。
具体来说,问题通常出现在JSON序列化时,键值对之间是否包含空格。Pionex API可能要求键值对之间不包含空格,而Python默认的json.dumps方法可能会在,和:后面添加空格。
解决此问题的关键在于使用json.dumps方法时,通过separators参数明确指定键值对之间的分隔符,确保不包含空格。
以下是修正后的generate_signature函数:
import hashlib
import hmac
import json
from urllib.parse import urlencode
def generate_signature(api_secret, method, path, timestamp, params=None, data=None):
if params is None:
params = {}
params['timestamp'] = timestamp
query_string = urlencode(sorted(params.items()))
path_url = f"{path}?{query_string}"
message = f"{method.upper()}{path_url}"
# 关键修改:指定separators参数,移除空格
if data is not None:
message += json.dumps(data, separators=(',', ':'))
signature = hmac.new(api_secret.encode('utf-8'), message.encode('utf-8'), hashlib.sha256).hexdigest()
return signature代码解释:
以下是一个完整的示例代码,展示了如何使用修正后的generate_signature函数进行POST请求:
import requests
import time
import json
import hashlib
import hmac
from urllib.parse import urlencode
api_key = "YOUR_API_KEY" # 替换为你的API Key
api_secret = "YOUR_API_SECRET" # 替换为你的API Secret
def generate_signature(api_secret, method, path, timestamp, params=None, data=None):
if params is None:
params = {}
params['timestamp'] = timestamp
query_string = urlencode(sorted(params.items()))
path_url = f"{path}?{query_string}"
message = f"{method.upper()}{path_url}"
if data is not None:
message += json.dumps(data, separators=(',', ':'))
signature = hmac.new(api_secret.encode('utf-8'), message.encode('utf-8'), hashlib.sha256).hexdigest()
return signature
def make_private_request(method, endpoint, data=None):
url = f"https://api.pionex.com{endpoint}"
timestamp = str(int(time.time() * 1000))
params = {'timestamp': timestamp}
headers = {
'PIONEX-KEY': api_key,
'PIONEX-SIGNATURE': generate_signature(api_secret, method, endpoint, timestamp, params=params, data=data),
'Content-Type': 'application/json',
}
if method == 'POST':
response = requests.post(url, headers=headers, json=data)
else:
raise ValueError(f"Unsupported HTTP method: {method}")
return response.json()
endpoint = "/api/v1/trade/order"
order_data = {
"clientOrderId": "unique_order_id", # 替换为你的唯一订单ID
"symbol": "BTC_USDT",
"side": "BUY",
"type": "MARKET",
"size": "0.001", # 购买数量
}
response = make_private_request('POST', endpoint, data=order_data)
print(response)注意事项:
除了JSON序列化格式之外,以下是一些其他可能导致INVALID_SIGNATURE错误的原因:
解决Pionex API交易签名无效问题,需要仔细检查签名生成的每一个步骤。本文重点介绍了JSON序列化格式对签名的影响,并提供了明确的解决方案。通过修正generate_signature函数中的separators参数,可以有效地解决INVALID_SIGNATURE错误。同时,还需要注意API Key和Secret、时间戳、请求方法、参数顺序和编码等其他可能导致签名无效的原因。希望本文能够帮助你成功对接Pionex API,实现自动化交易。
以上就是解决Pionex API交易签名无效问题:一步步指南的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号