Commit 93329a02 by Owo Sugiana

Bug fixed web service saat ISO8583 offline

1 parent b67f0bc0
0.3.1 2020-08-19
----------------
- Bug fixed web service saat ISO8583 offline
- README.rst memuat diagram antar daemon
0.3 2020-08-09 0.3 2020-08-09
-------------- --------------
- Di forwarder.py Parser.run() usai job.process() bisa mengirim dokumen ISO8583 - Di forwarder.py Parser.run() usai job.process() bisa mengirim dokumen ISO8583
......
...@@ -29,6 +29,12 @@ Selanjutnya kita membutuhkan tiga terminal untuk simulasi: ...@@ -29,6 +29,12 @@ Selanjutnya kita membutuhkan tiga terminal untuk simulasi:
Sebagai Pemda Sebagai Pemda
------------- -------------
Berikut ini diagram komunikasi ISO8583 Pemda dengan BJB::
+----------------+ +-------+
| BJB port 10002 | <-----> | Pemda |
+----------------+ +-------+
Buat file konfigurasi ``test-pemda.ini``:: Buat file konfigurasi ``test-pemda.ini``::
[loggers] [loggers]
...@@ -126,10 +132,21 @@ aktif. ...@@ -126,10 +132,21 @@ aktif.
Sebagai Bank Sebagai Bank
------------ ------------
Buka terminal ke-2, dan buat file ``test-bank.ini``:: Melanjutkan diagram sebelumnya maka kini ada simulasi teller yang menghubungi
kantor pusatnya::
+--------------------+
| BJB | +-------+
+--------+ | ISO8583 port 10002 | <-----> | Pemda |
| Teller | -----> | HTTP port 7000 | +-------+
+------- + +--------------------+
HTTP atau web service merupakan komunikasi satu arah, oleh karena itu hanya
digambarkan satu panah saja. Selanjutnya buka terminal ke-2, dan buat file
``test-bank.ini``::
[loggers] [loggers]
keys = root, iso8583_web keys = root, iso8583_web, jsonrpc
[handlers] [handlers]
keys = console, file keys = console, file
...@@ -146,6 +163,11 @@ Buka terminal ke-2, dan buat file ``test-bank.ini``:: ...@@ -146,6 +163,11 @@ Buka terminal ke-2, dan buat file ``test-bank.ini``::
handlers = handlers =
qualname = iso8583_web qualname = iso8583_web
[logger_jsonrpc]
level = DEBUG
handlers = console, file
qualname = pyramid_rpc.jsonrpc
[handler_console] [handler_console]
class = StreamHandler class = StreamHandler
args = (sys.stderr,) args = (sys.stderr,)
...@@ -161,7 +183,7 @@ Buka terminal ke-2, dan buat file ``test-bank.ini``:: ...@@ -161,7 +183,7 @@ Buka terminal ke-2, dan buat file ``test-bank.ini``::
[formatter_generic] [formatter_generic]
format = %(asctime)s %(levelname)s %(message)s format = %(asctime)s %(levelname)s %(message)s
[host_pemda] [host_kota_bogor]
ip = 127.0.0.1 ip = 127.0.0.1
port = 10002 port = 10002
listen = true listen = true
...@@ -174,7 +196,7 @@ Buka terminal ke-2, dan buat file ``test-bank.ini``:: ...@@ -174,7 +196,7 @@ Buka terminal ke-2, dan buat file ``test-bank.ini``::
[web_teller] [web_teller]
route_path = /rpc route_path = /rpc
host = pemda host = kota_bogor
module = iso8583_web.scripts.views.jsonrpc module = iso8583_web.scripts.views.jsonrpc
allowed_ip = allowed_ip =
127.0.0.1 127.0.0.1
...@@ -205,8 +227,8 @@ Selanjutnya section ``web_teller``:: ...@@ -205,8 +227,8 @@ Selanjutnya section ``web_teller``::
[web_teller] [web_teller]
route_path = /rpc route_path = /rpc
host = pemda host = kota_bogor
module = iso8583_web.scripts.view.jsonrpc module = iso8583_web.scripts.views.jsonrpc
allowed_ip = allowed_ip =
127.0.0.1 127.0.0.1
10.8.20.1 10.8.20.1
...@@ -216,7 +238,7 @@ Bandingkan dengan section yang berawalan ``host_`` yang berarti konfigurasi ...@@ -216,7 +238,7 @@ Bandingkan dengan section yang berawalan ``host_`` yang berarti konfigurasi
untuk ISO8583. Berikut penjelasannya: untuk ISO8583. Berikut penjelasannya:
* ``route_path`` merupakan *URL path*, selalu awali dengan ``/`` * ``route_path`` merupakan *URL path*, selalu awali dengan ``/``
* ``host = pemda`` berarti harus ada section ``host_pemda``. Ini merupakan * ``host = kota_bogor`` berarti harus ada section ``host_kota_bogor``. Ini merupakan
*routing*, akan diarahkan ke ISO8583 mana HTTP request ini. *routing*, akan diarahkan ke ISO8583 mana HTTP request ini.
* ``module`` merupakan *modul Pyramid* yang akan digunakan untuk menanggapi * ``module`` merupakan *modul Pyramid* yang akan digunakan untuk menanggapi
*HTTP request* *HTTP request*
...@@ -236,12 +258,12 @@ Seharusnya ada penampakan seperti ini:: ...@@ -236,12 +258,12 @@ Seharusnya ada penampakan seperti ini::
2020-07-18 22:27:44,373 INFO Web server listen at 0.0.0.0:7000 with 12 workers 2020-07-18 22:27:44,373 INFO Web server listen at 0.0.0.0:7000 with 12 workers
2020-07-18 22:27:44,373 INFO ISO8583 server listen at 0.0.0.0:10002 2020-07-18 22:27:44,373 INFO ISO8583 server listen at 0.0.0.0:10002
2020-07-18 22:27:46,592 INFO 127.0.0.1 allowed 2020-07-18 22:27:46,592 INFO 127.0.0.1 allowed
2020-07-18 22:27:51,595 INFO 127.0.0.1 pemda 140197249940784 Receive [b'00560800822000000000000004000000000000000718222751222236301\x03'] 2020-07-18 22:27:51,595 INFO 127.0.0.1 kota_bogor 140197249940784 Receive [b'00560800822000000000000004000000000000000718222751222236301\x03']
2020-07-18 22:27:51,596 INFO 127.0.0.1 pemda 140197249940784 Raw to ISO8583 [b'0800822000000000000004000000000000000718222751222236301'] 2020-07-18 22:27:51,596 INFO 127.0.0.1 kota_bogor 140197249940784 Raw to ISO8583 [b'0800822000000000000004000000000000000718222751222236301']
2020-07-18 22:27:51,598 INFO 127.0.0.1 pemda 140197249940784 -> 140197249940688 Decode MTI 0800 Data {7: '0718222751', 11: '222236', 70: '301'} 2020-07-18 22:27:51,598 INFO 127.0.0.1 kota_bogor 140197249940784 -> 140197249940688 Decode MTI 0800 Data {7: '0718222751', 11: '222236', 70: '301'}
2020-07-18 22:27:51,602 INFO 127.0.0.1 pemda 140197249940784 -> 140197249940688 Encode MTI 0810 Data {7: '0718222751', 11: '222236', 39: '00', 70: '301'} 2020-07-18 22:27:51,602 INFO 127.0.0.1 kota_bogor 140197249940784 -> 140197249940688 Encode MTI 0810 Data {7: '0718222751', 11: '222236', 39: '00', 70: '301'}
2020-07-18 22:27:51,602 INFO 127.0.0.1 pemda 140197249940784 ISO8583 to raw [b'081082200000020000000400000000000000071822275122223600301'] 2020-07-18 22:27:51,602 INFO 127.0.0.1 kota_bogor 140197249940784 ISO8583 to raw [b'081082200000020000000400000000000000071822275122223600301']
2020-07-18 22:27:51,603 INFO 127.0.0.1 pemda 140197249940784 Send [b'0058081082200000020000000400000000000000071822275122223600301\x03'] 2020-07-18 22:27:51,603 INFO 127.0.0.1 kota_bogor 140197249940784 Send [b'0058081082200000020000000400000000000000071822275122223600301\x03']
Berikut penjelasannya: Berikut penjelasannya:
...@@ -336,53 +358,140 @@ naikkan angkanya hingga: ...@@ -336,53 +358,140 @@ naikkan angkanya hingga:
Jika salah satu kondisi di atas tercapai maka turunkan nilai ``threads``. Jika salah satu kondisi di atas tercapai maka turunkan nilai ``threads``.
JSON-RPC Log File LinkAja
----------------- -------
Biasanya tahap awal pembuatan web client terjadi kesalahan yang tampak di LinkAja merupakan produk PT Telkom yang berkomunikasi dengan Agratek.
client namun tak nampak di log web server. Untuk mengatasi hal ini lakukan Melanjutkan diagram sebelumnya maka berikut ini alurnya::
penambahan di file konfigurasi ``test-bank.ini`` pada section ``loggers``
sehingga menjadi seperti ini:: +--------------------+
| BJB | +------------------+
+----------------+ | ISO8583 port 10002 | <-----> | Pemda Kota Bogor |
+---------+ | Agratek | <-----> | ISO8583 port 10001 | | +------------------+
| LinkAja | -----> | HTTP port 7001 | | | |
+---------+ +----------------+ | | | +-------------------+
| | +--> | Pemda Kota Bekasi |
+--------+ | | +-------------------+
| Teller | -----> | HTTP port 7000 |
+------- + +--------------------+
Perhatikan kini BJB juga listen di port 10001 untuk berkomunikasi dengan
Agratek menggunakan ISO8583. Sehingga kini daemon bank mendapat julukan
*ISO8583 Forwarder*.
Di terminal ke-2 matikan daemon bank. Tambahkan di file ``test-bank.ini`` baris
berikut ini::
[host_agratek]
ip = 127.0.0.1
port = 10001
listen = true
streamer = bjb
module = opensipkd.iso8583.bjb.pbb.test_aggregator
db_url = postgresql://user:pass@localhost/db
# Routing dari 4 digit awal InvoiceID
host =
3271:kota_bogor
3275:kota_bekasi
Meski ini hanya simulasi namun daemon bank membutuhkan database untuk pemetaan
STAN (bit 11) *payment request* dari Agratek dengan STAN saat ke Pemda. Informasi
ini digunakan saat *reversal request*. Kini buatlah tabelnya::
[loggers] $ ~/env/bin/iso8583_bjb_pbb_test_aggregator_initdb
keys = root, iso8583_web, jsonrpc
Lalu tambahkan section ``logger_jsonrpc`` berikut ini:: Hidupkan lagi daemon-nya::
[logger_jsonrpc] $ ~/env/bin/iso8583 test-bank.ini
level = DEBUG
handlers = console, file
qualname = pyramid_rpc.jsonrpc
Kemudian jalankan lagi daemon-nya. Misalkan client memanggil method ``eco`` Selanjutnya kita siapkan daemon Agratek.
yang seharusnya ``echo`` maka di log akan tampil seperti ini::
2019-02-21 14:00:47,135 DEBUG handling id:0 method:eco Aggregator
2019-02-21 14:00:47,135 DEBUG json-rpc method not found rpc_id:0 "eco" ----------
Dari sisi bank Agratek ini dikategorikan sebagai aggregator. Bila simulasi
aplikasi teller sebelumnya menggunakan format JSON-RPC maka kali ini akan
menggunakan format yang sudah ditentukan LinkAja. Siapkan terminal ke-3.
Modul ``linkaja`` membutuhkan database untuk pencatatan transaksi. Buatlah
database-nya terlebih dahulu. Lalu buatlah file ``test-agratek.ini``::
LinkAja [loggers]
------- keys = root, iso8583_web
Simulasi aplikasi teller sebelumnya menggunakan format JSON-RPC. Kali ini akan
kita coba dengan format yang sudah ditentukan LinkAja (produk PT Telkom). Modul [handlers]
``linkaja`` membutuhkan database untuk pencatatan transaksi. Buatlah keys = console, file
database-nya terlebih dahulu. Lalu tambahkan baris berikut ini di file
``test-bank.ini``:: [formatters]
keys = generic
[logger_root]
level = DEBUG
handlers = console, file
[logger_iso8583_web]
level = DEBUG
handlers =
qualname = iso8583_web
[handler_console]
class = StreamHandler
args = (sys.stderr,)
level = DEBUG
formatter = generic
[handler_file]
class = FileHandler
args = ('/home/sugiana/log/agratek.log', 'a')
level = DEBUG
formatter = generic
[formatter_generic]
format = %(asctime)s %(levelname)s %(message)s
[web]
port = 7001
threads = 12
[web_linkaja] [web_linkaja]
route_path = /linkaja route_path = /linkaja
host = pemda
module = iso8583_web.scripts.views.linkaja module = iso8583_web.scripts.views.linkaja
host = bjb
timeout = 30
db_url = postgresql://user:pass@localhost/db db_url = postgresql://user:pass@localhost/db
allowed_ip = allowed_ip =
127.0.0.1 127.0.0.1
10.8.30.1 10.8.30.1
[host_bjb]
ip = 127.0.0.1
port = 10001
listen = false
timeout = 15
streamer = bjb
module = opensipkd.iso8583.bjb.pbb.agratek
request_bits =
2:622011888888888888
18:6025
22:010
32:015
35:622011888888888888=9912?
37:000000000000
41:AGRATEK
42:LINKAJA
43:AGRATEK-LINKAJA
49:360
59:PAY
60:123
63:214
Buat tabelnya:: Buat tabelnya::
$ ~/env/bin/init_db_linkaja test-bank.ini $ ~/env/bin/init_db_linkaja test-agratek.ini
Jalankan daemon-nya::
$ ~/env/bin/iso8583 test-agratek.ini
Restart daemon-nya, lalu di terminal ke-3 coba inquiry:: Restart daemon-nya. Buka terminal ke-4 dan coba inquiry::
$ ~/env/bin/iso8583_web_client_linkaja --url=http://127.0.0.1:7000/linkaja --invoice-id=3271010001007002701995 $ ~/env/bin/iso8583_web_client_linkaja --url=http://127.0.0.1:7001/linkaja --invoice-id=3271010001007002701995
Hasilnya:: Hasilnya::
...@@ -402,9 +511,6 @@ Hasilnya:: ...@@ -402,9 +511,6 @@ Hasilnya::
2020-07-19 06:21:00.333 Request: {'merchant': 'ldm***1', 'terminal': 'Terminal Name', 'pwd': 'ldm***ss', 'msisdn': '628111234567', 'acc_no': '3271010001007002701995', 'trx_date': '20200719062100', 'trx_type': '022', 'amount': 19536, 'bill_ref': '16', 'trx_id': '0719062100'} 2020-07-19 06:21:00.333 Request: {'merchant': 'ldm***1', 'terminal': 'Terminal Name', 'pwd': 'ldm***ss', 'msisdn': '628111234567', 'acc_no': '3271010001007002701995', 'trx_date': '20200719062100', 'trx_type': '022', 'amount': 19536, 'bill_ref': '16', 'trx_id': '0719062100'}
2020-07-19 06:21:01.056 Response 200: ['00:010123882462:16:'] -> {'Response Code': '00', 'Transaction ID': '010123882462', 'Bill Ref': '16', 'Notification Message': ''} 2020-07-19 06:21:01.056 Response 200: ['00:010123882462:16:'] -> {'Response Code': '00', 'Transaction ID': '010123882462', 'Bill Ref': '16', 'Notification Message': ''}
2020-07-19 06:21:01.061 thread 1 0.717498779296875 detik 00:010123882462:16: 2020-07-19 06:21:01.061 thread 1 0.717498779296875 detik 00:010123882462:16:
2020-07-19 06:21:01.061 Tercepat 00:010123882462:16:
2020-07-19 06:21:01.061 Terlama 00:010123882462:16:
2020-07-19 06:21:01.061 Rerata 0.717498779296875 detik / request
2020-07-19 06:21:01.061 Tidak ada yang gagal 2020-07-19 06:21:01.061 Tidak ada yang gagal
Lagi, pastikan ``Response Code`` bernilai ``00`` yang berarti pembayaran Lagi, pastikan ``Response Code`` bernilai ``00`` yang berarti pembayaran
...@@ -418,12 +524,9 @@ Hasilnya:: ...@@ -418,12 +524,9 @@ Hasilnya::
2020-07-19 06:25:13.546 Request: {'merchant': 'ldm***1', 'terminal': 'Terminal Name', 'pwd': 'ldm***ss', 'msisdn': '628111234567', 'acc_no': '3271010001007002701995', 'trx_date': '20200719062513', 'trx_type': '023', 'amount': 19536, 'bill_ref': '16', 'trx_id': '0719062100'} 2020-07-19 06:25:13.546 Request: {'merchant': 'ldm***1', 'terminal': 'Terminal Name', 'pwd': 'ldm***ss', 'msisdn': '628111234567', 'acc_no': '3271010001007002701995', 'trx_date': '20200719062513', 'trx_type': '023', 'amount': 19536, 'bill_ref': '16', 'trx_id': '0719062100'}
2020-07-19 06:25:14.121 Response 200: ['00::16:'] -> {'Response Code': '00', 'Transaction ID': '', 'Bill Ref': '16', 'Notification Message': ''} 2020-07-19 06:25:14.121 Response 200: ['00::16:'] -> {'Response Code': '00', 'Transaction ID': '', 'Bill Ref': '16', 'Notification Message': ''}
2020-07-19 06:25:14.126 thread 1 0.5694727897644043 detik 00::16: 2020-07-19 06:25:14.126 thread 1 0.5694727897644043 detik 00::16:
2020-07-19 06:25:14.127 Tercepat 00::16:
2020-07-19 06:25:14.127 Terlama 00::16:
2020-07-19 06:25:14.127 Rerata 0.5694727897644043 detik / request
2020-07-19 06:25:14.127 Tidak ada yang gagal 2020-07-19 06:25:14.127 Tidak ada yang gagal
Pastikan ``Response Code`` bernilai ``00`` yang bermakna pembatalan pembayaran Pastikan ``Response Code`` bernilai ``00`` yang bermakna pembatalan pembayaran
berhasil. berhasil. Script ini juga menerima opsi ``--count`` untuk *stress test*.
Selamat mencoba. Selamat mencoba.
...@@ -42,7 +42,7 @@ formatter = generic ...@@ -42,7 +42,7 @@ formatter = generic
format = %(asctime)s %(levelname)s %(message)s format = %(asctime)s %(levelname)s %(message)s
[web] [web]
port = 7000 port = 7001
threads = 12 threads = 12
[web_linkaja] [web_linkaja]
......
...@@ -41,6 +41,18 @@ formatter = generic ...@@ -41,6 +41,18 @@ formatter = generic
[formatter_generic] [formatter_generic]
format = %(asctime)s %(levelname)s %(message)s format = %(asctime)s %(levelname)s %(message)s
[web]
port = 7000
threads = 12
[web_teller]
route_path = /rpc
host = kota_bogor
module = iso8583_web.scripts.view.jsonrpc
allowed_ip =
127.0.0.1
10.8.20.1
[host_agratek] [host_agratek]
ip = 127.0.0.1 ip = 127.0.0.1
port = 10001 port = 10001
......
...@@ -117,9 +117,9 @@ class View: ...@@ -117,9 +117,9 @@ class View:
continue continue
found_conn = conn found_conn = conn
if not found_conn: if not found_conn:
raise Exception(self.not_found_error(name)) raise self.not_found_error(name)
if not found_conn.running: if not found_conn.running:
raise Exception(self.not_running_error(name)) raise self.not_running_error(name)
return found_conn return found_conn
def get_web_conf(self): def get_web_conf(self):
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!