WazirX API报2098错误Request out of receiving window如何解决
错误触发原因
错误码2098是WazirX私有接口的通用时间校验失败错误,触发逻辑只有一个:服务端收到请求时,计算传入的timestamp参数值和服务端当前时间的差值,超过了接口允许的最大接收窗口(默认5000毫秒),就会直接返回该错误。
你的代码存在两个直接触发该错误的问题:
- 时间戳精度错误:WazirX所有私有接口要求传入毫秒级Unix时间戳(13位数字),但你用
datetime.datetime.now().timestamp()取整后得到的是秒级时间戳(10位数字),数值和服务端时间差了1000倍,必然超出接收窗口。 - 无时间校准逻辑:如果本地设备系统时间和WazirX服务器时间存在超过5秒的偏移,哪怕时间戳精度正确,也会触发该错误。
另外你当前代码中签名逻辑未完整展示,修完时间戳问题后如果碰到签名错误,需要确认签名是用HMAC-SHA256算法,以API Secret为密钥,对拼接好的参数字符串做加密生成,不要把签名本身纳入待加密的参数字符串。
修复后可直接运行的代码
import time import hmac import hashlib import requests # 替换为你自己的凭证 API_KEY = "你的WazirX API Key" API_SECRET = "你的WazirX API Secret" # 生成合规的毫秒级时间戳,优先用服务器时间校准避免本地时间偏移 # 本地时间准确时可以直接用下一行的本地生成逻辑 # ts = int(time.time() * 1000) # 网络环境复杂/本地时间不准时用服务器时间校准(推荐) server_time = requests.get("https://api.wazirx.com/sapi/v1/time").json()["serverTime"] ts = server_time # 拼接待签名的参数字符串,网络差时可以加recvWindow参数,最大支持60000(60秒) # 示例加recvWindow的写法:query_str = f"timestamp={ts}&recvWindow=10000" query_str = f"timestamp={ts}" # 生成签名 signature = hmac.new( API_SECRET.encode("utf-8"), query_str.encode("utf-8"), hashlib.sha256 ).hexdigest() # 构造请求 request_url = f"https://api.wazirx.com/sapi/v1/funds?{query_str}&signature={signature}" headers = {"X-Api-Key": API_KEY} resp = requests.get(request_url, headers=headers) print(resp.json())
实操避坑点
- 不要用
datetime模块生成时间戳,直接用time.time()*1000取整即可,避免时区配置、对象精度带来的异常。 - 如果需要加
recvWindow参数延长接收窗口,该参数必须和timestamp一起参与签名计算,否则会触发签名错误。 - GET请求不需要传递空的
data参数,多余的空载荷可能在部分网络环境下增加不必要的请求耗时,加大超窗概率。 - 拼接URL参数时直接用
&做分隔符,不要用HTML转义后的&,否则会导致服务端解析参数失败。 - 所有参与签名的参数必须按照URL里的拼接顺序传入签名函数,顺序不一致会直接导致签名校验失败。
内容的提问来源于stack exchange,提问作者Ishaan
相关产品推荐
相关产品推荐

