signature.py 1.08 KB
# Winpay Signature Generator
import hashlib
import json
from .encrypt import sign_without_salt


def time_to_str(t: 'datetime with time zone'):
    s = t.strftime('%Y-%m-%dT%H:%M:%S%z')
    return s[:-2] + ':' + s[-2:]


def create_data(
        data: dict, timestamp: 'datetime with time zone',
        http_method='POST', end_point_url='/v1.0/transfer-va/create-va'):
    body = json.dumps(data, separators=(',', ':'))
    body_byte = body.encode('utf-8')
    body_hash = hashlib.sha256(body_byte).hexdigest().lower()
    if isinstance(timestamp, str):
        timestamp_str = timestamp
    else:
        timestamp_str = time_to_str(timestamp)
    sign_data = [http_method, end_point_url, body_hash, timestamp_str]
    sign_data = ':'.join(sign_data)
    return sign_data.encode('utf-8')


def generator(
        private_key: bytes, data: dict, timestamp: 'datetime with time zone',
        http_method='POST',
        end_point_url='/v1.0/transfer-va/create-va') -> bytes:
    sign_data = create_data(data, timestamp, http_method, end_point_url)
    return sign_without_salt(private_key, sign_data)