vsi_pulsa.py 9.45 KB
# 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
"""
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
"""
REQ :
    cid={CLIENT_ID}
    dt={DATE}
    hc={HASHCODE}
    modul=ISI
    command=ADV
    tujuan=nomor
    voucherid={VOUCHERID}
    trxid={TRXID}
    resp=XML
Contoh request :
    cid=btsp6ffacfed-6293-11e6-8325-002590495dna
    dt=20180723
    hc=a85a020f3896298140c99a8509afcfad6272a717cc2aba8f842e68485e0a2642
    modul=ISI
    command=ADV
    tujuan=08572120002
    voucherid=TN25
    trxid=xxx1
    resp=XML
RESP :
STATUS#RC#RCMESSAGE ke: TUJUAN #RESPTEXT#DT#REFNUM#VOUCHERID#NOMINAL#SERIALNUMBER
Contoh Response Sukses:
<?xml version="1.0"?>
<root>
    <status>SUCCESS</status>
    <rc>0000</rc>
    <rcm>0000</rcm>
    <text>[0] Pembayaran Sukses</text>
    <date>Isi pulsa TN10 berhasil untuk nomor 628527778889 sebesar 10.000, refnum
          F148919BB5F4093A0F40000000000000 pada tgl 17/04/17 15:32</date>
    <refnum>2017-04-17 15:40:28</refnum>
    <voucherid>4A61D574138A2D6B4B6 </voucherid>
    <destnum>TN10</destnum>
    <nominal>10000</nominal>
    <serial>4A61D574138A2D6B4B6 </serial>
</root>
Contoh response Error:
ERROR#0051# [51] ERROR Transaksi Gagal dari Mesin Vending
"""
# 4. Info : protokol untuk melakukan pengecekan informasi produk dan harga
"""
REQ :
    cid={CLIENT_ID}
    dt={DATE}
    hc={HASHCODE}
    resp={XML}
    command=INFO
    voucherid={VOUCHERID1,VOUCHERID2}
    tujuan={NO TUJUAN}
    
Contoh request :
    cid=87ba9xzc-c7ex-8793-c7e5-0225901955v7
    dt=20160405
    hc=057db24273f1bf2ffabad292504c2071cd01dd26c1715aec6f261a43bc1b38cb
    resp=xml
    command=info
    voucherid=TN10
    tujuan=08527778889
    
RESP :
STATUS#RC#RESPTEXT
Contoh Response Sukses:
<?xml version="1.0"?>
<root>
    <status>SUCCESS</status>
    <rc>0000</rc>
    <rcm>0000</rcm>
    <text>INFO HARGA:
          TN10(TELKOMSEL AS/SIMPATI 10):Rp. 11.325
          *Belum termasuk margin agen</text>
</root>
Contoh response Error:
ERROR#0053#[53] ERROR Produk tidak ditemukan
"""
# 5. Respon Sukses Diantrikan : Menunggu Respon Biller.
"""
XML :
<?xml version="1.0"?>
<root>
    <status>SUCCESS</status>
    <rc>0000</rc>
    <rcm>[1000] PEMBAYARAN SUKSES DIANTRIKAN ke:085934111000</rcm>
    <text>
        Isi pulsa TN25 berhasil untuk nomor 6285934111000 sebesar 25.000, refnum
        3D5C50E06B5ED9AAB7B0000000000000 pada tgl 18/09/18 15:07</text>
    <date>2018-09-18 15:07:33</date>
    <refnum>DACC5EAC69EC4049AD4129C20E294C06</refnum>
    <voucherid>TN25</voucherid>
    <destnum>6285934111000</destnum>
    <nominal>25000</nominal>
    <serial></serial>
</root>
"""
# 6. Callback :
"""
http://mitra.url/callback?user_id=DEF56C3E6E3B4B6EBF88015AC25D3BFE&trxid=2134&status=S&dt=201
8-09-24%2010%3A22%3A23&info=ID%3A%202134%20TN5%20ke%206285334111000%20SUKSES%20SN%3A%20123423123%2
0%402018-09-24%2010%3A22%3A23;

http://mitra.url/callback?
user_id=DEF56C3E6E3B4B6EBF88015AC25D3BFE
trxid=2134
status=S
dt=2018-09-24 10:22:23
info=ID: 2134 TN5 ke 6285334111000 SUKSES SN: 123423123 @2018-09-24 10:22:23;

