# 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()