vsi_pulsa.py
6.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
# 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
"""
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 xmltodict
from ..tools import JsonRpcError
from .vsi import Vendor as VendorClass
import logging
log = logging.getLogger(__name__)
# todo: result harus distandarisasi
class Vendor(VendorClass):
def pars_data(self, data):
"""
<status>SUCCESS</status>
<rc>0000</rc>
<rcm>0000</rcm>
<text>[0] Pembayaran Sukses</text>
<date>Isi pulsa TN10 berhasil untuk nomor 628527778889 sebesar 10.000, refnum F148919BB5F4093A0F40000000000000 pada tgl 17/04/17 15:32</date>
<refnum>2017-04-17 15:40:28</refnum>
<voucherid>4A61D574138A2D6B4B6 </voucherid>
<destnum>TN10</destnum>
<nominal>10000</nominal>
<serial>4A61D574138A2D6B4B6 </serial>
:return:
"""
code = "rc" in data and int(data["rc"]) or 0
if code==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)
harga = self.vendor_produk.produk.harga
self.status = 1
if not harga:
raise JsonRpcError()
else:
discount = 0
harga = 0
self.status = -1
result = dict(
status="status" in data and data["status"] or "FAILED",
code=code,
message="rcm" in data \
and (data["rcm"] == "00000" and "Sukses" or data["rcm"]) \
or "PENDING",
serial_number="serialnumber" in data and data["serialnumber"] or "",
subtotal=int(harga),
discount=int(discount),
total = int(harga-discount)
)
return result
def inquiry(self):
params = self.get_params(cmd='INQ', modul='ISI')
params["tujuan"] = self.id_pel
params["voucherid"] = self.vendor_produk.kode
self.request = params
self.save_log('inquiry')
log.info("VSI PULSA Request: %s %s" % (self.url, self.request))
try:
result = requests.get(self.url, params=params)
if result.ok:
data = xmltodict.parse(result.text)["root"]
else:
data = dict(code=result.status_code,
message=result.text)
except requests.exceptions.RequestException as e:
data = dict(code=e.errno,
message=e.strerror)
log.info("VSI PULSA Response: %s" % (data))
self.response = data
self.result = self.pars_data(data)
log.info("VSI PULSA Result: %s" % (self.result))
self.save_log('inquiry')
return data
def payment(self):
params = self.get_params(cmd='PAY', modul='ISI')
params["tujuan"] = self.id_pel
params["voucherid"] = self.vendor_produk.kode
self.request = params
log.info("VSI PULSA Payment Request: %s" % (params))
try:
result = requests.get(self.url, params=params)
if result.ok:
data = xmltodict.parse(result.text)["root"]
self.response = data
else:
data = dict(code=result.status_code,
message=result.text)
except requests.exceptions.RequestException as e:
data = dict(code=e.errno,
message=e.strerror)
log.info("VSI PULSA Payment Response: %s" % (data))
self.amt_buy = "harga" in data and data["harga"] or self.amt_buy
self.vend_inv_no = "ref_num" in data and data["ref_num"] or self.vend_inv_no
self.response = data
self.result = self.pars_data(data)
log.info("VSI PULSA Payment Result: %s" % (self.result))
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