1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# 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()