binance api ошибка 'code': -1102, 'msg': "Mandatory parameter 'timestamp' was not sent, was empty/null, or malformed."

Помогите, не могу найти причину ошибки. Проблема с передачей часовой метки. Такой подход для https://api.binance.com/api/v3/order работает, но для https://fapi.binance.com/fapi/v1/order уже не работает. Вот код "шредингера"

import ssl
import time
import json
import urllib
import hmac, hashlib
import requests

from urllib.parse import urlparse, urlencode
from urllib.request import Request, urlopen
class Binance():

    methods = {'createOrder':      {'url': 'fapi/v1/order', 'method': 'POST', 'private': True}}

    def __init__(self, API_KEY, API_SECRET):
        self.API_KEY = API_KEY
        self.API_SECRET = bytearray(API_SECRET, encoding='utf-8')

    def __getattr__(self, name):
        def wrapper(*args, **kwargs):
            kwargs.update(command=name)
            return self.call_api(**kwargs)
        return wrapper

    def call_api(self, **kwargs):
        command = kwargs.pop('command')
        api_url = 'https://fapi.binance.com/' + self.methods[command]['url']

        payload = kwargs
        headers = {}

        payload_str = urllib.parse.urlencode(payload)
        if self.methods[command]['private']:
            payload.update({'timestamp': int(time.time()) * 1000})
            payload_str = urllib.parse.urlencode(payload).encode('utf-8')
            sign = hmac.new(
                key=self.API_SECRET,
                msg=payload_str,
                digestmod=hashlib.sha256
            ).hexdigest()

            payload_str = payload_str.decode("utf-8") + "&signature="+str(sign) 
            headers = {"X-MBX-APIKEY": self.API_KEY}

        response = requests.request(method=self.methods[command]['method'], url=api_url, data="" if self.methods[command]['method'] == 'GET' else payload_str, headers=headers)
        return response.json()

if __name__ == "__main__":
    binance = Binance('','')
    print(binance.createOrder(symbol="BTCUSDT", quantity=1, side="BUY", type="MARKET"))

Документация binance https://binance-docs.github.io/apidocs/futures/en/#new-order-trade


Ответы (1 шт):

Автор решения: Kostya Cholak

Столкнулся с этой же проблемой. Решением было передача данных не через data, а через params, вне зависимости от метода (GET, POST, ...):

response = requests.request(..., params=payload_str, ...)
→ Ссылка