create_va.py 2.81 KB
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)