Public
Snippet $157 authored by Owo Sugiana

Winpay Signature Generator

signature.py
# Winpay Signature Generator
# Ikuti petunjuk di https://git.opensipkd.com/snippets/156
# pip install git+https://git.opensipkd.com/sugiana/opensipkd-hitung
import sys
import json
import hashlib
from base64 import b64encode
from argparse import ArgumentParser
from opensipkd.waktu import create_now
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 generator(
        private_key: bytes, data: dict, timestamp: 'datetime with time zone',
        http_method='POST',
        end_point_url='/v1.0/transfer-va/create-va') -> bytes:
    body = json.dumps(data, separators=(',', ':'))
    body_byte = body.encode('utf-8')
    body_hash = hashlib.sha256(body_byte).hexdigest().lower()
    timestamp_str = time_to_str(timestamp)
    sign_list = [http_method, end_point_url, body_hash, timestamp_str]
    sign_str = ':'.join(sign_list)
    return sign_without_salt(private_key, sign_str.encode('utf-8'))


def main(argv=sys.argv[1:]):
    pars = ArgumentParser()
    pars.add_argument('--private-file', required=True)
    pars.add_argument('--json-file', required=True)
    option = pars.parse_args(sys.argv[1:])

    with open(option.private_file, 'rb') as f:
        private_bytes = f.read()

    with open(option.json_file) as f:
        data = json.loads(f.read())

    timestamp = create_now()
    sign_bytes = generator(private_bytes, data, timestamp)
    sign_b64 = b64encode(sign_bytes).decode('utf-8')
    print(sign_b64)


if __name__ == '__main__':
    main()