· 6 years ago · May 28, 2019, 12:10 AM
1import base64
2import hashlib
3import hmac
4import json
5import jwt
6import requests
7
8from django.conf import settings
9
10
11def encode_data(payload):
12 payload_data = json.dumps(payload).replace(" ", "")
13 payload_encode = base64.b64encode(payload_data.encode('utf-8'))
14
15 return replace_char(payload_encode.decode('utf-8'))
16
17
18def replace_char(data):
19 data = data.replace("+", "-")
20 data = data.replace("/", "_")
21 data = data.replace("=", "")
22
23 return data
24
25
26def create_jwt(payload_data, secret_key):
27 header_encode = encode_data({"typ": "JWT", "alg": "HS256"})
28 payload_encode = encode_data(payload_data)
29
30 hmac_data = f"{header_encode}.{payload_encode}"
31 hmac_result = hmac.new(secret_key.encode(), hmac_data.encode(), digestmod=hashlib.sha256).digest()
32
33 signature_encode = base64.b64encode(hmac_result)
34 signature = replace_char(signature_encode.decode('utf-8'))
35
36 return f"{hmac_data}.{signature}"
37
38
39def get_token():
40 data = f"{settings.BNI_DISBURSEMENT_CLIENT_ID}:{settings.BNI_DISBURSEMENT_CLIENT_SECRET}"
41 header_auth = base64.b64encode(data.encode('utf-8'))
42
43 url = f"{settings.BNI_DISBURSEMENT_URL}api/oauth/token"
44 headers = {
45 'Content-Type': 'application/x-www-form-urlencoded',
46 'Authorization': f"Basic {header_auth.decode('utf-8')}"
47 }
48
49 data = {
50 "grant_type": "client_credentials"
51 }
52
53 response = requests.post(url=url, headers=headers, data=data)
54
55 if response.status_code != 200:
56 return None
57
58 response_json = json.loads(response.content)
59
60 print('url', url)
61 print('headers', headers)
62 print('data', data)
63 print('response', response_json)
64
65 return response_json['access_token']
66
67
68def get_balance(account_number):
69 url = f"{settings.BNI_DISBURSEMENT_URL}H2H/v2/getbalance"
70 headers = {
71 'Content-Type': 'application/json',
72 'x-api-key': settings.BNI_DISBURSEMENT_API_KEY
73 }
74
75 data = {
76 "clientId": settings.BNI_DISBURSEMENT_CLIENT_NAME,
77 "accountNo": account_number
78 }
79
80 jwt = create_jwt(data, settings.BNI_DISBURSEMENT_SECRET_KEY)
81 data["signature"] = jwt
82
83 params = {
84 "access_token": get_token()
85 }
86
87 response = requests.post(url=url, headers=headers, json=data, params=params)
88 response_json = json.loads(response.content)
89
90 print('url', url)
91 print('headers', headers)
92 print('data', data)
93 print('params', params)
94 print('response', response_json)
95
96
97def get_inhouse_inquiry(account_number):
98 url = f"{settings.BNI_DISBURSEMENT_URL}H2H/v2/getinhouseinquiry"
99 headers = {
100 'Content-Type': 'application/json',
101 'x-api-key': settings.BNI_DISBURSEMENT_API_KEY
102 }
103
104 data = {
105 "clientId": settings.BNI_DISBURSEMENT_CLIENT_NAME,
106 "accountNo": account_number
107 }
108
109 jwt = create_jwt(data, settings.BNI_DISBURSEMENT_SECRET_KEY)
110 data["signature"] = jwt
111
112 params = {
113 "access_token": get_token()
114 }
115
116 response = requests.post(url=url, headers=headers, json=data, params=params)
117 response_json = json.loads(response.content)
118
119 print('url', url)
120 print('headers', headers)
121 print('data', data)
122 print('params', params)
123 print('response', response_json)
124
125
126def get_payment_status(reference_number):
127 url = f"{settings.BNI_DISBURSEMENT_URL}H2H/v2/getpaymentstatus"
128 headers = {
129 'Content-Type': 'application/json',
130 'x-api-key': settings.BNI_DISBURSEMENT_API_KEY
131 }
132
133 data = {
134 "clientId": settings.BNI_DISBURSEMENT_CLIENT_NAME,
135 "customerReferenceNumber": reference_number
136 }
137
138 jwt = create_jwt(data, settings.BNI_DISBURSEMENT_SECRET_KEY)
139 data["signature"] = jwt
140
141 params = {
142 "access_token": get_token()
143 }
144
145 response = requests.post(url=url, headers=headers, json=data, params=params)
146 response_json = json.loads(response.content)
147
148 print('url', url)
149 print('headers', headers)
150 print('data', data)
151 print('params', params)
152 print('response', response_json)
153
154
155def get_interbank_inquiry(account_number, reference_number, destination_bank_code, destination_account):
156 url = f"{settings.BNI_DISBURSEMENT_URL}H2H/v2/getinterbankinquiry"
157 headers = {
158 'Content-Type': 'application/json',
159 'x-api-key': settings.BNI_DISBURSEMENT_API_KEY
160 }
161
162 data = {
163 "clientId": settings.BNI_DISBURSEMENT_CLIENT_NAME,
164 "customerReferenceNumber": reference_number,
165 "accountNum": account_number,
166 "destinationBankCode": destination_bank_code,
167 "destinationAccountNum": destination_account
168 }
169
170 jwt = create_jwt(data, settings.BNI_DISBURSEMENT_SECRET_KEY)
171 data["signature"] = jwt
172
173 params = {
174 "access_token": get_token()
175 }
176
177 response = requests.post(url=url, headers=headers, json=data, params=params)
178 response_json = json.loads(response.content)
179
180 print('url', url)
181 print('headers', headers)
182 print('data', data)
183 print('params', params)
184 print('response', response_json)
185
186
187def get_interbank_payment(account_number, reference_number, destination_bank_code,
188 destination_bank_name, destination_account_number,
189 destination_account_name, retrieval_reff_number):
190 url = f"{settings.BNI_DISBURSEMENT_URL}H2H/v2/getinterbankpayment"
191 headers = {
192 'Content-Type': 'application/json',
193 'x-api-key': settings.BNI_DISBURSEMENT_API_KEY
194 }
195
196 data = {
197 "clientId": settings.BNI_DISBURSEMENT_CLIENT_NAME,
198 "customerReferenceNumber": reference_number,
199 "amount": "100000",
200 "destinationAccountNum": destination_account_number,
201 "destinationAccountName": destination_account_name,
202 "destinationBankCode": destination_bank_code,
203 "destinationBankName": destination_bank_name,
204 "accountNum": account_number,
205 "retrievalReffNum": retrieval_reff_number
206 }
207
208 signature = jwt.encode(data, settings.BNI_DISBURSEMENT_SECRET_KEY, algorithm='HS256')
209 data["signature"] = signature.decode('utf-8')
210
211 params = {
212 "access_token": get_token()
213 }
214
215 response = requests.post(url=url, headers=headers, json=data, params=params)
216 response_json = json.loads(response.content)
217
218 print('url', url)
219 print('headers', headers)
220 print('data', data)
221 print('params', params)
222 print('response', response_json)
223
224
225def do_payment(debit_account, credit_account, reference_number, amount):
226 url = f"{settings.BNI_DISBURSEMENT_URL}H2H/v2/dopayment"
227 headers = {
228 'Content-Type': 'application/json',
229 'x-api-key': settings.BNI_DISBURSEMENT_API_KEY
230 }
231
232 data = {
233 "clientId": settings.BNI_DISBURSEMENT_CLIENT_NAME,
234 "customerReferenceNumber": reference_number,
235 "paymentMethod": "0",
236 "debitAccountNo": debit_account,
237 "creditAccountNo": credit_account,
238 "valueAmount": str(amount),
239 "valueCurrency": "IDR",
240 "valueDate": "20190226092233",
241 "remark": "testdoPayment"
242 }
243
244 signature = jwt.encode(data, settings.BNI_DISBURSEMENT_SECRET_KEY, algorithm='HS256')
245 data["signature"] = signature.decode('utf-8')
246
247 params = {
248 "access_token": get_token()
249 }
250
251 response = requests.post(url=url, headers=headers, json=data, params=params)
252
253 response_json = json.loads(response.content)
254
255 print('url', url)
256 print('headers', headers)
257 print('data', data)
258 print('params', params)
259 print('response', response_json)