Search code examples
pythonsha256hmacbinance

Binance API 'allOrders' (HMAC sha256) error 1022


For about the past week I've been trying to wrap my head around the concept of a signed HMAC sha256 request.

In this example I'm just trying to get a list of all current orders. I thought I'd figured it out but for some reason this still won't work. The API keys are new...I've tried both Read and Write versions, and my IP is whitelisted.

I'm getting {'code': -1022, 'msg': 'Signature for this request is not valid.'}

My code...

import hmac
import hashlib
import json
import requests
import time

import Credentials

class Private:

    def GetAllOrders(pair,orderid='',start='',finish='',limit='',window=''):

        # Credentials #
        ApiKey = Credentials.Binance.ReadAPIKey
        SecretKey = Credentials.Binance.ReadSecretKey

        # Base #
        BaseURL = 'https://api.binance.com'
        EndPoint = '/api/v3/allOrders'
                
        # Required #
        Pair = '?symbol='+str(pair)                                     
        Time = '&timestamp='+str(int(time.time()*1000))  

        # Optional #
        if orderid != '':
            OrderID = '&orderId='+str(orderid)                       
        else:                   
            OrderID = orderid

        if start != '':
            Start = '&startTime='+str(start*1000)                      
        else:                   
            Start = start

        if finish != '':
            Finish = '&endTime='+str(finish*1000)                       
        else:
            Finish = finish

        if limit != '':
            Limit = '&limit='+str(limit)                                   
        else:
            Limit = limit

        if window != '':
            Window = '&recvWindow='+str(window)                         
        else:
            Window = window
        
        # HMAC #
        HMAC = hmac.new(bytes(SecretKey.encode('utf-8')), 
                        (Pair+OrderID+Start+Finish+Limit+Window+Time).encode('utf-8'),
                        hashlib.sha256).hexdigest()
        
        # Signature #                    
        Signature = '&signature='+str(HMAC)
        
        # Headers #
        Headers = {'X-MBX-APIKEY': ApiKey}

        # Request #
        JSON = requests.get(BaseURL+EndPoint+Pair+OrderID+Start+Finish+Limit+Window+Time+Signature,headers=Headers).json()

        return JSON

print(Private.GetAllOrders(pair='BTCUSDT'))


Any help would be appreciated...


Solution

  • I figured it out...

    The HMAC does not recognize the '?' as being the start of the parameters, whereas the URL (API) does.

    The following lines should look like this...

    # Required #
    Pair = 'symbol='+str(pair)   
    
    # Request #
    JSON = requests.get(BaseURL+EndPoint+'?'+Pair+OrderID+Start+Finish+Limit+Window+Time+Signature,headers=Headers).json()