Commit 1b23beb6 by Solo Group

vsi

1 parent 05a9fdbd
from importlib import import_module from importlib import import_module
from opensipkd.base import is_devel
from opensipkd.base.models import Partner, flush_row from opensipkd.base.models import Partner, flush_row
from opensipkd.base.tools.api import (auth_from_rpc, from opensipkd.base.tools.api import (auth_from_rpc,
JsonRpcProdukNotFoundError, JsonRpcCustomerNotFoundError, JsonRpcProdukNotFoundError, JsonRpcCustomerNotFoundError,
...@@ -6,7 +8,7 @@ from opensipkd.base.tools.api import (auth_from_rpc, ...@@ -6,7 +8,7 @@ from opensipkd.base.tools.api import (auth_from_rpc,
from opensipkd.pasar.models import Produk, PartnerProduk from opensipkd.pasar.models import Produk, PartnerProduk
from opensipkd.pasar.models.produk import H2hArInvoice, H2hArInvoiceDet, PartnerLog from opensipkd.pasar.models.produk import H2hArInvoice, H2hArInvoiceDet, PartnerLog
from pyramid_rpc.jsonrpc import jsonrpc_method 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): def build_request(typ, vendor_produk, partner_log=None):
...@@ -24,23 +26,62 @@ def build_request(typ, vendor_produk, partner_log=None): ...@@ -24,23 +26,62 @@ def build_request(typ, vendor_produk, partner_log=None):
data = cls() data = cls()
result = data result = data
# dict(data=data) # dict(data=data)
# result["f_request"] = cls_module.request result["result"] = cls_module.result
# result["f_response"] = cls_module.response result["request"] = cls_module.request
result["response"] = cls_module.response
# result["url"] = cls_module.url # result["url"] = cls_module.url
else: else:
log.info("Module %s Not Found" % vendor_produk.modules) log.info("Module %s Not Found" % vendor_produk.modules)
result = dict(error='Fungsi %s tidak ada' % typ, data = dict(message='Fungsi %s tidak ada' % typ,
code=9999) code=9999)
result = {"result": data}
# dict(data=) # dict(data=)
return result return result
def get_vendor_produk(): def qry_vendor_produk():
return PartnerProduk.query() \ return PartnerProduk.query() \
.join(Partner, Partner.id == PartnerProduk.partner_id) \ .join(Partner, Partner.id == PartnerProduk.partner_id) \
.join(Produk, Produk.id == PartnerProduk.produk_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') @jsonrpc_method(method='inquiry', endpoint='api-merchant')
def inquiry(request, data, **kwargs): def inquiry(request, data, **kwargs):
""" """
...@@ -105,12 +146,7 @@ def inquiry(request, data, **kwargs): ...@@ -105,12 +146,7 @@ def inquiry(request, data, **kwargs):
if not produk_kd: if not produk_kd:
raise JsonRpcProdukNotFoundError(message="Produk harus diisi") raise JsonRpcProdukNotFoundError(message="Produk harus diisi")
# todo: search product lowest price vendor_produk = get_vendor_produk(produk_kd)
vend_kd = 'ODEO'
vendor_produk = get_vendor_produk() \
.filter(Partner.kode == vend_kd) \
.filter(Produk.kode == produk_kd).first()
if not vendor_produk: if not vendor_produk:
raise JsonRpcProdukNotFoundError(message="Produk %s tidak ditemukan" % produk_kd) raise JsonRpcProdukNotFoundError(message="Produk %s tidak ditemukan" % produk_kd)
...@@ -222,10 +258,7 @@ def purchase(request, data, **kwargs): ...@@ -222,10 +258,7 @@ def purchase(request, data, **kwargs):
else: else:
# produk = Produk.query_kode(produk_kd).first() # produk = Produk.query_kode(produk_kd).first()
# todo: search product lowest price # todo: search product lowest price
vend_kd = 'ODEO' vendor_produk = get_vendor_produk(produk_kd)
vendor_produk = get_vendor_produk() \
.filter(Partner.kode == vend_kd) \
.filter(Produk.kode == produk_kd).first()
if not vendor_produk: if not vendor_produk:
prod["status"] = "FAILED" prod["status"] = "FAILED"
......
...@@ -4,9 +4,9 @@ import json ...@@ -4,9 +4,9 @@ import json
import requests import requests
from opensipkd.base import get_settings from opensipkd.base import get_settings
from .vendor import VendorClass from ..vendor import VendorClass
from ..tools import log from ...tools import log
import urllib3 import urllib3
urllib3.disable_warnings() urllib3.disable_warnings()
......
...@@ -28,9 +28,13 @@ def deferred_satuan(node, kw): ...@@ -28,9 +28,13 @@ def deferred_satuan(node, kw):
class AddSchema(colander.Schema): class AddSchema(colander.Schema):
__tablename__ = 'produk' __tablename__ = 'produk'
kode = colander.SchemaNode(
colander.String(),
oid="kode", widget=widget.TextInputWidget()
)
nama = colander.SchemaNode( nama = colander.SchemaNode(
colander.String(), colander.String(),
oid="nama ", widget=widget.TextInputWidget() oid="nama", widget=widget.TextInputWidget()
) )
status = colander.SchemaNode( status = colander.SchemaNode(
......
import base64
import json
import requests
from opensipkd.base import get_settings
from .vendor import VendorClass
from ..tools import log
import urllib3
urllib3.disable_warnings()
class Vendor(VendorClass):
def __init__(self, vendor_produk, invoice_det):
VendorClass.__init__(self, vendor_produk, invoice_det=invoice_det)
def request_post(self, params, url=None):
headers = {'Authorization': 'Bearer {key}'.format(key=self.auth)}
data = json.dumps(params)
url = url and self.url + url or self.url
try:
with requests.session():
resp = requests.post(url, data=data,
verify=False, headers=headers)
except:
resp = None
return resp
def request_get(self, params, url=None):
headers = {'Authorization': 'Bearer {key}'.format(key=self.auth)}
url = url and self.url + url or self.url
try:
with requests.session():
resp = requests.get(url, params=params,
verify=False, headers=headers)
except:
resp = None
return resp
"""
nopel ALL
nama ALL
refno ALL
rincian
pokok ALL
denda ALL
coll_fee MF
bill_rest BPJS
admin ALL
period PLN/PDAM/TELKOM/PGN/MF
jml_bulan PLN/PDAM/BPJS
meter PDAM/PGN
penggunaan PGN
jth_tempo MF/PAJAK
platform MF
cabang BPJS
nm_cabang BPJS
anggota BPJS
tarif PLN-PRA/PASCA
no_meter PLN-PRA
power PLN-PRA
subtotal
discount
total
"""
def inquiry(self):
if not self.v_produk_kd or not self.id_pel:
return dict(code=9999,
message='Parameter tidak lengkap')
data = {
"message": "DATA TIDAK DITEMUKAN",
}
if self.v_produk_kd[:3] == 'PLN' and self.v_produk_kd != 'PLNPASCA':
# self.request = params
# log.info("Test Inquiry Request: %s" % params)
# self.save_log("inquiry")
# resp = self.request_get(params, '/prepaid/pln/inquiry')
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
}
elif self.v_produk_kd == "PLNPASCA":
data = {
"nopel": "530678910024",
"nama": "SUBCRIBER NAME",
"refno": "25641544",
"rincian": {
"pokok": 300000,
"denda": 0,
"admin": 2500,
"period": "2016-08",
"jml_bulan": 1,
"tarif": "R1/1300VA",
"no_meter": "530678910012",
"meter": "567-756"
},
"subtotal": 302500,
"discount": 800,
"total": 301700
}
elif self.v_produk_kd[:7] == "BPJSKES":
data = {
"nopel": "2091161532456",
"nama": "SUBCRIBER NAME",
"refno": "25641544",
"rincian": {
"pokok": 154200,
"denda": 0,
"admin": 2500,
"jml_bulan": 1,
"cabang": "-",
"bill_rest": 0,
"nm_cabang": "XXX",
"anggota": 3
},
"subtotal": 156700,
"discount": 300,
"total": 156400
}
elif self.v_produk_kd[:3] == "PAM":
data = {
"nopel": "636289",
"nama": "SUBCRIBER NAME",
"refno": "25641544",
"rincian": {
"pokok": 68000,
"denda": 0,
"admin": 2500,
"period": "2016-07",
"jml_bulan": 1,
"meter": "140-162"
},
"subtotal": 70500,
"discount": 600,
"total": 69900
}
elif self.v_produk_kd[:3] == "PGN":
data = {
"nopel": "873648273",
"nama": "SUBCRIBER NAME",
"refno": "25641544",
"rincian": {
"pokok": 68000,
"denda": 0,
"admin": 2500,
"period": "2016-07",
"meter": "140-162",
"penggunaan": "XXX"
},
"subtotal": 70500,
"discount": 600,
"total": 69900
}
elif self.v_produk_kd[:2] == "FN":
data = {
"nopel": "10929836451",
"nama": "SUBCRIBER NAME",
"refno": "25641544",
"rincian": {
"pokok": 600000,
"denda": 25000,
"admin": 2000,
"period": "2016-07",
"coll_fee": "MF",
"jth_tempo": "02\/07\/2017",
"platform": "Konvensional",
"cicilan": "005\/011"
},
"subtotal": 627000,
"discount": 900,
"total": 626100
}
elif self.v_produk_kd[:6] == "TELKOM" or self.v_produk_kd[:4] == "INDI":
data = {
"nopel": "08119876543",
"nama": "SUBCRIBER NAME",
"refno": "25641544",
"rincian": {
"pokok": 90000,
"denda": 0,
"admin": 1500,
"period": "2016-07"
},
"subtotal": 91500,
"discount": 500,
"total": 91000
}
log.info("Test Inquiry Response: %s" % data)
# if resp.ok:
# self.status = 1 # sukses
# data = "data" in result and result["data"] or None
# parsd = self.pars_data(data)
# if parsd:
# parsd.update(code=0,
# status="SUCCES")
#
# elif resp.status_code == 400:
# self.status = -1
# message = "data" in result and result["data"] or ""
# message = message and "errors" in message and message["errors"] or message
# message = type(message) is list and ", ".join(message) or message
#
# parsd = dict(code=resp.status_code,
# message=message)
# else:
# self.status = -1
# parsd = dict(code=500,
# message="Other Error")
# if not parsd:
# parsd = dict(code=500,
# message="Other Error")
self.response = data
log.info("Response To Cust: %s" % data)
data["code"] = 0
data["message"] = "SUCCESS"
self.result = data
self.save_log('inquiry')
return data
def gagal_transaksi(self, code):
if code==400:
self.status = -3
else:
self.status = -2
parsd = dict(
status="FAILED",
code=code,
message="Gagal Transaksi"
)
self.result = parsd
self.save_log('payment')
return parsd
def payment(self):
params = dict(
data=dict(
denom=self.v_produk_kd,
number=self.id_pel
)
)
self.request = params
log.info("Test Payment Request: %s" % self.request)
self.save_log("payment")
inq = None
if self.vendor_produk.produk.kategori.kode=="e-payment":
inq = self.inquiry()
data = {}
if self.vendor_produk.produk.kategori in ["e-pulsa", "e-voucher"]:
data = {"subtotal":self.vendor_produk.produk.harga,
"discount":0,
"total":5000,
"status":"PENDING"}
self.response = data
log.info("Test Payment Response: %s" % self.response)
return data
# odeo mengembalikan result dalam bentuk status
# 0200 ok
# 0400 bad request
# 0401 auth error
# parsd = {}
# if resp.status_code == 200 and type(result) is dict: # 0200
# data = "data" in result and result["data"] or {}
# # cel rc status
# if not data:
# return self.gagal_transaksi(500)
#
# if "rc" in data:
# parsd["code"] = int(data["rc"])
#
# if data["rc"] == "13":
# parsd["status"] = "FAILED"
# self.status = -2
# elif data["rc"] == "68":
# parsd["status"] = "PENDING"
# self.status = -1 # pending
# elif data["rc"] == "67":
# parsd["status"] = "DOUBLE"
# self.status = -2 # Gagal Karena Pernah Transaksi
# # Status ini hanya sementara nunggu refund
# # Status -2 ini harus dicari solusi mencari vendor lain
# else:
# self.status = 1
# parsd["code"] = 0
# parsd["status"] = "SUCCESS"
# self.serial_number = 'serial_number' in data and data["serial_numner"] \
# or self.serial_number
#
# self.vend_inv_no = "order_id" in data and data["order_id"] or {}
# if not inq:
# self.amt_buy = "price" in data and data["price"] or 0
#
# parsd["total"] = self.amt_buy
# else:
# self.amt_buy = "price" in data and data["price"] or 0
# parsd["total"] = inq["total"]
# parsd["subtotal"] = inq["subtotal"]
# parsd["discount"] = inq["discount"]
#
# self.result = parsd
# self.save_log('payment')
# return parsd
# else: # BAD REQUEST
#
# return self.gagal_transaksi(resp.status_code)
def advice(self):
pass
# if not self.v_produk_kd or not self.id_pel or not self.invoice_det:
# return dict(code=9999,
# message='Parameter tidak lengkap')
#
# if self.kategori == 'e-payment':
# order_id = self.invoice_det.vend_inv_no
# url = '/order/{order_id}'.format(order_id=order_id)
# params = None
# self.request = url
# else:
# params = dict(
# data=dict(
# denom=self.v_produk_kd,
# number=self.id_pel
# )
# )
# self.request = params
# self.save_log("advice")
# url = '/prepaid/purchase-get'
#
# self.save_log("advice")
# resp = self.request_get(params, url)
# try:
# result = json.loads(resp.text)
# except:
# result = resp.text
#
# if resp.ok:
# self.status = 1 # sukses
# data = "data" in result and result["data"] or None
# parsd = self.pars_data(data)
#
# elif resp.status_code == 400:
# self.status = -3
# parsd = dict(code=resp.status_code,
# message=resp.text)
# else:
# self.status = -4
# parsd = dict(code=500,
# message="Other Error")
#
# self.response = result
# self.save_log('advice')
# return parsd
...@@ -83,7 +83,8 @@ from pyramid.view import view_config ...@@ -83,7 +83,8 @@ from pyramid.view import view_config
from ..tools import get_settings, log, btn_purchase from ..tools import get_settings, log, btn_purchase
from ..tools import btn_inquiry, btn_reset, btn_payment, btn_advice, btn_next 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): class AddSchema(colander.Schema):
customer_id = colander.SchemaNode( customer_id = colander.SchemaNode(
...@@ -116,7 +117,7 @@ class AddSchema(colander.Schema): ...@@ -116,7 +117,7 @@ class AddSchema(colander.Schema):
) )
serial = colander.SchemaNode( serial = colander.SchemaNode(
colander.String(), title='REF. NO', colander.String(), title='Serial',
missing=colander.drop, missing=colander.drop,
oid="serial", oid="serial",
widget=widget.TextInputWidget(css_class="readonly") widget=widget.TextInputWidget(css_class="readonly")
...@@ -127,21 +128,21 @@ class AddSchema(colander.Schema): ...@@ -127,21 +128,21 @@ class AddSchema(colander.Schema):
colander.String(), title='Result', colander.String(), title='Result',
missing=colander.drop, missing=colander.drop,
oid="result", oid="result",
widget=widget.TextAreaWidget(rows=10, css_class="readonly") widget=widget.TextAreaWidget(rows=2, css_class="readonly")
) )
f_request = colander.SchemaNode( f_request = colander.SchemaNode(
colander.String(), title='Request', colander.String(), title='Request',
missing=colander.drop, missing=colander.drop,
oid="result", oid="result",
widget=widget.TextAreaWidget(rows=10, css_class="readonly") widget=widget.TextAreaWidget(rows=2, css_class="readonly")
) )
f_response = colander.SchemaNode( f_response = colander.SchemaNode(
colander.String(), title='Response', colander.String(), title='Response',
missing=colander.drop, missing=colander.drop,
oid="result", 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(){ ...@@ -188,7 +189,7 @@ $(document).ready(function(){
}); });
""") """)
def get_invoice(values, vendor_produk): def save_ar_invoice(values, vendor_produk):
invoice = H2hArInvoice.query() \ invoice = H2hArInvoice.query() \
.filter_by(cust_inv_no=values['cust_inv_no']).first() .filter_by(cust_inv_no=values['cust_inv_no']).first()
if not invoice: if not invoice:
...@@ -208,13 +209,15 @@ def get_invoice(values, vendor_produk): ...@@ -208,13 +209,15 @@ def get_invoice(values, vendor_produk):
return invoice_det return invoice_det
def get_log(values, vendor_produk): def save_partner_log(values, vendor_produk):
partner_log = PartnerLog() partner_log = PartnerLog()
partner_log.vendor_id = vendor_produk.partner_id partner_log.vendor_id = vendor_produk.partner_id
partner_log.customer_id = values["customer_id"] partner_log.customer_id = values["customer_id"]
partner_log.produk_id = vendor_produk.produk.id partner_log.produk_id = vendor_produk.produk.id
# partner_log.cust_inv = dat["inv_no"] # partner_log.cust_inv = dat["inv_no"]
partner_log.id_pel = values["id_pel"] partner_log.id_pel = values["id_pel"]
flush_row(partner_log)
return partner_log return partner_log
...@@ -244,37 +247,47 @@ class ViewHome(BaseView): ...@@ -244,37 +247,47 @@ class ViewHome(BaseView):
values = dict(c.items()) values = dict(c.items())
result = None result = None
vendor_produk = get_vendor_produk() \
vendor_produk = qry_vendor_produk() \
.filter(Partner.id == values['vendor_id']) \ .filter(Partner.id == values['vendor_id']) \
.filter(Produk.id == values['produk_id']).first() .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: 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) result = build_request('inquiry', vendor_produk, invoice_det)
elif 'purchase' in request.POST: 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) 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: elif 'payment' in request.POST:
pass pass
# invoice_det = get_invoice(values, vendor_produk) # invoice_det = get_invoice(values, vendor_produk)
# result = build_request('payment', vendor_produk, invoice_det) # result = build_request('payment', vendor_produk, invoice_det)
elif 'advice' in request.POST:
invoice_det = get_invoice(values, vendor_produk) # elif 'info' in request.POST:
result = build_request('advice', vendor_produk, invoice_det) # invoice, invoice_det = save_ar_invoice(values, vendor_produk)
elif 'info' in request.POST: # result = build_request('info', vendor_produk, invoice)
invoice, invoice_det = get_invoice(values, vendor_produk)
result = build_request('info', vendor_produk, invoice)
if result: if result:
data = result data = result
log.info(data) log.info("Response From Module: %s " % data)
# values['f_request'] = 'f_request' in result \ values['f_request'] = 'request' in result \
# and json.dumps(result['f_request'], indent=4) or '' and json.dumps(result['request'], indent=4) or ''
# values['f_response'] = 'f_response' in result \ values['f_response'] = 'response' in result \
# and json.dumps(result['f_response'], indent=4) or '' and json.dumps(result['response'], indent=4) or ''
# values['f_result'] = 'result' in result \
# values['f_result'] = 'data' in result \ and json.dumps(result['result'], indent=4) or ''
# and json.dumps(result['data'], indent=4) or ''
# values['ref_no'] = 'ref_no' in data and data["ref_no"] 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['trx_id'] = 'trx_id' in data and data['trx_id'] or ""
# values['vend_trx'] = 'vend_trx' in data and data['vend_trx'] or "" # values['vend_trx'] = 'vend_trx' in data and data['vend_trx'] or ""
......
...@@ -9,12 +9,13 @@ from opensipkd.base import get_settings ...@@ -9,12 +9,13 @@ from opensipkd.base import get_settings
from opensipkd.pasar.models import Partner, PartnerProduk, Produk from opensipkd.pasar.models import Partner, PartnerProduk, Produk
from pyramid_rpc.jsonrpc import JsonRpcError from pyramid_rpc.jsonrpc import JsonRpcError
from .vendor import VendorClass from ..vendor import VendorClass
class Vendor(VendorClass): class Vendor(VendorClass):
def __init__(self, vendor_produk, bill_no, customer_id=None, def __init__(self, vendor_produk, invoice_det, **kwargs):
cust_trx_id=None, row=None): #customer_id=None,
# cust_trx_id=None, row=None):
""" """
:param produk_kd: :param produk_kd:
merupakan kode produk versi vendor merupakan kode produk versi vendor
...@@ -24,9 +25,10 @@ class Vendor(VendorClass): ...@@ -24,9 +25,10 @@ class Vendor(VendorClass):
:param cid: :param cid:
merupakan customer id seperti MSN dan atu id pelanggaan merupakan customer id seperti MSN dan atu id pelanggaan
""" """
VendorClass.__init__(self, vendor_produk, bill_no, customer_id, VendorClass.__init__(self, vendor_produk=vendor_produk,
cust_trx_id, row) invoice_det=invoice_det)
settings = self.settings #, customer_id, cust_trx_id, row)
settings = get_settings()
self.mid = 'vsi_mid' in settings and settings['vsi_mid'] or None 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.key = 'vsi_key' in settings and settings['vsi_key'] or None
self.url = 'vsi_url' in settings and settings['vsi_url'] or None self.url = 'vsi_url' in settings and settings['vsi_url'] or None
...@@ -37,7 +39,7 @@ class Vendor(VendorClass): ...@@ -37,7 +39,7 @@ class Vendor(VendorClass):
return self.auth return self.auth
def get_params(self, cmd, msn=None, idpel=None, modul=None): 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( params = dict(
cid=self.mid, cid=self.mid,
dt=tanggal, dt=tanggal,
...@@ -45,7 +47,7 @@ class Vendor(VendorClass): ...@@ -45,7 +47,7 @@ class Vendor(VendorClass):
modul=modul, modul=modul,
command=cmd, command=cmd,
resp='XML', resp='XML',
trxid=self.partner_log_id, trxid=self.invoice_det.id,
) )
if msn: if msn:
params['msn']=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 \ 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 ...@@ -9,7 +9,7 @@ from opensipkd.base import get_settings
from opensipkd.pasar.models import Partner, PartnerProduk, Produk from opensipkd.pasar.models import Partner, PartnerProduk, Produk
from pyramid_rpc.jsonrpc import JsonRpcError from pyramid_rpc.jsonrpc import JsonRpcError
from .vsi import Vendor as VendorClass from . import Vendor as VendorClass
class Vendor(VendorClass): class Vendor(VendorClass):
......
...@@ -290,28 +290,61 @@ Pembayaran Sukses ...@@ -290,28 +290,61 @@ Pembayaran Sukses
import requests import requests
import xmltodict import xmltodict
from .vsi import Vendor as VendorClass from . import Vendor as VendorClass
from opensipkd.base.tools import log
class Vendor(VendorClass): class Vendor(VendorClass):
def pars_data(self, data): 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 { return {
"bill_no": "subid" in data and data["subid"] or self.bill_no, "nopel": "subid" in data and data["subid"] or self.id_pel,
"nama": "nama" in data and data["nama"] or "NO-NAME", "nama": "nama" in data and data["nama"] or "NO-NAME",
"rincian":{
"pokok": "tagihan" in data and data["tagihan"] or 0, "pokok": "tagihan" in data and data["tagihan"] or 0,
"denda": "denda" in data and data["denda"] or 0, "denda": "denda" in data and data["denda"] or 0,
"admin": "admin" in data and data["admin"] 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, "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 "", "ref_no": "refnum" in data and data["refnum"] or "",
"jml_bulan": "bulan" in data and data["bulan"] or "", "no_meter": "standmeter" in data and data["standmeter"] or "",
"tgh_bulan": "blth" in data and data["blth"] 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 "",
"tgl_bayar" : "date" in data and data["date"] or "", # "info": "info1" in data and data["info1"] or "",
"info" : "info1" in data and data["info1"] or "", },
"stand_meter" : "standmeter" in data and data["standmeter"] 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): def inquiry(self):
""" """
...@@ -374,30 +407,44 @@ class Vendor(VendorClass): ...@@ -374,30 +407,44 @@ class Vendor(VendorClass):
default jika dikosongkan maka responnya merupakan format plaintext. default jika dikosongkan maka responnya merupakan format plaintext.
""" """
params = self.get_params(cmd='INQ', modul='PRE') params = self.get_params(cmd='INQ', modul='PRE')
params["msn"] = self.bill_no params["msn"] = self.id_pel
# params["voucherid"] = self.v_produk_kd # params["voucherid"] = self.v_produk_kd
self.request = params self.request = params
self.save_log('inquiry') self.save_log('inquiry')
params['trxid'] = self.partner_log_id params['trxid'] = self.invoice_det.id
result = requests.get(self.url, params=params) log.info("VSI PLN PRE Request: %s", params)
if result.ok: try:
data = xmltodict.parse(result.text)["root"] 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: else:
data = dict(error=result.text, data = dict(message="No Response From Biller ",
code=result.status_code) 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": if "status" in data and data["status"] and data["status"] == "SUCCESS":
# data = self.pars_data(data) # data = self.pars_data(data)
pass data.update(dict(message="SUCCESS",
code=0))
elif "status" in data and data["status"] and data["status"] == "ERROR": elif "status" in data and data["status"] and data["status"] == "ERROR":
#todo: apakah data akan dimapping errornya? #todo: apakah data akan dimapping errornya?
data = dict(error=data["rcm"], data.update(dict(message=data["rcm"],
code=data["rc"]) code=data["rc"]))
# else:
# data.update(dict(message="Other Error",
# code=500))
return data
return self.save_response(data)
def payment(self): def payment(self):
""" """
...@@ -457,11 +504,11 @@ class Vendor(VendorClass): ...@@ -457,11 +504,11 @@ class Vendor(VendorClass):
# todo: apakah harus di cek dulu data inquirynya # todo: apakah harus di cek dulu data inquirynya
self.save_log('payment') self.save_log('payment')
params['trxid'] = self.partner_log_id params['trxid'] = self.partner_log_id
result = requests.get(self.url, params=params) resp = requests.get(self.url, params=params)
if result.ok: if resp.ok:
data = xmltodict.parse(result.text)["root"] data = xmltodict.parse(resp.text)["root"]
else: else:
data = dict(error=result.status_code) data = dict(error=resp.status_code)
self.response = data self.response = data
self.save_log('payment') self.save_log('payment')
if "status" in data and data["status"] and data["status"] == "SUCCESS": if "status" in data and data["status"] and data["status"] == "SUCCESS":
......
...@@ -73,213 +73,61 @@ Contoh response Error: ...@@ -73,213 +73,61 @@ Contoh response Error:
ERROR#0056#[56] Nomor Telpon tidak diketahui ERROR#0056#[56] Nomor Telpon tidak diketahui
""" """
# 3. Advice: protokol untuk melakukan pengecekan transaksi dengan input payment refnum # 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 requests
import xmltodict import xmltodict
from ..tools import log
from .vsi import Vendor as VendorClass from .vsi import Vendor as VendorClass
# todo: result harus distandarisasi # todo: result harus distandarisasi
class Vendor(VendorClass): 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): def inquiry(self):
params = self.get_params(cmd='INQ', modul='ISI') params = self.get_params(cmd='INQ', modul='ISI')
params["tujuan"] = self.cid params["tujuan"] = self.id_pel
params["voucherid"] = self.produk_kd params["voucherid"] = self.invoice_det.produk.kode
self.request = params self.request = params
row = self.save_log('inquiry') self.save_log('inquiry')
result = requests.get(self.url, params=params) log.info("VSI PULSA Request: %s %s" % (self.url, self.request))
if result.ok: try:
data = xmltodict.parse(result.text)["root"] result = requests.get(self.url, params=params)
else: if result.ok:
data = dict(error=result.status_code) 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.response = data
self.save_log('inquiry', row) self.result = self.pars_data(data)
self.save_log('inquiry')
return data return data
def payment(self): def payment(self):
...@@ -291,6 +139,7 @@ class Vendor(VendorClass): ...@@ -291,6 +139,7 @@ class Vendor(VendorClass):
self.response = data self.response = data
else: else:
data = dict(error=result.status_code) data = dict(error=result.status_code)
self.save_log('payment') self.save_log('payment')
return data return data
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!