Commit 31aa39ea by Solo Group

VSI

1 parent de8ace71
...@@ -20,8 +20,18 @@ def build_request(typ, vendor_produk, partner_log=None): ...@@ -20,8 +20,18 @@ def build_request(typ, vendor_produk, partner_log=None):
# customer_id = 'customer_id' in values and values['customer_id'] or None # customer_id = 'customer_id' in values and values['customer_id'] or None
# cust_trx_id = 'cust_trx_id' in values and values['cust_trx_id'] or None # cust_trx_id = 'cust_trx_id' in values and values['cust_trx_id'] or None
log.info("Modules: %s" % vendor_produk.modules) pckgs = 'agratek.api.merchant.views'
modules = import_module('.' + vendor_produk.modules, 'agratek.api.merchant.views') moduls = vendor_produk.modules.split('.')
if len(moduls)>1:
pckg = ".".join(moduls[:-1])
pckgs = ".".join([pckgs, pckg])
moduls = moduls[-1:]
modul = moduls[0]
log.info("Module: %s Pckgs: %s" %(modul, pckgs))
modul = '.' + modul
modules = import_module(modul, pckgs)
cls_module = modules.Vendor(vendor_produk, partner_log) cls_module = modules.Vendor(vendor_produk, partner_log)
cls = hasattr(cls_module, typ) and getattr(cls_module, typ) or None cls = hasattr(cls_module, typ) and getattr(cls_module, typ) or None
if cls: if cls:
......
import base64 import base64
import json import json
from time import sleep
import requests import requests
from opensipkd.base import get_settings from opensipkd.base import get_settings
from opensipkd.pasar.models import PartnerProduk from opensipkd.pasar.models import PartnerProduk, H2hArInvoiceDet
from ..vendor import VendorClass from ..vendor import VendorClass
...@@ -14,6 +15,7 @@ import urllib3 ...@@ -14,6 +15,7 @@ import urllib3
urllib3.disable_warnings() urllib3.disable_warnings()
class Vendor(VendorClass): class Vendor(VendorClass):
def __init__(self, vendor_produk, invoice_det): def __init__(self, vendor_produk, invoice_det):
VendorClass.__init__(self, vendor_produk, invoice_det=invoice_det) VendorClass.__init__(self, vendor_produk, invoice_det=invoice_det)
...@@ -25,6 +27,20 @@ class Vendor(VendorClass): ...@@ -25,6 +27,20 @@ class Vendor(VendorClass):
key = ":".join([self.mid, self.key]).encode() key = ":".join([self.mid, self.key]).encode()
self.auth = base64.b64encode(key).decode() self.auth = base64.b64encode(key).decode()
def set_response(self, result=None, data=None, message=None, code=None):
if result:
self.response = result
elif not data and message:
code = code and code or 500
message = message and message or "Biller No Response"
data = dict(code=code,
message=message)
self.result = data
self.save_log('inquiry')
log.info("Response To Cust: %s" % data)
return data
def request_post(self, params, url=None): def request_post(self, params, url=None):
headers = {'Authorization': 'Bearer {key}'.format(key=self.auth)} headers = {'Authorization': 'Bearer {key}'.format(key=self.auth)}
data = json.dumps(params) data = json.dumps(params)
...@@ -53,27 +69,27 @@ class Vendor(VendorClass): ...@@ -53,27 +69,27 @@ class Vendor(VendorClass):
def inquiry(self): def inquiry(self):
if not self.v_produk_kd or not self.id_pel: if not self.v_produk_kd or not self.id_pel:
return dict(code=9999, return self.set_response(message='Parameter tidak lengkap')
message='Parameter tidak lengkap')
if self.v_produk_kd[:3] == 'PLN' and self.v_produk_kd != 'PLNPASCA': if self.v_produk_kd[:3] == 'PLN' and self.v_produk_kd != 'PLNPASCA':
params = dict( params = dict(
number=self.id_pel number=self.id_pel
) )
url = '/prepaid/pln/inquiry'
self.request = params
log.info("Inquiry Request: %s" % params)
self.save_log("inquiry")
resp = self.request_get(params, '/prepaid/pln/inquiry')
else: else:
params = dict( params = dict(
denom=self.v_produk_kd, denom=self.v_produk_kd,
number=self.id_pel number=self.id_pel
) )
self.request = params url = '/postpaid/inquiry'
self.save_log("inquiry")
log.info("Inquiry Request: %s" % params) self.request = params
resp = self.request_get(params, '/postpaid/inquiry') log.info("Inquiry Request: %s" % params)
self.save_log("inquiry")
resp = self.request_get(params, url)
if not resp:
return self.set_response(message="Biller No Response")
try: try:
result = json.loads(resp.text) result = json.loads(resp.text)
...@@ -81,7 +97,6 @@ class Vendor(VendorClass): ...@@ -81,7 +97,6 @@ class Vendor(VendorClass):
result = resp.text result = resp.text
log.info("Inquiry Response: %s" % result) log.info("Inquiry Response: %s" % result)
if resp.ok: if resp.ok:
self.status = 1 # sukses self.status = 1 # sukses
data = "data" in result and result["data"] or None data = "data" in result and result["data"] or None
...@@ -102,15 +117,12 @@ class Vendor(VendorClass): ...@@ -102,15 +117,12 @@ class Vendor(VendorClass):
self.status = -1 self.status = -1
parsd = dict(code=500, parsd = dict(code=500,
message="Other Error") message="Other Error")
if not parsd:
parsd = dict(code=500,
message="Other Error")
self.response = result # self.response = result
log.info("Response To Cust: %s" % parsd) # log.info("Response To Cust: %s" % parsd)
self.result = parsd # self.result = parsd
self.save_log('inquiry') # self.save_log('inquiry')
return parsd return self.set_response(result, parsd) #parsd
def gagal_transaksi(self, code): def gagal_transaksi(self, code):
...@@ -201,17 +213,18 @@ class Vendor(VendorClass): ...@@ -201,17 +213,18 @@ class Vendor(VendorClass):
self.amt_buy = "price" in data and data["price"] or 0 self.amt_buy = "price" in data and data["price"] or 0
inq.update(parsd) inq.update(parsd)
parsd = inq parsd = inq
# parsd["total"] = self.amt_sell
# parsd["discount"] = self.discount
# parsd["subtotal"] = self.amt_sell+self.discount
# {'ref_no': '25785881', 'jml_data': 1, 'code': 0, 'id_pel': '08112118585', 'nama': 'SUBCRIBER NAME',
# 'total': 301500, 'discount': 0, 'status': 'SUCCES',
# 'rincian': {'admin': 1500, 'denda': 0, 'jml_bulan': 1, 'pokok': 300000, 'period': '2016-08 '},
# 'subtotal': 301500}
self.result = parsd self.result = parsd
log.info("Payment Result: %s" % self.result) log.info("Payment Result: %s" % self.result)
self.save_log('payment') self.save_log('payment')
# if self.status == -1:
# sleep(2)
# row = H2hArInvoiceDet.query_id(self.invoice_det.id).first()
# if row.notify:
# post = "post" in row.notify and row.notify["post"] or ""
# if post:
#
return parsd return parsd
else: # BAD REQUEST else: # BAD REQUEST
......
...@@ -283,6 +283,10 @@ class ViewHome(BaseView): ...@@ -283,6 +283,10 @@ class ViewHome(BaseView):
if result: if result:
values.update(result) values.update(result)
if result["f_result"]["code"]==0:
session.flash("Sukses")
else:
session.flash(result["f_result"]["message"], "error")
form.render(values) form.render(values)
return dict(form=form, params=form_params_view) return dict(form=form, params=form_params_view)
......
...@@ -11,6 +11,59 @@ from pyramid_rpc.jsonrpc import JsonRpcError ...@@ -11,6 +11,59 @@ from pyramid_rpc.jsonrpc import JsonRpcError
from ..vendor import VendorClass from ..vendor import VendorClass
vsi_status = {
"11":{"message":"ERROR NEED TO SIGN ON", "status":-1},
"12":{"message":"ERROR Tidak bisa dibatalkan","status":-1},
"13":{"message":"ERROR Nilai Transaksi tidak valid","status":-3},
"14":{"message":"ERROR ID Tidak Terdaftar","status":-3},
"15":{"message":"ERROR No Meter Tidak Terdaftar","status":-3},
"16":{"message":"ERROR PRR SUBSCRIBER","status":-3},
"17":{"message":"ERROR ID Punya Tunggakan","status":-3},
"18":{"message":"ERROR Permintaan Sedang diproses","status":-1},
"26":{"message":"Quota Transaksi Agen Tidak Mencukupi. Silahkan Kontak Agen.","status":-2},
"29":{"message":"ERROR Kode Hash tidak valid","status":-2},
"30":{"message":"ERROR Pesan tidak valid","status":-2},
"31":{"message":"ERROR Kode Bank tidak terdaftar","status":-2},
"32":{"message":"ERROR Sentral tidak terdaftar","status":-2},
"33":{"message":"ERROR Produk tidak terdaftar","status":-2},
"34":{"message":"ERROR PPID Tidak terdaftar","status":-2},
"35":{"message":"ERROR Akun Tidak Terdaftar","status":-2},
"41":{"message":"ERROR Nilai Transaksi dibawah Nilai Minimum","status":-2},
"42":{"message":"ERROR Nilai Transaksi diatas Nilai Maximum","status":-2},
"43":{"message":"ERROR Daya Baru Lebih Kecil dari Daya Sekarang","status":-3},
"44":{"message":"ERROR Nilai Daya Tidak Valid","status":-3},
"45":{"message":"ERROR Nilai Biaya Administrasi Tidak Valid","status":-3},
"46":{"message":"ERROR Deposit Tidak Mencukupi","status":-2},
"47":{"message":"ERROR Diluar Batas KWH","status":-3},
"48":{"message":"ERROR Permintaan sudah kadaluarsa","status":-3},
"51":{"message":"ERROR Transaksi Gagal dari Mesin Vending","status":-3},
"52":{"message":"ERROR Transaksi dipending dari Mesin Vending","status":-1},
"53":{"message":"ERROR Produk tidak ditemukan","status":-1},
"54":{"message":"ERROR Jawaban dari Biller Tidak ditemukan","status":-3},
"55":{"message":"ERROR Lainnya Mesin Vending","status":-2},
"56":{"message":"ERROR Nomor Telpon Tidak diketahui","status":-3},
"63":{"message":"ERROR Tidak ada Pembayaran","status":-1},
"60":{"message":"ERROR Akun sudah didaftarkan","status":-3},
"67":{"message":"ERROR CANNOT CONNECT","status":-3},
"68":{"message":"ERROR Timeout","status":-2},
"69":{"message":"ERROR Sertifikat tidak dikenal","status":-2},
"70":{"message":"ERROR Timeout tidak refund","status":-1},
"72":{"message":"ERROR Permintaan tidak mungkin dilayani","status":-2},
"73":{"message":"ERROR Request dipending di Biller","status":-1},
"77":{"message":"ERROR Id di suspend","status":-2},
"88":{"message":"ERROR Tagihan sudah dibayar","status":-3},
"89":{"message":"ERROR Tagihan tidak tersedia","status":-3},
"90":{"message":"ERROR sedang proses CUT OFF","status":-1},
"91":{"message":"ERROR Database","status":-1},
"92":{"message":"ERROR Nomor Referensi Switching tidak ditemukan","status":-2},
"93":{"message":"ERROR Nomor Referensi Switching tidak valid","status":-2},
"94":{"message":"ERROR Pembatalan sudah dilakukan","status":-3},
"95":{"message":"ERROR Kode Merchant tidak terdaftar","status":-2},
"96":{"message":"ERROR Transaksi tidak ditemukan","status":-3},
"97":{"message":"ERROR SW BANK Tidak identik","status":-2},
"98":{"message":"ERROR Nomor Referensi Switching tidak valid","status":-2},
"146":{"message":"ERROR di servis deposit","status":-1},
}
class Vendor(VendorClass): class Vendor(VendorClass):
def __init__(self, vendor_produk, invoice_det, **kwargs): def __init__(self, vendor_produk, invoice_det, **kwargs):
......
from opensipkd.pasar.models import PartnerProduk
import requests
import xmltodict
from . import Vendor as VendorClass, vsi_status
from opensipkd.base.tools import log
class Vendor(VendorClass):
def get_bulan(self):
return int(self.invoice_det.produk.kode[6:])
def pars_data(self, data):
bulan = self.get_bulan()
product_id = self.invoice_det.produk.id
partner_id = self.invoice_det.h2h_ar_invoice.customer_id
discount = PartnerProduk.get_discount(partner_id, product_id)
admin = self.vendor_produk.produk.harga
pokok = "jmltagihan" in data and data["jmltagihan"] or 0
subtotal = pokok + admin
total = subtotal - discount
self.amt_buy = "totaltag" in data and int(data["totaltag"]) or 0
self.ant_sell = total
code = "rc" in data and int(data["rc"]) or 500
if code == 0:
self.status = 1
message="SUCCESS"
else:
self.status = vsi_status[str(code)]["status"]
if self.status == -3:
message = "GAGAL"
else:
message = "PENDING"
txts = "text" in data and data["text"].split("<br/>")
i = 0
nama = ""
anggota = 0
if len(txts)==9:
nama = txts[2]
str_ang = txts[3].split(":")
anggota = len(str_ang)>1 and int(str_ang[1]) or 0
"""
"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
}]
<?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>
"""
return {
"code": code,
"status": message,
"message": "rcm" in data and "Transaksi %s" % message or "No Response From Biller",
"refno": "refnum" in data and data["refnum"] or "",
"nopel": "idpel" in data and data["idpel"] or self.id_pel,
"nama": nama,
"rincian":{
"pokok": pokok,
"denda": 0,
"admin": admin,
"jml_bulan": bulan,
"cabang": "-",
"bill_rest": 0,
"nm_cabang": "XXX",
"anggota": anggota
},
"subtotal": subtotal,
"discount": discount,
"total": total,
}
def save_response(self, data, typ="inquiry"):
self.response = data
log.info("Response: %s", data)
self.save_log(typ)
return data
def inquiry(self):
params = self.get_params(cmd='INQ', modul='gp')
params["input1"] = self.id_pel
params["input2"] = self.get_bulan()
params["biller"] = '0060012'
self.request = params
self.save_log('inquiry')
log.info("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 = dict(xmltodict.parse(resp.text)["root"])
log.info("Response: %s", data)
data = self.pars_data(data)
elif resp:
data = dict(message=resp.text,
code=resp.status_code)
else:
data = dict(message="No Response From Biller ",
code=500)
return self.save_response(data)
return self.save_response(data)
def payment(self):
params = self.get_params(cmd='PAY', modul='gp')
params["input1"] = self.id_pel
params["input2"] = self.get_bulan()
params["biller"] = '0060012'
self.request = params
self.save_log('payment')
try:
resp = requests.get(self.url, params=params)
if resp.ok:
data = dict(xmltodict.parse(resp.text)["root"])
else:
data = dict(code=resp.status_code,
message=resp.text)
except:
data = dict(code=500,
message="No Response From Biller")
self.response = data
data = self.pars_data(data)
self.save_log('payment')
return data
def advice(self):
params = self.get_params(cmd='ADV', modul='gp')
params["input1"] = self.id_pel
params["input2"] = self.get_bulan()
params["biller"] = '0060012'
self.request = params
self.save_log('advice')
try:
resp = requests.get(self.url, params=params)
if resp.ok:
data = dict(xmltodict.parse(resp.text)["root"])
self.response = data
else:
data = dict(code=resp.status_code,
message=resp.text)
self.response = data
except:
data = dict(code=500,
message="No Response From Biller")
self.response = data
data = self.pars_data(data)
self.result = data
self.save_log('advice')
return data
from opensipkd.pasar.models import PartnerProduk
import requests
import xmltodict
from . import Vendor as VendorClass, vsi_status
from opensipkd.base.tools import log
class Vendor(VendorClass):
def pars_data(self, data):
product_id = self.invoice_det.produk.id
partner_id = self.invoice_det.h2h_ar_invoice.customer_id
bulan = "totalperiod" in data and data["totalperiod"].split(" ")
bulan = bulan and bulan[0] or 1
discount = PartnerProduk.get_discount(partner_id, product_id) * bulan
admin = self.vendor_produk.produk.harga * bulan
harga = "transamount" in data and data["transamount"] or 0
admin_chg = "admincharge" in data and data["admincharge"] or 0
pokok = harga - admin_chg
subtotal = pokok + admin
total = subtotal - discount
if "status" in data and data["status"] and data["status"] == "SUCCESS":
self.status = 1
elif "status" in data and data["status"] and data["status"] == "ERROR":
self.status = -1
code = "rc" in data and int(data["rc"]) or 500
if code == 0:
self.status = 1
message="SUCCESS"
else:
self.status = vsi_status[str(code)]["status"]
if self.status == -3:
message = "GAGAL"
else:
message = "PENDING"
meter = "startend" in data and data["startend"] or ""
"""
<?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>
"""
"""
{
"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
}]
"""
return {
"code": code,
"status": message,
"message": "rcm" in data and "Transaksi %s" % message or "No Response From Biller",
"refno": "refnum" in data and data["refnum"] or "",
"nopel": "idpel" in data and data["idpel"] or self.id_pel,
"nama": "name" in data and data["name"] or "NO-NAME",
"rincian":{
"pokok": pokok,
"denda": 0,
"admin": admin,
"periode": "billperiod" in data and data["billperiod"] or "",
"jml_bulan": bulan,
# "tarif": "tarifdaya" in data and data["tarifdaya"] or "",
# "no_meter": "msn" in data and data["msn"] or "",
# "power": power,
"meter": meter,
},
"subtotal": subtotal,
"discount": discount,
"total": total,
}
def save_response(self, data, typ="inquiry"):
self.response = data
log.info("Response: %s", data)
self.save_log(typ)
return data
def inquiry(self):
params = self.get_params(cmd='INQ', modul='PDAM')
params["idpel"] = self.id_pel
params["biller"] = self.vendor_produk.kode
self.request = params
self.save_log('inquiry')
params['trxid'] = self.invoice_det.id
log.info("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 = dict(xmltodict.parse(resp.text)["root"])
log.info("Response: %s", data)
data = self.pars_data(data)
elif resp:
data = dict(message=resp.text,
code=resp.status_code)
else:
data = dict(message="No Response From Biller ",
code=500)
return self.save_response(data)
return self.save_response(data)
def payment(self):
params = self.get_params(cmd='PAY', modul='PDAM')
params["idpel"] = self.id_pel
self.request = params
self.save_log('payment')
try:
resp = requests.get(self.url, params=params)
if resp.ok:
data = dict(xmltodict.parse(resp.text)["root"])
else:
data = dict(code=resp.status_code,
message=resp.text)
except:
data = dict(code=500,
message="No Response From Biller")
self.response = data
data = self.pars_data(data)
self.save_log('payment')
return data
def advice(self):
params = self.get_params(cmd='ADV', modul='pln')
params["idpel"] = self.id_pel
self.request = params
self.save_log('advice')
try:
resp = requests.get(self.url, params=params)
if resp.ok:
data = dict(xmltodict.parse(resp.text)["root"])
self.response = data
else:
data = dict(code=resp.status_code,
message=resp.text)
self.response = data
except:
data = dict(code=500,
message="No Response From Biller")
self.response = data
data = self.pars_data(data)
self.result = data
self.save_log('advice')
return data
from opensipkd.pasar.models import PartnerProduk
import requests
import xmltodict
from . import Vendor as VendorClass, vsi_status
from opensipkd.base.tools import log
class Vendor(VendorClass):
def pars_data(self, data):
"""
<?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>
"""
"""
<?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>
"""
power = "segmenpower" in data and data["segmenpower"].split("/") or [""]
power = len(power)>1 and power[-1:][0] or power[0]
product_id = self.invoice_det.produk.id
partner_id = self.invoice_det.h2h_ar_invoice.customer_id
discount = PartnerProduk.get_discount(partner_id, product_id)
admin = self.vendor_produk.produk.harga
harga = "nominal" in data and data["nominal"] or 0
subtotal = harga + admin
token = "token" in data and data["token"] or ""
if "status" in data and data["status"] and data["status"] == "SUCCESS":
self.status = 1
elif "status" in data and data["status"] and data["status"] == "ERROR":
self.status = -1
code = "rc" in data and int(data["rc"]) or 500
if code == 0:
self.status = 1
message="SUCCESS"
else:
self.status = vsi_status[str(code)]["status"]
if self.status == -3:
message = "GAGAL"
else:
message = "PENDING"
meter = "startend" in data and data["startend"] or ""
"""
{
"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
}]
"""
bulan = "bulan" in data and data["bulan"].split(" ")
bulan = bulan and bulan[0] or 0
return {
"code": code,
"status": message,
"message": "rcm" in data and "Transaksi %s" % message or "No Response From Biller",
"refno": "refnum" in data and data["refnum"] or "",
"nopel": "idpel" in data and data["idpel"] or self.id_pel,
"nama": "nama" in data and data["nama"] or "NO-NAME",
"rincian":{
"pokok": "tagihan" in data and int(data["tagihan"]) or 0,
"denda": "denda" in data and int(data["denda"]) or 0,
"admin": admin,
"periode": "blntagihan" in data and data["blntagihan"] or "",
"jml_bulan": bulan,
"tarif": "tarifdaya" in data and data["tarifdaya"] or "",
"no_meter": "msn" in data and data["msn"] or "",
"power": power,
"meter": meter,
},
"subtotal": subtotal,
"discount": discount,
"total": subtotal-discount,
}
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):
params = self.get_params(cmd='INQ', modul='pln')
params["idpel"] = self.id_pel
self.request = params
self.save_log('inquiry')
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 = dict(xmltodict.parse(resp.text)["root"])
data = self.pars_data(data)
elif resp:
data = dict(message=resp.text,
code=resp.status_code)
else:
data = dict(message="No Response From Biller ",
code=500)
return self.save_response(data)
# if "status" in data and data["status"] and data["status"] == "SUCCESS":
# # data = self.pars_data(data)
# 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.update(dict(message=data["rcm"],
# code=data["rc"]))
# else:
# data.update(dict(message="Other Error",
# code=500))
return self.save_response(data)
def payment(self):
params = self.get_params(cmd='PAY', modul='pln')
params["idpel"] = self.id_pel
# params["nominal"] = self.v_produk_kd
self.request = params
# todo: apakah harus di cek dulu data inquirynya
self.save_log('payment')
params['trxid'] = self.invoice_det.id
try:
resp = requests.get(self.url, params=params)
if resp.ok:
data = dict(xmltodict.parse(resp.text)["root"])
else:
data = dict(code=resp.status_code,
message=resp.text)
except:
data = dict(code=500,
message="No Response From Biller")
self.response = data
data = self.pars_data(data)
self.save_log('payment')
return data
def advice(self):
params = self.get_params(cmd='ADV', modul='pln')
params["idpel"] = self.id_pel
#params["nominal"] = self.v_produk_kd
self.request = params
# todo: apakah harus di cek dulu data inquirynya
self.save_log('advice')
try:
resp = requests.get(self.url, params=params)
if resp.ok:
data = dict(xmltodict.parse(resp.text)["root"])
self.response = data
else:
data = dict(code=resp.status_code,
message=resp.text)
self.response = data
except:
data = dict(code=500,
message="No Response From Biller")
self.response = data
data = self.pars_data(data)
self.result = data
self.save_log('advice')
return data
from opensipkd.pasar.models import PartnerProduk
import requests
import xmltodict
from . import Vendor as VendorClass, vsi_status
from opensipkd.base.tools import log
class Vendor(VendorClass):
def pars_data(self, data):
"""
<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>
"""
"""
<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>
"""
power = "tarifdaya" in data and data["tarifdaya"].split("/") or [""]
power = len(power)>1 and power[-1:][0] or power[0]
product_id = self.invoice_det.produk.id
partner_id = self.invoice_det.h2h_ar_invoice.customer_id
discount = PartnerProduk.get_discount(partner_id, product_id)
admin = self.vendor_produk.produk.harga
harga = "nominal" in data and data["nominal"] or 0
subtotal = harga + admin
token = "token" in data and data["token"] or ""
if "status" in data and data["status"] and data["status"] == "SUCCESS":
self.status = 1
elif "status" in data and data["status"] and data["status"] == "ERROR":
self.status = -1
code = "rc" in data and int(data["rc"]) or 500
if code == 0:
self.status = 1
message="SUCCESS"
else:
self.status = vsi_status[str(code)]["status"]
if self.status == -3:
message = "GAGAL"
else:
message = "PENDING"
return {
"code": code,
"status": message,
"message": "rcm" in data and "Transaksi %s" % message or "No Response From Biller",
"refno": "refnum" in data and data["refnum"] or "",
"nopel": "idpel" in data and data["idpel"] or self.id_pel,
"nama": "nama" in data and data["nama"] or "NO-NAME",
"rincian":{
"pokok": "tagihan" in data and int(data["tagihan"]) or 0,
"denda": "denda" in data and int(data["denda"]) or 0,
"admin": admin,
"tarif": "tarifdaya" in data and data["tarifdaya"] or "",
# "ppn": "ppn" in data and data["ppn"] or 0,
# "ref_no": "refnum" in data and data["refnum"] or "",
"no_meter": "msn" in data and data["msn"] or "",
"power": power,
"token": token,
},
"subtotal": subtotal,
"discount": discount,
"total": subtotal-discount,
}
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):
params = self.get_params(cmd='INQ', modul='PRE')
params["msn"] = self.id_pel
params["nominal"] = self.v_produk_kd
self.request = params
self.save_log('inquiry')
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 = dict(xmltodict.parse(resp.text)["root"])
data = self.pars_data(data)
elif resp:
data = dict(message=resp.text,
code=resp.status_code)
else:
data = dict(message="No Response From Biller ",
code=500)
return self.save_response(data)
# if "status" in data and data["status"] and data["status"] == "SUCCESS":
# # data = self.pars_data(data)
# 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.update(dict(message=data["rcm"],
# code=data["rc"]))
# else:
# data.update(dict(message="Other Error",
# code=500))
return self.save_response(data)
def payment(self):
params = self.get_params(cmd='PAY', modul='PRE')
params["msn"] = self.id_pel
params["nominal"] = self.v_produk_kd
self.request = params
# todo: apakah harus di cek dulu data inquirynya
self.save_log('payment')
params['trxid'] = self.invoice_det.id
try:
resp = requests.get(self.url, params=params)
if resp.ok:
data = dict(xmltodict.parse(resp.text)["root"])
else:
data = dict(code=resp.status_code,
message=resp.text)
except:
data = dict(code=500,
message="No Response From Biller")
self.response = data
data = self.pars_data(data)
self.save_log('payment')
return data
def advice(self):
params = self.get_params(cmd='ADV', modul='PRE')
params["msn"] = self.id_pel
params["nominal"] = self.v_produk_kd
self.request = params
# todo: apakah harus di cek dulu data inquirynya
self.save_log('advice')
params['trxid'] = self.invoice_det.id
try:
resp = requests.get(self.url, params=params)
if resp.ok:
data = dict(xmltodict.parse(resp.text)["root"])
self.response = data
else:
data = dict(code=resp.status_code,
message=resp.text)
self.response = data
except:
data = dict(code=500,
message="No Response From Biller")
self.response = data
data = self.pars_data(data)
self.result = data
self.save_log('advice')
return data
# 1. Inquiry: protokol untuk melakukan pengecekan data pembelian
"""
VOUCHER
REQ :
cid={CLIENT_ID}
dt={DATE}
hc={HASHCODE}
modul=ISI
command=INQ
tujuan=nomor
voucherid={VOUCHERID}
trxid={TRXID}
resp=XML
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
from opensipkd.pasar.models import PartnerProduk from opensipkd.pasar.models import PartnerProduk
"""
REQ :
cid={CLIENT_ID}
dt={DATE}
hc={HASHCODE}
modul=ISI
command=PAY
tujuan=nomor
voucherid={VOUCHERID}
trxid={TRXID}
resp=XML
Contoh request :
cid=btsp6ffacfed-6293-11e6-8325-002590495dna
&dt=20180723
&hc=a85a020f3896298140c99a8509afcfad6272a717cc2aba8f842e68485e0a2642
&modul=ISI
&command=PAY
&tujuan=08572120002
&voucherid=TN25
&trxid=xxx1
&resp=XML
RESP :
Contoh response Sukses:
<?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
import requests import requests
import xmltodict import xmltodict
from ..tools import JsonRpcError from agratek.api.merchant.tools import JsonRpcError
from .vsi import Vendor as VendorClass from agratek.api.merchant.views.vsi import Vendor as VendorClass
import logging import logging
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
...@@ -115,10 +38,10 @@ class Vendor(VendorClass): ...@@ -115,10 +38,10 @@ class Vendor(VendorClass):
self.status = -1 self.status = -1
result = dict( result = dict(
status="status" in data and data["status"] or "FAILED", status="status" in data and data["status"] or "PENDING",
code=code, code=code,
message="rcm" in data \ message="rcm" in data \
and (data["rcm"] == "00000" and "Sukses" or data["rcm"]) \ and (data["rcm"] == "00000" and "SUCCESS" or data["rcm"]) \
or "PENDING", or "PENDING",
serial_number="serialnumber" in data and data["serialnumber"] or "", serial_number="serialnumber" in data and data["serialnumber"] or "",
subtotal=int(harga), subtotal=int(harga),
...@@ -133,7 +56,7 @@ class Vendor(VendorClass): ...@@ -133,7 +56,7 @@ class Vendor(VendorClass):
params["voucherid"] = self.vendor_produk.kode params["voucherid"] = self.vendor_produk.kode
self.request = params self.request = params
self.save_log('inquiry') self.save_log('inquiry')
log.info("VSI PULSA Request: %s %s" % (self.url, self.request)) log.info("Request: %s %s" % (self.url, self.request))
try: try:
result = requests.get(self.url, params=params) result = requests.get(self.url, params=params)
if result.ok: if result.ok:
......
import base64
import hashlib
import json
from datetime import datetime
import requests
import xmltodict
from opensipkd.base import get_settings
from opensipkd.pasar.models import Partner, PartnerProduk, Produk
from pyramid_rpc.jsonrpc import JsonRpcError
from . import Vendor as VendorClass
class Vendor(VendorClass):
def pars_data(self, data):
return {
"bill_no": "subid" in data and data["subid"] or self.bill_no,
"nama": "nama" in data and data["nama"] or "NO-NAME",
"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,
"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 "",
}
def inquiry(self):
"""
:return:
:parameter url tobe submitted
cid = {CLIENTID}
dt = {DATE}
hc = {HASHCODE}
modul = pln
command = INQ
idpel = {IDPELANGGAN}
resp = XML
trxid = {IDTRANSAKSI}
:sukses response
<?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>
:error response
<?xml version = "1.0"?>
<root>
<status>ERROR</status>
<rc>0014</rc>
<rcm>
[14] IDPEL YANG ANDA MASUKKAN SALAH, MOHON TELITI KEMBALI.
</rcm>
< / root >
: notes
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. trxid merupakan unique id dari mitra per transaksi dengan
panjang maksimum 50 character.
6. resp merupakan format respon yang diinginkan (XML), secara
default jika dikosongkan maka responnya merupakan format plaintext.
"""
params = self.get_params(cmd='INQ', modul='pln')
params["idpel"] = self.bill_no
# 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"]
else:
data = dict(error=result.text,
code=result.status_code)
self.response = data
self.save_log('inquiry')
if "status" in data and data["status"] and data["status"] == "SUCCESS":
data = self.pars_data(data)
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"])
return data
def payment(self):
"""
:parameter
cid = {CLIENTID}
dt = {DATE}
hc = {HASHCODE}
modul = pln
command = PAY
idpel = {IDPELANGGAN}
resp = XML
trxid = {IDTRANSAKSI}
:response sukses
<?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
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>
:response error
<?xml version="1.0"?>
<root>
<status>ERROR</status>
<rc>0088</rc>
<rcm>[88] TAGIHAN SUDAH TERBAYAR</rcm>
</root>
"""
params = self.get_params(cmd='PAY', modul='pln')
params["idpel"] = self.bill_no
# params["voucherid"] = self.v_produk_kd
self.request = params
# 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"]
else:
data = dict(error=result.status_code)
self.response = data
self.save_log('payment')
if "status" in data and data["status"] and data["status"] == "SUCCESS":
data = self.pars_data(data)
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"])
return data
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!