create_va.py
2.81 KB
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
import sys
import json
from datetime import (
datetime,
timedelta,
)
from argparse import ArgumentParser
from base64 import b64encode
import requests
import pytz
from winpay.signature import generator
def time_to_str(t: datetime) -> str:
s = t.strftime('%Y-%m-%dT%H:%M:%S%z')
return s[:-2] + ':' + s[-2:]
url = 'http://localhost:6543/v1.0/transfer-va/create-va'
help_url = f'default {url}'
trx_id = datetime.now().strftime('%H%M%S')
help_trx_id = f'default {trx_id}'
partner_id = '1234'
help_partner_id = f'default {partner_id}'
customer_no = '081234567890'
help_customer_no = f'default {customer_no}'
va_name = 'Jokul Doe'
help_va_name = f'default {va_name}'
amount = 10000
help_amount = f'default {amount}'
expired_days = 1
help_expired = f'default {expired_days}'
channels = [
'BRI', 'BNI', 'MANDIRI', 'PERMATA', 'BSI', 'MUAMALAT', 'BCA', 'CIMB',
'SINARMAS', 'BNC', 'INDOMARET', 'ALFAMART']
channel = channels[0]
help_channel = f'default {channel}'
pars = ArgumentParser()
pars.add_argument('--private-file', required=True)
pars.add_argument('--partner-id', default=partner_id, help=help_partner_id)
pars.add_argument('--customer-no', default=customer_no, help=help_customer_no)
pars.add_argument('--va-name', default=va_name, help=help_va_name)
pars.add_argument('--amount', type=int, default=amount, help=help_amount)
pars.add_argument(
'--channel', choices=channels, default=channel, help=help_channel)
pars.add_argument('--url', default=url, help=help_url)
pars.add_argument(
'--expired-days', type=int, default=expired_days, help=help_expired)
pars.add_argument('--trx-id', default=trx_id, help=help_trx_id)
option = pars.parse_args(sys.argv[1:])
one_day = timedelta(1)
jakarta_tz = pytz.timezone('Asia/Jakarta')
now = datetime.now(jakarta_tz)
now_str = time_to_str(now)
expired_date = now + one_day * option.expired_days
expired_str = time_to_str(expired_date)
data = dict(
virtualAccountTrxType='C',
customerNo=option.customer_no,
virtualAccountName=option.va_name,
trxId=option.trx_id,
totalAmount=dict(value=option.amount, currency='IDR'),
expiredDate=expired_str,
additionalInfo=dict(channel=option.channel))
with open(option.private_file, 'rb') as f:
private_bytes = f.read()
signature = generator(private_bytes, data, now)
signature_b64 = b64encode(signature)
signature_b64 = signature_b64.decode('utf-8')
headers = {
'X-TIMESTAMP': now_str,
'X-SIGNATURE': signature_b64,
'X-PARTNER-ID': option.partner_id,
}
print('Request')
print('URL:', url)
print('Headers:', headers)
print('Body:', data)
response = requests.post(url, headers=headers, json=data)
print()
print('Response')
print('HTTP Status:', response.status_code)
print('Headers:', response.headers)
try:
r = response.json()
except json.decoder.JSONDecodeError:
r = response.text
print('Body:', r)