user_id : client ID
trxid : transaction ID
status : S = sukses, R= Refund (gagal)
dt : tanggal format YYYY-mm-dd hh:ii:ss contoh diatas 2018-09-24 10:22:23
info: informasi, ID: 2134 TN5 ke 6285334111000 SUKSES SN: 123423123 @2018-09-24 10:22:23
"""
# Keterangan:
"""
1. cid = identitas mitra, akan diinfokan ke mitra pada saat test maupun produkion
2. dt = tanggal transaksi (YYYYMMDD)
3. hc = SHA256(cid+dt+secret key) , secret key dan cid akan diinfokan ke mitra pada saat test maupun produkion
4. STATUS berisi status response SUCCESS atau ERROR
5. RCMESSAGE adalah Pesan Transaksi
6. RESPTEXT dan data lainnya akan ada jika STATUS=SUCCESS
7. \n di RESPTEXT adalah garis baru
8. Semua info/nilai yang diapit oleh {…}wajib diganti dengan nilai yang seharusnya (tanpa mengandung {}).
9. trxid merupakan unique id dari mitra per transaksi dengan panjang maksimum 50 character
"""
# Pesan Transaksi :
"""
Pembayaran Sukses
[4] ERROR Biller Tidak terdaftar
[5] ERROR Lainnya
[6] ERROR Sentral diblok
[7] ERROR PPID diblok
[8] ERROR Waktu akses tidak valid
[9] ERROR Akun tidak aktif
[11] ERROR NEED TO SIGN ON
[12] ERROR Tidak bisa dibatalkan
[13] ERROR Nilai Transaksi tidak valid
[14] ERROR ID Tidak Terdaftar
[15] ERROR No Meter Tidak Terdaftar
[16] ERROR PRR SUBSCRIBER
[17] ERROR ID Punya Tunggakan
[18] ERROR Permintaan Sedang diproses
[26] Quota Transaksi Agen Tidak Mencukupi. Silahkan Kontak Agen.
[29] ERROR Kode Hash tidak valid
[30] ERROR Pesan tidak valid
[31] ERROR Kode Bank tidak terdaftar
[32] ERROR Sentral tidak terdaftar
[33] ERROR Produk tidak terdaftar
[34] ERROR PPID Tidak terdaftar
[35] ERROR Akun Tidak Terdaftar
[41] ERROR Nilai Transaksi dibawah Nilai Minimum
[42] ERROR Nilai Transaksi diatas Nilai Maximum
[43] ERROR Daya Baru Lebih Kecil dari Daya Sekarang
[44] ERROR Nilai Daya Tidak Valid
[45] ERROR Nilai Biaya Administrasi Tidak Valid
[46] ERROR Deposit Tidak Mencukupi
[47] ERROR Diluar Batas KWH
[48] ERROR Permintaan sudah kadaluarsa
[51] ERROR Transaksi Gagal dari Mesin Vending
[52] ERROR Transaksi dipending dari Mesin Vending
[53] ERROR Produk tidak ditemukan
[54] ERROR Jawaban dari Biller Tidak ditemukan
[55] ERROR Lainnya Mesin Vending
[56] ERROR Nomor Telpon Tidak diketahui
[63] ERROR Tidak ada Pembayaran
[60] ERROR Akun sudah didaftarkan
[67] ERROR CANNOT CONNECT
[68] ERROR Timeout
[69] ERROR Sertifikat tidak dikenal
[70] ERROR Timeout tidak refund
[72] ERROR Permintaan tidak mungkin dilayani
[73] ERROR Request dipending di Biller
[77] ERROR Id di suspend
[88] ERROR Tagihan sudah dibayar
[89] ERROR Tagihan tidak tersedia
[90] ERROR sedang proses CUT OFF
[91] ERROR Database
[92] ERROR Nomor Referensi Switching tidak ditemukan
[93] ERROR Nomor Referensi Switching tidak valid
[94] ERROR Pembatalan sudah dilakukan
[95] ERROR Kode Merchant tidak terdaftar
[96] ERROR Transaksi tidak ditemukan
[97] ERROR SW BANK Tidak identik
[98] ERROR Nomor Referensi Switching tidak valid
[146] ERROR di servis deposit"""

import requests
import xmltodict

from .vsi import Vendor as VendorClass

# todo: result harus distandarisasi
class Vendor(VendorClass):
    def inquiry(self):
        params = self.get_params(cmd='INQ', modul='ISI')
        params["tujuan"] = self.cid
        params["voucherid"] = self.produk_kd
        result = requests.get(self.url, params=params)
        if result.ok:
            data = xmltodict.parse(result.text)["root"]
        else:
            data = dict(error=result.status_code)
        self.save_log('inquiry')
        return data

    def payment(self):
        params = self.get_params(cmd='PAY', modul='ISI')
        self.request = params
        result = requests.get(self.url, params=params)
        if result.ok:
            data = xmltodict.parse(result.text)["root"]
            self.response = data
        else:
            data = dict(error=result.status_code)
        self.save_log('payment')
        return data

    def advice(self):
        params = self.get_params(cmd='ADV', modul='ISI')
        self.request = params
        result = requests.get(self.url, params=params)
        if result.ok:
            data = xmltodict.parse(result.text)["root"]
            self.response = data
        else:
            data = dict(error=result.status_code)
        self.save_log('advice')
        return data

    def info(self):
        params = self.get_params(cmd='info', modul='ISI')
        self.request = params
        result = requests.get(self.url, params=params)
        if result.ok:
            data = xmltodict.parse(result.text)["root"]
            self.response = data
        else:
            data = dict(error=result.status_code)
        self.save_log('info')
        return data