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
--------------
- Di forwarder.py Parser.run() usai job.process() bisa mengirim dokumen ISO8583
......
......@@ -29,6 +29,12 @@ Selanjutnya kita membutuhkan tiga terminal untuk simulasi:
Sebagai Pemda
-------------
Berikut ini diagram komunikasi ISO8583 Pemda dengan BJB::
+----------------+ +-------+
| BJB port 10002 | <-----> | Pemda |
+----------------+ +-------+
Buat file konfigurasi ``test-pemda.ini``::
[loggers]
......@@ -126,10 +132,21 @@ aktif.
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]
keys = root, iso8583_web
keys = root, iso8583_web, jsonrpc
[handlers]
keys = console, file
......@@ -146,6 +163,11 @@ Buka terminal ke-2, dan buat file ``test-bank.ini``::
handlers =
qualname = iso8583_web
[logger_jsonrpc]
level = DEBUG
handlers = console, file
qualname = pyramid_rpc.jsonrpc
[handler_console]
class = StreamHandler
args = (sys.stderr,)
......@@ -161,7 +183,7 @@ Buka terminal ke-2, dan buat file ``test-bank.ini``::
[formatter_generic]
format = %(asctime)s %(levelname)s %(message)s
[host_pemda]
[host_kota_bogor]
ip = 127.0.0.1
port = 10002
listen = true
......@@ -174,7 +196,7 @@ Buka terminal ke-2, dan buat file ``test-bank.ini``::
[web_teller]
route_path = /rpc
host = pemda
host = kota_bogor
module = iso8583_web.scripts.views.jsonrpc
allowed_ip =
127.0.0.1
......@@ -205,8 +227,8 @@ Selanjutnya section ``web_teller``::
[web_teller]
route_path = /rpc
host = pemda
module = iso8583_web.scripts.view.jsonrpc
host = kota_bogor
module = iso8583_web.scripts.views.jsonrpc
allowed_ip =
127.0.0.1
10.8.20.1
......@@ -216,7 +238,7 @@ Bandingkan dengan section yang berawalan ``host_`` yang berarti konfigurasi
untuk ISO8583. Berikut penjelasannya:
* ``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.
* ``module`` merupakan *modul Pyramid* yang akan digunakan untuk menanggapi
*HTTP request*
......@@ -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 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:51,595 INFO 127.0.0.1 pemda 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,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,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 pemda 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,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 kota_bogor 140197249940784 Raw to ISO8583 [b'0800822000000000000004000000000000000718222751222236301']
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 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 kota_bogor 140197249940784 ISO8583 to raw [b'081082200000020000000400000000000000071822275122223600301']
2020-07-18 22:27:51,603 INFO 127.0.0.1 kota_bogor 140197249940784 Send [b'0058081082200000020000000400000000000000071822275122223600301\x03']
Berikut penjelasannya:
......@@ -336,53 +358,140 @@ naikkan angkanya hingga:
Jika salah satu kondisi di atas tercapai maka turunkan nilai ``threads``.
JSON-RPC Log File
-----------------
Biasanya tahap awal pembuatan web client terjadi kesalahan yang tampak di
client namun tak nampak di log web server. Untuk mengatasi hal ini lakukan
penambahan di file konfigurasi ``test-bank.ini`` pada section ``loggers``
sehingga menjadi seperti ini::
LinkAja
-------
LinkAja merupakan produk PT Telkom yang berkomunikasi dengan Agratek.
Melanjutkan diagram sebelumnya maka berikut ini alurnya::
+--------------------+
| 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::
$ ~/env/bin/iso8583_bjb_pbb_test_aggregator_initdb
Hidupkan lagi daemon-nya::
$ ~/env/bin/iso8583 test-bank.ini
Selanjutnya kita siapkan daemon Agratek.
Aggregator
----------
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``::
[loggers]
keys = root, iso8583_web, jsonrpc
keys = root, iso8583_web
Lalu tambahkan section ``logger_jsonrpc`` berikut ini::
[handlers]
keys = console, file
[logger_jsonrpc]
[formatters]
keys = generic
[logger_root]
level = DEBUG
handlers = console, file
qualname = pyramid_rpc.jsonrpc
Kemudian jalankan lagi daemon-nya. Misalkan client memanggil method ``eco``
yang seharusnya ``echo`` maka di log akan tampil seperti ini::
[logger_iso8583_web]
level = DEBUG
handlers =
qualname = iso8583_web
2019-02-21 14:00:47,135 DEBUG handling id:0 method:eco
2019-02-21 14:00:47,135 DEBUG json-rpc method not found rpc_id:0 "eco"
[handler_console]
class = StreamHandler
args = (sys.stderr,)
level = DEBUG
formatter = generic
LinkAja
-------
Simulasi aplikasi teller sebelumnya menggunakan format JSON-RPC. Kali ini akan
kita coba dengan format yang sudah ditentukan LinkAja (produk PT Telkom). Modul
``linkaja`` membutuhkan database untuk pencatatan transaksi. Buatlah
database-nya terlebih dahulu. Lalu tambahkan baris berikut ini di file
``test-bank.ini``::
[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]
route_path = /linkaja
host = pemda
module = iso8583_web.scripts.views.linkaja
host = bjb
timeout = 30
db_url = postgresql://user:pass@localhost/db
allowed_ip =
127.0.0.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::
$ ~/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::
......@@ -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: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 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
Lagi, pastikan ``Response Code`` bernilai ``00`` yang berarti pembayaran
......@@ -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: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.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
Pastikan ``Response Code`` bernilai ``00`` yang bermakna pembatalan pembayaran
berhasil.
berhasil. Script ini juga menerima opsi ``--count`` untuk *stress test*.
Selamat mencoba.
......@@ -42,7 +42,7 @@ formatter = generic
format = %(asctime)s %(levelname)s %(message)s
[web]
port = 7000
port = 7001
threads = 12
[web_linkaja]
......
......@@ -41,6 +41,18 @@ formatter = generic
[formatter_generic]
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]
ip = 127.0.0.1
port = 10001
......
......@@ -117,9 +117,9 @@ class View:
continue
found_conn = conn
if not found_conn:
raise Exception(self.not_found_error(name))
raise self.not_found_error(name)
if not found_conn.running:
raise Exception(self.not_running_error(name))
raise self.not_running_error(name)
return found_conn
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!