Commit 1b23beb6 by Solo Group

vsi

1 parent 05a9fdbd
from importlib import import_module
from opensipkd.base import is_devel
from opensipkd.base.models import Partner, flush_row
from opensipkd.base.tools.api import (auth_from_rpc,
JsonRpcProdukNotFoundError, JsonRpcCustomerNotFoundError,
......@@ -6,7 +8,7 @@ from opensipkd.base.tools.api import (auth_from_rpc,
from opensipkd.pasar.models import Produk, PartnerProduk
from opensipkd.pasar.models.produk import H2hArInvoice, H2hArInvoiceDet, PartnerLog
from pyramid_rpc.jsonrpc import jsonrpc_method
from opensipkd.base.tools import log
from opensipkd.base.tools import log, get_settings
def build_request(typ, vendor_produk, partner_log=None):
......@@ -24,23 +26,62 @@ def build_request(typ, vendor_produk, partner_log=None):
data = cls()
result = data
# dict(data=data)
# result["f_request"] = cls_module.request
# result["f_response"] = cls_module.response
result["result"] = cls_module.result
result["request"] = cls_module.request
result["response"] = cls_module.response
# result["url"] = cls_module.url
else:
log.info("Module %s Not Found" % vendor_produk.modules)
result = dict(error='Fungsi %s tidak ada' % typ,
code=9999)
data = dict(message='Fungsi %s tidak ada' % typ,
code=9999)
result = {"result": data}
# dict(data=)
return result
def get_vendor_produk():
def qry_vendor_produk():
return PartnerProduk.query() \
.join(Partner, Partner.id == PartnerProduk.partner_id) \
.join(Produk, Produk.id == PartnerProduk.produk_id)
def get_vendor_produk(produk_kd, vendor_kd=None, harga=None):
"""
Fungsi ini digunakan untuk mencari vendor yang paling murah
:param produk_kd: String Kode Produk
:param level: Digunakan sebagai parameter jika yang paling murah tidak ditemukan
:vendor_kd: Kode Vendor
:return: row objek dari Partner Produk
"""
### Jika parameter level tidak disebutkan
settings = get_settings()
qry = qry_vendor_produk()
if vendor_kd:
log.info(vendor_kd)
return qry \
.filter(Partner.kode == vendor_kd) \
.filter(Produk.kode == produk_kd).first()
if is_devel():
settings = get_settings()
vend_kd = 'dev_vend_kd' in settings and settings ['dev_vend_kd'] or 'test'
log.info(vend_kd)
return qry \
.filter(Partner.kode == vend_kd) \
.filter(Produk.kode == produk_kd).first()
else:
result = qry \
.filter(Produk.kode == produk_kd).order_by(PartnerProduk.harga)
row = result.filter(PartnerProduk.harga > harga).first()
if not row:
harga = 0
row = result.filter(PartnerProduk.harga > harga).first()
return row
@jsonrpc_method(method='inquiry', endpoint='api-merchant')
def inquiry(request, data, **kwargs):
"""
......@@ -105,12 +146,7 @@ def inquiry(request, data, **kwargs):
if not produk_kd:
raise JsonRpcProdukNotFoundError(message="Produk harus diisi")
# todo: search product lowest price
vend_kd = 'ODEO'
vendor_produk = get_vendor_produk() \
.filter(Partner.kode == vend_kd) \
.filter(Produk.kode == produk_kd).first()
vendor_produk = get_vendor_produk(produk_kd)
if not vendor_produk:
raise JsonRpcProdukNotFoundError(message="Produk %s tidak ditemukan" % produk_kd)
......@@ -222,10 +258,7 @@ def purchase(request, data, **kwargs):
else:
# produk = Produk.query_kode(produk_kd).first()
# todo: search product lowest price
vend_kd = 'ODEO'
vendor_produk = get_vendor_produk() \
.filter(Partner.kode == vend_kd) \
.filter(Produk.kode == produk_kd).first()
vendor_produk = get_vendor_produk(produk_kd)
if not vendor_produk:
prod["status"] = "FAILED"
......
......@@ -4,9 +4,9 @@ import json
import requests
from opensipkd.base import get_settings
from .vendor import VendorClass
from ..vendor import VendorClass
from ..tools import log
from ...tools import log
import urllib3
urllib3.disable_warnings()
......
......@@ -28,9 +28,13 @@ def deferred_satuan(node, kw):
class AddSchema(colander.Schema):
__tablename__ = 'produk'
kode = colander.SchemaNode(
colander.String(),
oid="kode", widget=widget.TextInputWidget()
)
nama = colander.SchemaNode(
colander.String(),
oid="nama ", widget=widget.TextInputWidget()
oid="nama", widget=widget.TextInputWidget()
)
status = colander.SchemaNode(
......
......@@ -83,7 +83,8 @@ from pyramid.view import view_config
from ..tools import get_settings, log, btn_purchase
from ..tools import btn_inquiry, btn_reset, btn_payment, btn_advice, btn_next
from .merchan import build_request, get_vendor_produk
from .merchant import build_request, qry_vendor_produk
class AddSchema(colander.Schema):
customer_id = colander.SchemaNode(
......@@ -116,7 +117,7 @@ class AddSchema(colander.Schema):
)
serial = colander.SchemaNode(
colander.String(), title='REF. NO',
colander.String(), title='Serial',
missing=colander.drop,
oid="serial",
widget=widget.TextInputWidget(css_class="readonly")
......@@ -127,21 +128,21 @@ class AddSchema(colander.Schema):
colander.String(), title='Result',
missing=colander.drop,
oid="result",
widget=widget.TextAreaWidget(rows=10, css_class="readonly")
widget=widget.TextAreaWidget(rows=2, css_class="readonly")
)
f_request = colander.SchemaNode(
colander.String(), title='Request',
missing=colander.drop,
oid="result",
widget=widget.TextAreaWidget(rows=10, css_class="readonly")
widget=widget.TextAreaWidget(rows=2, css_class="readonly")
)
f_response = colander.SchemaNode(
colander.String(), title='Response',
missing=colander.drop,
oid="result",
widget=widget.TextAreaWidget(rows=10, css_class="readonly")
widget=widget.TextAreaWidget(rows=2, css_class="readonly")
)
......@@ -188,7 +189,7 @@ $(document).ready(function(){
});
""")
def get_invoice(values, vendor_produk):
def save_ar_invoice(values, vendor_produk):
invoice = H2hArInvoice.query() \
.filter_by(cust_inv_no=values['cust_inv_no']).first()
if not invoice:
......@@ -208,13 +209,15 @@ def get_invoice(values, vendor_produk):
return invoice_det
def get_log(values, vendor_produk):
def save_partner_log(values, vendor_produk):
partner_log = PartnerLog()
partner_log.vendor_id = vendor_produk.partner_id
partner_log.customer_id = values["customer_id"]
partner_log.produk_id = vendor_produk.produk.id
# partner_log.cust_inv = dat["inv_no"]
partner_log.id_pel = values["id_pel"]
flush_row(partner_log)
return partner_log
......@@ -244,37 +247,47 @@ class ViewHome(BaseView):
values = dict(c.items())
result = None
vendor_produk = get_vendor_produk() \
vendor_produk = qry_vendor_produk() \
.filter(Partner.id == values['vendor_id']) \
.filter(Produk.id == values['produk_id']).first()
if not vendor_produk:
session.flash("Produk tidak ditemukan")
form.render(values)
return dict(form=form, params=form_params_view)
if 'inquiry' in request.POST:
invoice_det = get_log(values, vendor_produk)
invoice_det = save_partner_log(values, vendor_produk)
result = build_request('inquiry', vendor_produk, invoice_det)
elif 'purchase' in request.POST:
invoice_det = get_invoice(values, vendor_produk)
invoice_det = save_ar_invoice(values, vendor_produk)
result = build_request('payment', vendor_produk, invoice_det)
elif 'advice' in request.POST:
invoice_det = save_ar_invoice(values, vendor_produk)
result = build_request('advice', vendor_produk, invoice_det)
elif 'payment' in request.POST:
pass
# invoice_det = get_invoice(values, vendor_produk)
# result = build_request('payment', vendor_produk, invoice_det)
elif 'advice' in request.POST:
invoice_det = get_invoice(values, vendor_produk)
result = build_request('advice', vendor_produk, invoice_det)
elif 'info' in request.POST:
invoice, invoice_det = get_invoice(values, vendor_produk)
result = build_request('info', vendor_produk, invoice)
# elif 'info' in request.POST:
# invoice, invoice_det = save_ar_invoice(values, vendor_produk)
# result = build_request('info', vendor_produk, invoice)
if result:
data = result
log.info(data)
# values['f_request'] = 'f_request' in result \
# and json.dumps(result['f_request'], indent=4) or ''
# values['f_response'] = 'f_response' in result \
# and json.dumps(result['f_response'], indent=4) or ''
#
# values['f_result'] = 'data' in result \
# and json.dumps(result['data'], indent=4) or ''
log.info("Response From Module: %s " % data)
values['f_request'] = 'request' in result \
and json.dumps(result['request'], indent=4) or ''
values['f_response'] = 'response' in result \
and json.dumps(result['response'], indent=4) or ''
values['f_result'] = 'result' in result \
and json.dumps(result['result'], indent=4) or ''
# values['ref_no'] = 'ref_no' in data and data["ref_no"] or ""
# values['trx_id'] = 'trx_id' in data and data['trx_id'] or ""
# values['vend_trx'] = 'vend_trx' in data and data['vend_trx'] or ""
......
......@@ -9,12 +9,13 @@ from opensipkd.base import get_settings
from opensipkd.pasar.models import Partner, PartnerProduk, Produk
from pyramid_rpc.jsonrpc import JsonRpcError
from .vendor import VendorClass
from ..vendor import VendorClass
class Vendor(VendorClass):
def __init__(self, vendor_produk, bill_no, customer_id=None,
cust_trx_id=None, row=None):
def __init__(self, vendor_produk, invoice_det, **kwargs):
#customer_id=None,
# cust_trx_id=None, row=None):
"""
:param produk_kd:
merupakan kode produk versi vendor
......@@ -24,9 +25,10 @@ class Vendor(VendorClass):
:param cid:
merupakan customer id seperti MSN dan atu id pelanggaan
"""
VendorClass.__init__(self, vendor_produk, bill_no, customer_id,
cust_trx_id, row)
settings = self.settings
VendorClass.__init__(self, vendor_produk=vendor_produk,
invoice_det=invoice_det)
#, customer_id, cust_trx_id, row)
settings = get_settings()
self.mid = 'vsi_mid' in settings and settings['vsi_mid'] or None
self.key = 'vsi_key' in settings and settings['vsi_key'] or None
self.url = 'vsi_url' in settings and settings['vsi_url'] or None
......@@ -37,7 +39,7 @@ class Vendor(VendorClass):
return self.auth
def get_params(self, cmd, msn=None, idpel=None, modul=None):
tanggal = datetime.now().strftime('%Y%m%d %H%M%S')
tanggal = datetime.now().strftime('%Y%m%d')
params = dict(
cid=self.mid,
dt=tanggal,
......@@ -45,7 +47,7 @@ class Vendor(VendorClass):
modul=modul,
command=cmd,
resp='XML',
trxid=self.partner_log_id,
trxid=self.invoice_det.id,
)
if msn:
params['msn']=msn
......
BPJS KS MODULE
BPJS KS
1. Inquiry: protokol untuk melakukan pengecekan data tagihan/pembelian REQ :
```buildoutcfg
cid=[CLIENT ID]
modul=gp
command=inq
input1=[IDPEL]
input2=1
input3=
biller=[KODE BILLER]
amount=
trxid=[TRANSAKSI ID]
resp=XML
```
Contoh request :
```buildoutcfg
cid=6ffacfed-6296-11e6-8325- 002590495d2a
dt=20170729
hc=574e57f30a3b86d460da70e56f20e9709bdd5a61e376419a48d8793292ec6eb2
modul=gp
command=inq
input1=888880000100
input2=1
input3=
biller=0060012
amount=
trxid=JRYPEFXTXH
resp=XML
```
Contoh response Sukses:
```xml
<?xml version="1.0"?>
<root>
<status>SUCCESS</status>
<rc>0000</rc>
<rcm>[0] Cek Tagihan Sukses ke:888880000100 refnum:1362F31B7D42455DAE3942E1F0292C02</rcm>
<text>INFORMASI TAGIHAN BPJS KESEHATAN<br/>
ID PEL:888880000100, JML
BLN:1, NO HP:<br/>
EKI HENDRAWANBRATA<br/>
JUMLAH PESERTA : 3<br/>
TAG Rp:255.000<br/>
ADM Rp:2.500<br/>
TOTALRp:257.500<br/>
TOTAL SALDO : 0<br/>
TOTAL PREMI : 255.000<br/>
</text>
<refnum>1362F31B7D42455DAE3942E1F0292C02</refnum>
<input1>888880000100</input1>
<jmltagihan>255000</jmltagihan>
<admin>2500</admin>
<totaltag>257500</totaltag>
<info1>0</info1>
<info2>255000</info2>
<infotext/>
</root>
```
Contoh response Error:
```xml
<?xml version="1.0"?>
<root>
<status>ERROR</status>
<rc>0077</rc>
<rcm>ID ANDA DIBLOK, SILAHKAN HUBUNGI BPJS Kesehatan Terdekat</rcm>
</root>
```
2. Payment
Protokol untuk melakukan pembayaran/pembelian dengan terlebih dahulu
melakukan inquiry REQ :
```buildoutcfg
cid=[CLIENT ID]
modul=gp
command=pay
input1=[IDPEL]
input2=1
input3=
biller=[KODE BILLER]
amount=[TOTAL]
trxid=[TRX
ID]
resp=XML
```
Contoh request :
```buildoutcfg
cid=6ffacfed-6296-11e6-8325- 002590495d2a
dt=20170729
hc=574e57f30a3b86d460da70e56f20e9709bdd5a61e376419a48d8793292ec6eb2
modul=gp
command=pay
input1=888880000100
input2=1
input3=
biller=0060012
amount=257500
trxid=JRYPEFXTXH
resp=XML
```
Contoh response Sukses:
```xml
<?xml version="1.0"?>
<root>
<status>SUCCESS</status>
<rc>0000</rc>
<rcm>[0] Pembayaran Sukses ke:888880000100 refnum:1362F31B7D42455DAE3942E1F0292C02</rcm>
<text>PEMBAYARAN 0060012<br/>
28/08/2017 14:55<br/>
IDPEL:888880000100, JML BLN:1, NO HP:<br/>
EKI HENDRAWANBRATA<br/>
: <br/>
1362F31B7D42455DAE3942E1F0292C02<br/>
TAG Rp:255.000<br/>
ADM Rp:2.500<br/>
TOTAL Rp:257.500<br/>
SUKSES</text>
<refnum>1362F31B7D42455DAE3942E1F0292C02</refnum>
<input1>888880000100</input1>
<jmltagihan>255000</jmltagihan>
<admin>2500</admin>
<totaltag>257500</totaltag>
<info1/>
</root>
```
Contoh response Error:
```xml
<?xml version="1.0"?>
<root>
<status>ERROR</status>
<rc>0013</rc>
<rcm>Jumlah Yang Harus Dibayar Tidak Valid</rcm>
</root>
```
3. Advice
Protokol untuk melakukan pengecekan transaksi dengan input payment refnum REQ :
```
cid=[CLIENTID]
dt=[DATE]
hc=[HASHCODE]
modul=gp
command=adv
input1=[IDPEL]
input2=1
input3=
biller=[KODE
BILLER]
amount=[TOTAL]
trxid=[TRX ID]
resp=xml
```
Contoh request :
```
cid=6ffacfed-6296-11e6-8325- 002590495d2a
dt=20170729
hc=574e57f30a3b86d460da70e56f20e9709bdd5a61e376419a48d8793292ec6eb2
modul=gp
command=adv
input1=8888801260000100
input2=1
input3=
biller=0060012
amount=257500
trxid=APFDQXQWHU
resp=xml
```
Contoh Response Sukses:
```xml
<?xml version="1.0"?>
<root>
<status>SUCCESS</status>
<rc>0000</rc>
<rcm>[0] Pembayaran Sukses ke:8888801260000100 refnum:140E9C17B55641D188E4E010E8741C76</rcm>
<text>PEMBAYARAN 0060012<br/>
28/08/2017 15:09<br/>
IDPEL:8888801260000100, JML BLN:1, NO HP:<br/>
EKI HENDRAWANBRATA<br/>
: <br/>
140E9C17B55641D188E4E010E8741C76<br/>
TAG Rp:255.000<br/>
ADM Rp:2.500<br/>
TOTAL Rp:257.500<br/>
SUKSES</text>
<refnum>140E9C17B55641D188E4E010E8741C76</refnum>
<input1>8888801260000100</input1>
<jmltagihan>255000
</jmltagihan>
<admin>2500</admin>
<totaltag>257500</totaltag>
<info1/>
</root>
```
Contoh response Error:
```xml
<?xml version="1.0"?>
<root>
<status>ERROR</status>
<rc>0013</rc>
<rcm>Jumlah Yang Harus Dibayar Tidak Valid</rcm>
</root>
```
Keterangan:
1. cid = identitas mitra, akan diinfokan ke mitra pada saat test maupun production.
2. dt = tanggal jam transaksi (YYYYMMDD).
3. hc = SHA256(cid+dt+secret key) , secret key dan cid akan diinfokan ke mitra pada saat test maupun production.
4. Semua info/nilai yang diapit oleh {…} wajib diganti dengan nilai yang seharusnya (tanpa mengandung {}).
5. resp merupakan format respon yang diinginkan (XML), secara default jika dikosongkan maka responnya merupakan format plaintext.
6. INPUT 1 : Id Pelanggan
7. INPUT 2 : Jumlah Bulan
8. BILLER merupakan Kode Biller untuk BPJS KS yaitu 0060012
PDAM
==
1. Inquiry
protokol untuk melakukan pengecekan data tagihan/pembelian REQ :
```buildoutcfg
modul=PDAM
command=INQ
idpel=[IDPEL]
biller=[kodebiller]
cid={CLIENTID}
hc=[HASHCODE]
trxid=[TRANSKSI ID]
resp=XML
```
Contoh request :
```buildoutcfg
Modul=PDAM
command=INQ
idpel=51110000100
biller=87001
cid=d9975df3-e982-11e5-bb5c-002590495d2a
dt=20170705
hc=bc919752270f90332baa336b6d50d1e7549616b5bd710239a02a66413d5fa968
trxid=ETYPL400003
resp=XML
```
Contoh response Sukses:
```xml
<?xml version="1.0"?>
<root>
<status>SUCCESS</status>
<rc>0000</rc>
<rcm>[0] Cek Tagihan Sukses ke:51110000100 refnum:BE1D2979288141D595C19C2A2A8ADAA4</rcm>
<text>51110000100
Dmmy'Smltor.Name-511
1 BLN
AGU17
RP TAG PDAM RP 270.100
ADM RP 1.600
TOTAL RP 271.700
</text>
<refnum>BE1D2979288141D595C19C2A2A8ADAA4</refnum>
<idpel>51110000100</idpel>
<name>Dmmy'Smltor.Name51110000100</name>
<totalperiod>1 BLN</totalperiod>
<billperiod>AGU17</billperiod>
<admincharge>1600</admincharge>
<transamount>271700</transamount>
</root>
```
Contoh response Error:
```xml
<?xml version="1.0"?>
<root>
<status>ERROR</status>
<rc>0004</rc>
<rcm>[4] ERROR Biller Tidak terdaftar</rcm>
</root>
```
2. Payment
Protokol untuk melakukan pembayaran/pembelian dengan terlebih dahulu
melakukan inquiry REQ :
```buildoutcfg
modul=PDAM
command=PAY
idpel=[IDPEL]
biller=[KODE BILLER ]
cid=][CLIENT
ID]
dt=20170705
hc=[HASHCODE]=ETYPL400003
resp=XML
```
Contoh:
```buildoutcfg
modul=PDAM
command=PAY
idpel=51110000100
biller=87001
cid=d9975df3-e982-11e5-bb5c- 002590495d2a
dt=20170705
hc=bc919752270f90332baa336b6d50d1e7549616b5bd710239a02a66413d5fa968
trxid=ETYPL400003
resp=XML
```
Contoh request :
```buildoutcfg
modul=PDAM
cid=87ba9xzc-c7ex-8793-c7e5- 0225901955v7
dt=20160405
hc=057db24273f1bf2ffabad292504c2071cd01dd26c1715aec6f261a43bc1b38cb
resp=xml
command=pay
biller=aetra
idpel=201020030762
```
Contoh response Sukses:
```xml
<?xml version="1.0"?>
<root>
<status>SUCCESS</status>
<rc>0000</rc>
<rcm>[0] Pembayaran Sukses ke:51110000100 refnum:2060CB65F35841C99E0B15C1F620D1CE</rcm>
<text>BLN AGU17
RP 271.700,00
ADM RP 1.600
SUKSES</text>
<dt>2017-08-28 14:58:43</dt>
<refnum>2060CB65F35841C99E0B15C1F620D1CE</refnum>
<subid>51110000100</subid>
<name>Dmmy'Smltor.Name51110000100</name>
<subaddress/>
<subsegmen>3A</subsegmen>
<admincharge>1600</admincharge>
<transamount>271700</transamount>
<start>0</start>
<end>0</end>
<billmonth>AGU17</billmonth>
<billpdam>36600</billpdam>
<billtotal>265100</billtotal>
<installment>222500</installment>
<stamp>6000</stamp>
<vat>0</vat>
<danameter>0</danameter>
<penalty>0</penalty>
<info>PT AETRA MENYATAKAN RESI INI MERUPAKAN BUKTI PEMBAYARAN YANG SAH</info>
</root>
```
Contoh response Error:
```xml
<?xml version="1.0"?>
<root>
<status>ERROR</status>
<rc>0004</rc>
<rcm>[4] ERROR Biller Tidak terdaftar</rcm>
</root>
```
PLN - PRE
=========
Inquiry
=======
Parameter
```
modul=PRE
command=INQ
msn={IDPEL/MSN}
cid={CLIENTID}
dt={DTTRX}
hc={HASH}
trxid={UniqueID}
resp=XML
```
Sample MSN untuk PLN prepaid:
```buildoutcfg
7777777
```
Sample MSN untuk PLN postpaid/pasca pak
```buildoutcfg
532210000170
532210000160
532210000151
532210000150
532210000144
```
Contoh response Sukses:
```xml
<?xml version="1.0"?>
<root>
<status>SUCCESS</status>
<rc>0000</rc>
<rcm>[0] CEK TAGIHAN SUKSES ke:88888888888 refnum:D0EE65CAB0C04601878612867541EEA5</rcm>
<text>88888888888
TestDu''mmyP
R2/7000 VA
Token Unsold: 0
Adm 1.600,00
*Denom Belum Termasuk
Admin</text>
<refnum>D0EE65CAB0C04601878612867541EEA5</refnum>
<msn>88888888888</msn>
<idpel>885555555555</idpel>
<nama>TestDu''mmyPanjang8855555</nama>
<tarifdaya>R2/7000</tarifdaya>
<adm>1600</adm>
<jmltokenunsold>0</jmltokenunsold>
</root>
```
Contoh response Error:
```xml
<?xml version="1.0"?>
<root>
<status>ERROR</status>
<rc>0014</rc><rcm>[14] IDPEL YANG ANDA MASUKKAN SALAH, MOHON TELITI KEMBALI. ke:888888888</rcm>
</root>
```
Payment
=======
Protokol untuk melakukan pembayaran/pembelian dengan terlebih dahulu melakukan inquiry
REQ :
```buildoutcfg
modul=PRE
command=PAY
nominal={NOMINAL}
refnum={INQREF}
cid={CLIENTID}
dt={DTTRX}
hc={HASH}
trxid={UniqueID}
resp=XML
```
Contoh response Sukses:
```xml
<?xml version="1.0"?>
<root>
<status>SUCCESS</status>
<rc>0000</rc>
<rcm>[0] PEMBAYARAN SUKSES ke:88888888888 refnum:05062135116139A54A95CCC549DDA94C</rcm>
<text>08/06/16 11:50
05062135116139A54A95CCC549DDA94C
TestDu''mmyP
88888888888
881111111111
R2/6600 VA
RP 201.600
KWH352,0
STROOM/TOKEN 2593 0960 8106 1072 1376
ADM 1.600,00</text>
<tanggal>2016-06-08 11:50:22</tanggal>
<nama>TestDu''mmyPanjang8811111</nama>
<msn>88888888888</msn>
<idpel>881111111111</idpel>
<tarifdaya>R2/6600</tarifdaya>
<nominal>201600</nominal>
<jmlkwh>352</jmlkwh>
<token>2593-0960-8106-1072-1376</token>
<ppn>0</ppn>
<ppj>0</ppj>
<adm>1600</adm>
<angsuran>24000</angsuran>
<materai>0</materai>
</root>
```
Contoh response Error:
```xml
<?xml version="1.0"?>
<root>
<status>ERROR</status>
<rc>0068</rc>
<rcm>[68] TRANSAKSI TIDAK BISA DILAKUKAN SAAT INI,
SILAHKAN LAKUKAN MANUAL ADVICE BEBERAPA SAAT LAGI. ke:233313211212</rcm>
</root>
```
Advice
======
Protokol untuk melakukan pengecekan transaksi dengan input payment refnum
REQ :
```markdown
modul=PRE
command=ADV
nominal={NOMINAL}
refnum={PAYREF}
cid={CLIENTID}
dt={DTTRX}
hc={HASH}&
trxid={UniqueID}
resp=XML
```
Contoh Response Sukses:
```xml
<?xml version="1.0"?>
<root>
<status>SUCCESS</status>
<rc>0000</rc>
<rcm>[0] PEMBAYARAN SUKSES ke:88888888888 refnum:051158BB9F2741AB893DCE972396DB59</rcm>
<text>08/06/16 11:50
05062135116139A54A95CCC549DDA94C
TestDu''mmyP
88888888888
881111111111
R2/6600
RP 201.600
KWH352,0
STROOM/TOKEN 2593 0960 8106 1072 1376
ADM 1.600,00</text>
<tanggal>2016-06-08 11:50:22</tanggal>
<nama>TestDu''mmyPanjang8811111</nama>
<msn>88888888888</msn><idpel>88111111
1111</idpel>
<tarifdaya>R2/6600</tarifdaya>
<nominal>201600</nominal>
<jmlkwh>352</jmlkwh>
<token>2593-0960-8106-1072-1376</token>
<ppn>0</ppn>
<ppj>0</ppj>
<adm>1600</adm>
<angsuran>24000</angsuran>
<materai>0</materai>
</root>
```
Contoh response Error:
```xml
<?xml version="1.0"?>
<root>
<status>ERROR</status>
<rc>0096</rc>
<rcm>[96] ERROR TRANSAKSI TIDAK DITEMUKAN ke:23331321121</rcm>
</root>
```
Auto Payment
============
protokol untuk melakukan pembayaran/pembelian dengan tanpa melakukan inquiry
REQ :
```buildoutcfg
modul=PRE
command=PAY
msn={22222222222}
nominal={NOMINAL}
cid={CLIENTID}
dt={DTTRX}
hc={HASH}
trxid={UniqueID}
resp=XML
```
Contoh Response Sukses:
```xml
<?xml version="1.0"?>
<root>
<status>SUCCESS</status>
<rc>0000</rc>
<rcm>[0] PEMBAYARAN SUKSES ke:88888888888 refnum:05062135116139A54A95CCC549DDA94C</rcm>
<text>08/06/16 11:50
05062135116139A54A95CCC549DDA94C
TestDu''mmyP
88888888888
881111111111
R2/6600 VA
RP 201.600
KWH352,0
STROOM/TOKEN 2593 0960 8106 1072 1376
ADM 1.600,00</text>
<tanggal>2016-06-08 11:50:22</tanggal>
<nama>TestDu''mmyPanjang8811111</nama>
<msn>88888888888</msn>
<idpel>881111111111</idpel>
<tarifdaya>R2/6600</tarifdaya>
<nominal>201600</nominal>
<jmlkwh>352</jmlkwh>
<token>2593-0960-8106-1072-51376</token>
<ppn>0</ppn>
<ppj>0</ppj>
<adm>1600</adm>
<angsuran>24000</angsuran>
<materai>0</materai>
</root>
```
Contoh response Error:
```xml
<?xml version="1.0"?>
<root>
<status>ERROR</status>
<rc>0068</rc>
<rcm>[68] TRANSAKSI TIDAK BISA DILAKUKAN SAAT INI,
SILAHKAN LAKUKAN MANUAL ADVICE BEBERAPA SAAT LAGI. ke:233313211212</rcm>
</root>
```
5. Advice Tanpa PAYREF: protokol untuk melakukan pengecekan transaksi tanpa input payment refnum
REQ :
```buildoutcfg
modul=PRE
command=ADV
msn={22222222222}
nominal={NOMINAL}
cid={CLIENTID}
dt={DTTRX}&hc={HASH}
trxid={UniqueID}
resp=XML
```
Contoh Response:
```xml
<?xml version="1.0"?>
<root>
<status>SUCCESS</status>
<rc>0000</rc>
<rcm>[0] PEMBAYARAN SUKSES ke:88888888888 refnum:051158BB9F2741AB893DCE972396DB59</rcm>
<text>08/06/16 11:50
05062135116139A54A95CCC549DDA94C
TestDu''mmyP
88888888888
881111111111
R2/6600
RP 201.600
KWH352,0
STROOM/TOKEN 2593 0960 8106 1072 1376 6
ADM 1.600,00</text>
<tanggal>2016-06-08 11:50:22</tanggal>
<nama>TestDu''mmyPanjang8811111</nama>
<msn>88888888888</msn>
<idpel>881111111111</idpel>
<tarifdaya>R2/6600</tarifdaya>
<nominal>201600</nominal>
<jmlkwh>352</jmlkwh>
<token>2593-0960-8106-1072-1376</token>
<ppn>0</ppn>
<ppj>0</ppj>
<adm>1600</adm>
<angsuran>24000</angsuran>
<materai>0</materai>
</root>
```
Contoh response Error:
```xml
<?xml version="1.0"?>
<root>
<status>ERROR</status>
<rc>0096</rc>
<rcm>[96] ERROR TRANSAKSI TIDAK DITEMUKAN ke:23331321121</rcm>
</root>
```
PLN-PASCA
=========
Inquiry:
protokol untuk melakukan pengecekan data tagihan/pembelian REQ :
```buildoutcfg
cid={CLIENTID}
dt={DATE}
hc={HASHCODE}
modul=pln
command=INQ
idpel={IDPELANGGAN}
resp=XML
trxid={IDTRANSAKSI}
```
Contoh response Sukses:
```xml
<?xml version="1.0"?>
<root>
<status>SUCCESS</status>
<rc>0000</rc>
<rcm>[0] CEK TAGIHAN SUKSES ke:532110000060 refnum:33ECE3543E62474AA0C6C3147D94A31D</rcm>
<text>532110000060
DU'MMY-VSI-532110000
1 BLN
JUN16
RP TAG PLN RP 887.817
ADM RP 1.600
TOTAL RP 890.929
</text>
<refnum>33ECE3543E62474AA0C6C3147D94A31D</refnum>
<idpel>532110000060</idpel>
<nama>DU'MMY-VSI-532110000060</nama>
<bulan>1 BLN</bulan>
<blntagihan>JUN16</blntagihan>
<admin>1600</admin>
<tagihan>889329</tagihan>
<total>890929</total>
</root>
```
Contoh response Error:
```xml
<?xml version="1.0"?>
<root>
<status>ERROR</status>
<rc>0014</rc>
<rcm>[14] IDPEL YANG ANDA MASUKKAN SALAH, MOHON TELITI KEMBALI.</rcm>
</root>
```
Payment
=======
Protokol untuk melakukan pembayaran/pembelian dengan terlebih dahulu melakukan inquiry
REQ :
```buildoutcfg
cid={CLIENTID}
dt={DATE}
hc={HASHCODE}
modul=pln
command=PAY
idpel={IDPELANGGAN}
resp=XML
trxid={IDTRANSAKSI}
```
Contoh response Sukses:
```xml
<?xml version="1.0"?>
<root>
<status>SUCCESS</status>
<rc>0000</rc>
<rcm>[0] PEMBAYARAN SUKSES ke:532110000060 refnum:0506213515100D3399B27293E3DBC535</rcm>
<text>22/06/16 14:29
0506213515100D3399B27293E3DBC535
532110000060
3
DU'MMY-VSI-532110000
R1/450
BLN JUN16
RP 887.729
ADM RP 1.600
TOTAL RP 890.929
SUKSES</text>
<date>2016-06-22 14:29:25</date>
<refnum>0506213515100D3399B27293E3DBC535</refnum>
<idpel>532110000060</idpel>
<nama>DU'MMY-VSI-532110000060</nama>
<segmenpower>R1/450</segmenpower>
<startend>888800-889900</startend>
<blntagihan>JUN16</blntagihan>
<ppn>0</ppn>
<denda>0</denda>
<totaltagihanpln>887729</totaltagihanpln>
<admin>1600</admin>
<total>890929</total>
<info1>Informasi Hubungi Call Center: 123 Atau Hub. PLN Terdekat:</info1>
<info2>Terima Kasih</info2>
</root>
```
Contoh response Error:
```xml
<?xml version="1.0"?>
<root>
<status>ERROR</status>
<rc>0088</rc>
<rcm>[88] TAGIHAN SUDAH TERBAYAR</rcm>
</root>
```
\ No newline at end of file
1. Inquiry: protokol untuk melakukan pengecekan data pembelian
REQ :
```buildoutcfg
cid={CLIENT_ID}
dt={DATE}
hc={HASHCODE}
modul=ISI
command=INQ
tujuan=nomor
voucherid={VOUCHERID}
trxid={TRXID}
resp=XML
```
Contoh request :
```buildoutcfg
cid=btsp6ffacfed-6293-11e6-8325-002590495dna
dt=20180723
hc=a85a020f3896298140c99a8509afcfad6272a717cc2aba8f842e68485e0a2642
modul=ISI
command=INQ
tujuan=08572120002
voucherid=TN25
trxid=xxx1
resp=XML
```
RESP :
STATUS#RC#RCMESSAGE ke: MSN/IDPEL refnum: INQREF#RESPTEXT#REFNUM#VOUCHERID#DESTNUM#NOMINAL
Contoh response Sukses:
<?xml version="1.0"?>
<root>
<status>SUCCESS</status>
<rc>0000</rc>
<rcm>0000</rcm>
<text>[0] Cek Tagihan Sukses ke:628523123789</text>
<refnum>Cek pulsa TN5 berhasil dengan nominal 5.000, refnum 4DB3DC0A2539419F8C50000000000000</refnum>
<voucherid>4DB3DC0A2539419F8C50000000000000</voucherid>
<destnum>TN5</destnum>
<nominal>628523123789</nominal>
</root>
Contoh response Error:
ERROR#0053#[53] ERROR Produk tidak ditemukan
2. Auto Payment
Protokol untuk melakukan pembayaran/pembelian tanpa harus melakukan inquiry
terlebih dahulu REQ :
```buildoutcfg
cid={CLIENT_ID}
dt={DATE}
hc={HASHCODE}
modul=ISI
command=PAY
tujuan=nomor
voucherid={VOUCHERID}
trxid={TRXID}
resp=XML
```
Contoh request :
```buildoutcfg
cid=btsp6ffacfed-6293-11e6-8325-002590495dna
dt=20180723
hc=a85a020f3896298140c99a8509afcfad6272a717cc2aba8f842e68485e0a2642
modul=ISI
command=PAY
tujuan=08572120002
voucherid=TN25
trxid=xxx1
resp=XML
```
RESP : STATUS#RC#RCMESSAGE ke: TUJUAN #RESPTEXT#DT#REFNUM#VOUCHERID#NOMINAL#SERIALNUMBER
Contoh response Sukses:
```xml
<?xml version="1.0"?>
<root>
<status>SUCCESS</status>
<rc>0000</rc>
<rcm>0000</rcm>
<text>[0] Pembayaran Sukses ke:08527778889</text>
<date>Isi pulsa TN10 berhasil untuk nomor 628527778889 sebesar 10.000, refnum F148919BB5F4093A0F40000000000000 pada tgl 17/04/17 15:40</date>
<refnum>2017-04-17 15:40:28</refnum>
<voucherid>47C6DEFB60A34939B18DDBE2FE86D5D3</voucherid>
<destnum>TN10</destnum>
<nominal>628527778889</nominal>
<serial>10000</serial>
</root>
```
Contoh response Error:
ERROR#0056#[56] Nomor Telpon tidak diketahui
3. Advice
Protokol untuk melakukan pengecekan transaksi dengan input payment refnum REQ :
```buildoutcfg
cid={CLIENT_ID}
dt={DATE}
hc={HASHCODE}
modul=ISI
command=ADV
tujuan=nomor
voucherid={VOUCHERID}
trxid={TRXID}
resp=XML
```
Contoh request :
```buildoutcfg
cid=btsp6ffacfed-6293-11e6-8325-002590495dna
dt=20180723
hc=a85a020f3896298140c99a8509afcfad6272a717cc2aba8f842e68485e0a2642
modul=ISI
command=ADV
tujuan=08572120002
voucherid=TN25
trxid=xxx1
resp=XML
```
RESP :
STATUS#RC#RCMESSAGE ke: TUJUAN #RESPTEXT#DT#REFNUM#VOUCHERID#NOMINAL#SERIALNUMBER
Contoh Response Sukses:
```xml
<?xml version="1.0"?>
<root>
<status>SUCCESS</status>
<rc>0000</rc>
<rcm>0000</rcm>
<text>[0] Pembayaran Sukses</text>
<date>Isi pulsa TN10 berhasil untuk nomor 628527778889 sebesar 10.000, refnum F148919BB5F4093A0F40000000000000 pada tgl 17/04/17 15:32</date>
<refnum>2017-04-17 15:40:28</refnum>
<voucherid>4A61D574138A2D6B4B6 </voucherid>
<destnum>TN10</destnum>
<nominal>10000</nominal>
<serial>4A61D574138A2D6B4B6 </serial>
</root>
```
Contoh response Error:
ERROR#0051# [51] ERROR Transaksi Gagal dari Mesin Vending
4. Info
Protokol untuk melakukan pengecekan informasi produk dan harga
REQ :
```buildoutcfg
cid={CLIENT_ID}
dt={DATE}
hc={HASHCODE}
resp={XML}
command=INFO
voucherid={VOUCHERID1, VOUCHERID2}
tujuan={NO TUJUAN}
```
Contoh request :
```buildoutcfg
cid=87ba9xzc-c7ex-8793-c7e5-0225901955v7
dt=20160405
hc=057db24273f1bf2ffabad292504c2071cd01dd26c1715aec6f261a43bc1b38cb
resp=xml
command=info
voucherid=TN10
tujuan=08527778889
```
RESP : STATUS#RC#RESPTEXT
Contoh Response Sukses:
```xml
<?xml version="1.0"?>
<root>
<status>SUCCESS</status>
<rc>0000</rc>
<rcm>0000</rcm>
<text>INFO HARGA: TN10(TELKOMSEL AS/SIMPATI 10):Rp. 11.325 *Belum termasuk margin agen</text>
</root>
```
Contoh response Error:
ERROR#0053#[53] ERROR Produk tidak ditemukan
5. Respon Sukses Diantrikan : Menunggu Respon Biller. XML :
```xml
<?xml version="1.0"?>
<root>
<status>SUCCESS</status>
<rc>0000</rc>
<rcm>[1000] PEMBAYARAN SUKSES DIANTRIKAN ke:085934111000</rcm>
<text>Isi pulsa TN25 berhasil untuk nomor 6285934111000 sebesar 25.000, refnum 3D5C50E06B5ED9AAB7B0000000000000 pada tgl 18/09/18 15:07</text>
<date>2018-09-18 15:07:33</date>
<refnum>DACC5EAC69EC4049AD4129C20E294C06</refnum>
<voucherid>TN25</voucherid>
<destnum>6285934111000</destnum>
<nominal>25000</nominal>
<serial/>
</root>
```
5. Callback
http://mitra.url/callback?
```buildoutcfg
user_id=DEF56C3E6E3B4B6EBF88015AC25D3BFE
trxid=2134
status=S
dt=2018-09-24 10:22:23
info=ID: 2134 TN5 ke 6285334111000 SUKSES SN= 123423123 2018-09-24%2010:22:23;
```
......@@ -9,7 +9,7 @@ from opensipkd.base import get_settings
from opensipkd.pasar.models import Partner, PartnerProduk, Produk
from pyramid_rpc.jsonrpc import JsonRpcError
from .vsi import Vendor as VendorClass
from . import Vendor as VendorClass
class Vendor(VendorClass):
......
......@@ -290,28 +290,61 @@ Pembayaran Sukses
import requests
import xmltodict
from .vsi import Vendor as VendorClass
from . import Vendor as VendorClass
from opensipkd.base.tools import log
class Vendor(VendorClass):
def pars_data(self, data):
"""
:param data:
:return:
"data": [{
"nopel": "530678910981",
"nama": "SUBCRIBER NAME",
"refno": "25641544",
"rincian":{
"pokok": 300000,
"denda": 0,
"admin": 2500,
"tarif": "R1\/1300VA",
"no_meter": "530678910012",
"power": "1300VA"
},
"subtotal": 302500,
"discount": 800,
"total": 301700
}]
}
"""
return {
"bill_no": "subid" in data and data["subid"] or self.bill_no,
"nama": "nama" in data and data["nama"] or "NO-NAME",
"nopel": "subid" in data and data["subid"] or self.id_pel,
"nama": "nama" in data and data["nama"] or "NO-NAME",
"rincian":{
"pokok": "tagihan" in data and data["tagihan"] or 0,
"denda": "denda" in data and data["denda"] or 0,
"admin": "admin" in data and data["admin"] or 0,
"total": "total" in data and data["total"] or 0,
"tarif": "tarif" in data and data["tarif"] or "",
"ppn": "ppn" in data and data["ppn"] or 0,
"trx_id": "trxid" in data and data["trxid"] or self.partner_log_id,
"ref_no": "refnum" in data and data["refnum"] or "",
"jml_bulan": "bulan" in data and data["bulan"] or "",
"tgh_bulan": "blth" in data and data["blth"] or "",
"tarif": "tarif" in data and data["tarif"] or "",
"tgl_bayar" : "date" in data and data["date"] or "",
"info" : "info1" in data and data["info1"] or "",
"stand_meter" : "standmeter" in data and data["standmeter"] or "",
}
"no_meter": "standmeter" in data and data["standmeter"] or "",
# "tgh_bulan": "blth" in data and data["blth"] or "",
# "tgl_bayar": "date" in data and data["date"] or "",
# "info": "info1" in data and data["info1"] or "",
},
"trx_id": "trxid" in data and data["trxid"] or self.invoice_det.id,
"jml_bulan": "bulan" in data and data["bulan"] or "",
"subtotal": 302500,
"discount": 800,
"total": "total" in data and data["total"] or 0,
}
def save_response(self, data, typ="inquiry"):
self.response = data
log.info("VSI PLN PRE Response: %s", data)
self.save_log(typ)
return data
def inquiry(self):
"""
......@@ -374,30 +407,44 @@ class Vendor(VendorClass):
default jika dikosongkan maka responnya merupakan format plaintext.
"""
params = self.get_params(cmd='INQ', modul='PRE')
params["msn"] = self.bill_no
params["msn"] = self.id_pel
# params["voucherid"] = self.v_produk_kd
self.request = params
self.save_log('inquiry')
params['trxid'] = self.partner_log_id
result = requests.get(self.url, params=params)
if result.ok:
data = xmltodict.parse(result.text)["root"]
params['trxid'] = self.invoice_det.id
log.info("VSI PLN PRE Request: %s", params)
try:
resp = requests.get(self.url, params=params)
except requests.exceptions.RequestException as e:
data = dict(message = e.strerror,
code = e.errno)
return self.save_response(data)
if resp and resp.ok:
data = xmltodict.parse(resp.text)["root"]
elif resp:
data = dict(message=resp.text,
code=resp.status_code)
else:
data = dict(error=result.text,
code=result.status_code)
data = dict(message="No Response From Biller ",
code=500)
return self.save_response(data)
self.response = data
self.save_log('inquiry')
if "status" in data and data["status"] and data["status"] == "SUCCESS":
# data = self.pars_data(data)
pass
data.update(dict(message="SUCCESS",
code=0))
elif "status" in data and data["status"] and data["status"] == "ERROR":
#todo: apakah data akan dimapping errornya?
data = dict(error=data["rcm"],
code=data["rc"])
data.update(dict(message=data["rcm"],
code=data["rc"]))
# else:
# data.update(dict(message="Other Error",
# code=500))
return data
return self.save_response(data)
def payment(self):
"""
......@@ -457,11 +504,11 @@ class Vendor(VendorClass):
# todo: apakah harus di cek dulu data inquirynya
self.save_log('payment')
params['trxid'] = self.partner_log_id
result = requests.get(self.url, params=params)
if result.ok:
data = xmltodict.parse(result.text)["root"]
resp = requests.get(self.url, params=params)
if resp.ok:
data = xmltodict.parse(resp.text)["root"]
else:
data = dict(error=result.status_code)
data = dict(error=resp.status_code)
self.response = data
self.save_log('payment')
if "status" in data and data["status"] and data["status"] == "SUCCESS":
......
......@@ -73,213 +73,61 @@ Contoh response Error:
ERROR#0056#[56] Nomor Telpon tidak diketahui
"""
# 3. Advice: protokol untuk melakukan pengecekan transaksi dengan input payment refnum
"""
REQ :
cid={CLIENT_ID}
dt={DATE}
hc={HASHCODE}
modul=ISI
command=ADV
tujuan=nomor
voucherid={VOUCHERID}
trxid={TRXID}
resp=XML
Contoh request :
cid=btsp6ffacfed-6293-11e6-8325-002590495dna
dt=20180723
hc=a85a020f3896298140c99a8509afcfad6272a717cc2aba8f842e68485e0a2642
modul=ISI
command=ADV
tujuan=08572120002
voucherid=TN25
trxid=xxx1
resp=XML
RESP :
STATUS#RC#RCMESSAGE ke: TUJUAN #RESPTEXT#DT#REFNUM#VOUCHERID#NOMINAL#SERIALNUMBER
Contoh Response Sukses:
<?xml version="1.0"?>
<root>
<status>SUCCESS</status>
<rc>0000</rc>
<rcm>0000</rcm>
<text>[0] Pembayaran Sukses</text>
<date>Isi pulsa TN10 berhasil untuk nomor 628527778889 sebesar 10.000, refnum
F148919BB5F4093A0F40000000000000 pada tgl 17/04/17 15:32</date>
<refnum>2017-04-17 15:40:28</refnum>
<voucherid>4A61D574138A2D6B4B6 </voucherid>
<destnum>TN10</destnum>
<nominal>10000</nominal>
<serial>4A61D574138A2D6B4B6 </serial>
</root>
Contoh response Error:
ERROR#0051# [51] ERROR Transaksi Gagal dari Mesin Vending
"""
# 4. Info : protokol untuk melakukan pengecekan informasi produk dan harga
"""
REQ :
cid={CLIENT_ID}
dt={DATE}
hc={HASHCODE}
resp={XML}
command=INFO
voucherid={VOUCHERID1,VOUCHERID2}
tujuan={NO TUJUAN}
Contoh request :
cid=87ba9xzc-c7ex-8793-c7e5-0225901955v7
dt=20160405
hc=057db24273f1bf2ffabad292504c2071cd01dd26c1715aec6f261a43bc1b38cb
resp=xml
command=info
voucherid=TN10
tujuan=08527778889
RESP :
STATUS#RC#RESPTEXT
Contoh Response Sukses:
<?xml version="1.0"?>
<root>
<status>SUCCESS</status>
<rc>0000</rc>
<rcm>0000</rcm>
<text>INFO HARGA:
TN10(TELKOMSEL AS/SIMPATI 10):Rp. 11.325
*Belum termasuk margin agen</text>
</root>
Contoh response Error:
ERROR#0053#[53] ERROR Produk tidak ditemukan
"""
# 5. Respon Sukses Diantrikan : Menunggu Respon Biller.
"""
XML :
<?xml version="1.0"?>
<root>
<status>SUCCESS</status>
<rc>0000</rc>
<rcm>[1000] PEMBAYARAN SUKSES DIANTRIKAN ke:085934111000</rcm>
<text>
Isi pulsa TN25 berhasil untuk nomor 6285934111000 sebesar 25.000, refnum
3D5C50E06B5ED9AAB7B0000000000000 pada tgl 18/09/18 15:07</text>
<date>2018-09-18 15:07:33</date>
<refnum>DACC5EAC69EC4049AD4129C20E294C06</refnum>
<voucherid>TN25</voucherid>
<destnum>6285934111000</destnum>
<nominal>25000</nominal>
<serial></serial>
</root>
"""
# 6. Callback :
"""
http://mitra.url/callback?user_id=DEF56C3E6E3B4B6EBF88015AC25D3BFE&trxid=2134&status=S&dt=201
8-09-24%2010%3A22%3A23&info=ID%3A%202134%20TN5%20ke%206285334111000%20SUKSES%20SN%3A%20123423123%2
0%402018-09-24%2010%3A22%3A23;
http://mitra.url/callback?
user_id=DEF56C3E6E3B4B6EBF88015AC25D3BFE
trxid=2134
status=S
dt=2018-09-24 10:22:23
info=ID: 2134 TN5 ke 6285334111000 SUKSES SN: 123423123 @2018-09-24 10:22:23;
user_id : client ID
trxid : transaction ID
status : S = sukses, R= Refund (gagal)
dt : tanggal format YYYY-mm-dd hh:ii:ss contoh diatas 2018-09-24 10:22:23
info: informasi, ID: 2134 TN5 ke 6285334111000 SUKSES SN: 123423123 @2018-09-24 10:22:23
"""
# Keterangan:
"""
1. cid = identitas mitra, akan diinfokan ke mitra pada saat test maupun produkion
2. dt = tanggal transaksi (YYYYMMDD)
3. hc = SHA256(cid+dt+secret key) , secret key dan cid akan diinfokan ke mitra pada saat test maupun produkion
4. STATUS berisi status response SUCCESS atau ERROR
5. RCMESSAGE adalah Pesan Transaksi
6. RESPTEXT dan data lainnya akan ada jika STATUS=SUCCESS
7. \n di RESPTEXT adalah garis baru
8. Semua info/nilai yang diapit oleh {…}wajib diganti dengan nilai yang seharusnya (tanpa mengandung {}).
9. trxid merupakan unique id dari mitra per transaksi dengan panjang maksimum 50 character
"""
# Pesan Transaksi :
"""
Pembayaran Sukses
[4] ERROR Biller Tidak terdaftar
[5] ERROR Lainnya
[6] ERROR Sentral diblok
[7] ERROR PPID diblok
[8] ERROR Waktu akses tidak valid
[9] ERROR Akun tidak aktif
[11] ERROR NEED TO SIGN ON
[12] ERROR Tidak bisa dibatalkan
[13] ERROR Nilai Transaksi tidak valid
[14] ERROR ID Tidak Terdaftar
[15] ERROR No Meter Tidak Terdaftar
[16] ERROR PRR SUBSCRIBER
[17] ERROR ID Punya Tunggakan
[18] ERROR Permintaan Sedang diproses
[26] Quota Transaksi Agen Tidak Mencukupi. Silahkan Kontak Agen.
[29] ERROR Kode Hash tidak valid
[30] ERROR Pesan tidak valid
[31] ERROR Kode Bank tidak terdaftar
[32] ERROR Sentral tidak terdaftar
[33] ERROR Produk tidak terdaftar
[34] ERROR PPID Tidak terdaftar
[35] ERROR Akun Tidak Terdaftar
[41] ERROR Nilai Transaksi dibawah Nilai Minimum
[42] ERROR Nilai Transaksi diatas Nilai Maximum
[43] ERROR Daya Baru Lebih Kecil dari Daya Sekarang
[44] ERROR Nilai Daya Tidak Valid
[45] ERROR Nilai Biaya Administrasi Tidak Valid
[46] ERROR Deposit Tidak Mencukupi
[47] ERROR Diluar Batas KWH
[48] ERROR Permintaan sudah kadaluarsa
[51] ERROR Transaksi Gagal dari Mesin Vending
[52] ERROR Transaksi dipending dari Mesin Vending
[53] ERROR Produk tidak ditemukan
[54] ERROR Jawaban dari Biller Tidak ditemukan
[55] ERROR Lainnya Mesin Vending
[56] ERROR Nomor Telpon Tidak diketahui
[63] ERROR Tidak ada Pembayaran
[60] ERROR Akun sudah didaftarkan
[67] ERROR CANNOT CONNECT
[68] ERROR Timeout
[69] ERROR Sertifikat tidak dikenal
[70] ERROR Timeout tidak refund
[72] ERROR Permintaan tidak mungkin dilayani
[73] ERROR Request dipending di Biller
[77] ERROR Id di suspend
[88] ERROR Tagihan sudah dibayar
[89] ERROR Tagihan tidak tersedia
[90] ERROR sedang proses CUT OFF
[91] ERROR Database
[92] ERROR Nomor Referensi Switching tidak ditemukan
[93] ERROR Nomor Referensi Switching tidak valid
[94] ERROR Pembatalan sudah dilakukan
[95] ERROR Kode Merchant tidak terdaftar
[96] ERROR Transaksi tidak ditemukan
[97] ERROR SW BANK Tidak identik
[98] ERROR Nomor Referensi Switching tidak valid
[146] ERROR di servis deposit"""
import requests
import xmltodict
from ..tools import log
from .vsi import Vendor as VendorClass
# todo: result harus distandarisasi
class Vendor(VendorClass):
def pars_data(self, data):
"""
<status>SUCCESS</status>
<rc>0000</rc>
<rcm>0000</rcm>
<text>[0] Pembayaran Sukses</text>
<date>Isi pulsa TN10 berhasil untuk nomor 628527778889 sebesar 10.000, refnum F148919BB5F4093A0F40000000000000 pada tgl 17/04/17 15:32</date>
<refnum>2017-04-17 15:40:28</refnum>
<voucherid>4A61D574138A2D6B4B6 </voucherid>
<destnum>TN10</destnum>
<nominal>10000</nominal>
<serial>4A61D574138A2D6B4B6 </serial>
:return:
"""
result = dict(
status="status" in data and data["status"] or "FAILED",
code="rc" in data and int(data["rc"]) or 0,
message="rcm" in data \
and (data["rcm"] == "00000" and "Sukses" or data["rcm"]) \
or "PENDING",
serial_number="voucherid" in data and data["voucherid"] or ""
)
return result
def inquiry(self):
params = self.get_params(cmd='INQ', modul='ISI')
params["tujuan"] = self.cid
params["voucherid"] = self.produk_kd
params["tujuan"] = self.id_pel
params["voucherid"] = self.invoice_det.produk.kode
self.request = params
row = self.save_log('inquiry')
result = requests.get(self.url, params=params)
if result.ok:
data = xmltodict.parse(result.text)["root"]
else:
data = dict(error=result.status_code)
self.save_log('inquiry')
log.info("VSI PULSA Request: %s %s" % (self.url, self.request))
try:
result = requests.get(self.url, params=params)
if result.ok:
data = xmltodict.parse(result.text)["root"]
else:
data = dict(code=result.status_code,
message=result.text)
except requests.exceptions.RequestException as e:
data = dict(code=e.errno,
message=e.strerror)
self.response = data
self.save_log('inquiry', row)
self.result = self.pars_data(data)
self.save_log('inquiry')
return data
def payment(self):
......@@ -291,6 +139,7 @@ class Vendor(VendorClass):
self.response = data
else:
data = dict(error=result.status_code)
self.save_log('payment')
return data
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!