· 7 years ago · Jul 31, 2018, 08:56 PM
1<?php
2/*
3Script ini hanyalah contoh. Untuk implementasi silahkan sesuaikan dengan struktur database di kampus.
4*/
5// konfigurasi
6$kampus = 'Universitas Test';
7$secret_key = 'ahjsg@6567JHJ47KJHksa;pd'; // contoh
8
9//$allowed_ips = array('119.2.80.1', '119.2.80.2', '119.2.80.3'); // ini adalah IP Switching Makara. Silahkan ditambahkan IP mana saja yang diperbolehkan akses.
10$allowed_ips = array('127.0.0.1','::1'); // Ini IP localhost untuk testing
11$allowed_collecting_agents = array('BSM'); // Bank mana aja yg bekerja sama.
12$allowed_channels = array('TELLER', 'IBANK', 'ATM', 'SMS','MBANK');
13$db_host = 'localhost';
14$db_user = 'root'; // contoh
15$db_pass = 'ashdasasdsa7868'; // contoh
16$db_name = 'simak'; // contoh
17
18$log_directory = '/var/log/h2h/'; // harus writable
19
20
21// start functions -------------------------------------------------------------
22function debugLog($o) {
23 // ini adalah fungsi untuk menulis log setiap request dan response ke dalam sebuah file.
24 // Jika ada waktu, silahkan buat loh nya ke dalam database.
25 $file_debug = $GLOBALS['log_directory'] . 'debug-h2h-' . date("Y-m-d") . '.log';
26 ob_start();
27 var_dump(date("Y-m-d h:i:s"));
28 var_dump($o);
29 $c = ob_get_contents();
30 ob_end_clean();
31
32 $f = fopen($file_debug, "a");
33 fputs($f, "$c\n");
34 fflush($f);
35 fclose($f);
36}
37function response($arrayData){
38 echo json_encode($arrayData,JSON_FORCE_OBJECT);
39 exit();
40}
41// end functions ---------------------------------------------------------------
42
43$request = json_decode($_POST['request'],true);
44debugLog('REQUEST: ');
45debugLog($request);
46
47if ($request === false){
48 response(array(
49 'code' => '30',
50 'message' => 'Salah format request dari bank'
51 ));
52}
53if (!in_array($_SERVER['REMOTE_ADDR'],$allowed_ips)) {
54 response(array(
55 'code' => 'NA',
56 'message' => 'Fungsi tidak diperbolehkan dari ' . $_SERVER['REMOTE_ADDR']
57 ));
58}
59if (sha1($request['nomorPembayaran'].$secret_key.$request['tanggalTransaksi']) != $request['checksum']) {
60 response(array(
61 'code' => 'NA',
62 'message' => 'Fungsi tidak diperbolehkan di ' . $kampus
63 ));
64}
65//asumsinya database pakai MySQL, silahkan sesuaikan dengan database kampus
66/*$koneksi = mysqli_connect($db_host, $db_user, $db_pass,$db_name);
67if (!$koneksi) {
68 response(array(
69 'code' => '91',
70 'message' => 'Gagal koneksi database di ' . $kampus
71 ));
72}*/
73
74switch ($_POST['action']) {
75 case 'inquiry':
76 // ini yang dikirim oleh bank
77 $kodeBank = $request['kodeBank'];
78 $kodeChannel = $request['kodeChannel'];
79 $kodeTerminal = $request['kodeTerminal'];
80 $nomorPembayaran = $request['nomorPembayaran'];
81 $tanggalTransaksi = $request['tanggalTransaksi'];
82 $idTransaksi = $request['idTransaksi'];
83
84 // mulai proses
85 // cek apakah variable yang dikirim lengkap?
86 if (empty($kodeBank) || empty($kodeChannel) || empty($kodeTerminal) || empty($nomorPembayaran) || empty($tanggalTransaksi) || empty($idTransaksi)) {
87 response(array(
88 'code' => '30',
89 'message' => 'Salah format message dari bank'
90 ));
91 }
92 // cek apakah bank terdaftar?
93 if (!in_array($kodeBank, $allowed_collecting_agents)) {
94 response(array(
95 'code' => '31',
96 'message' => 'Collecting agent tidak terdaftar di ' . $kampus
97 ));
98 }
99 // cek apakah channel disupport?
100 if (!in_array($kodeChannel, $allowed_channels)) {
101 response(array(
102 'code' => '58',
103 'message' => 'Channel tidak diperbolehkan di ' . $kampus
104 ));
105 }
106 // cek apakah ada data tagihan?
107 $isAdaTagihan = true; // silahkan cek di database apakah ada tagihan dengan nomor pembayaran tersebut?
108 if ($isAdaTagihan == false) {
109 response(array(
110 'code' => '14',
111 'message' => 'Tagihan tidak ditemukan di ' . $kampus
112 ));
113 }
114 // cek apakah masih dalam periode pembayaran yang diperbolehkan?
115 $isDalamPeriodepembayaran = true; // silahkan cek di database apakah tagihan masih dalam periode pembayaran?
116 if ($isDalamPeriodepembayaran == false) {
117 response(array(
118 'code' => '14',
119 'message' => 'Tidak berlaku periode bayar di ' . $kampus
120 ));
121 }
122 // cek apakah sudah lunas apa belum?
123 $sudahLunas = true; // silahkan cek di database apakah tagihan tersebut sudah lunas apa belum.
124 if ($sudahLunas == true) {
125 response(array(
126 'code' => '88',
127 'message' => 'Tagihan sudah terbayar di ' . $kampus
128 ));
129 }
130 $dataTagihan = array( // silahkan diambil dari database untuk datagihannya
131 'nomorPembayaran' => $nomorPembayaran,
132 'idTagihan' => 'abc123456',
133 'nomorInduk' => '123456',
134 'nama' => 'Abdulloh Umar',
135 'fakultas' => 'Ekonomi',
136 'jurusan' => 'Manajemen',
137 'strata' => 'S1',
138 'periode' => '2016/2017',
139 'angkatan' => '2015',
140 'totalNominal' => 1000000,
141 'rincianTagihan' => array(
142 array(
143 'kodeDetailTagihan' => '123',
144 'deskripsiPendek' => 'SPP',
145 'deskripsiPanjang' => 'Sumbangan Pembinaan Pendidikan',
146 'nominal' => 700000
147 ),
148 array(
149 'kodeDetailTagihan' => '45678',
150 'deskripsiPendek' => 'GEDUNG',
151 'deskripsiPanjang' => 'Uang Gedung',
152 'nominal' => 300000
153 )
154 )
155 );
156 if (!is_array($dataTagihan)) {
157 response(array(
158 'code' => '14',
159 'message' => 'Tagihan yang bisa dibayar tidak ditemukan di ' . $kampus
160 ));
161 }
162 $jumlahRincian = count($dataTagihan['rincianTagihan']);
163 $total_nominal_rincian = 0;
164 for ($i = 0; $i < $jumlahRincian; $i++) {
165 $total_nominal_rincian += $dataTagihan['rincianTagihan'][$i]['nominal'];
166 }
167 if ($total_nominal_rincian != $dataTagihan['totalNominal']) {
168 response(array(
169 'code' => '30',
170 'message' => 'Salah format nilai tagihan dari ' . $kampus
171 ));
172 }
173
174 debugLog('RESPONSE: ');
175 debugLog($dataTagihan);
176 response(array(
177 'code' => '00',
178 'message' => 'Inquiry berhasil di '.$kampus,
179 'data' => $dataTagihan
180 ));
181 break;
182
183 case 'payment':
184 // ini yang dikirim oleh bank
185 $kodeBank = $request['kodeBank'];
186 $kodeChannel = $request['kodeChannel'];
187 $kodeTerminal = $request['kodeTerminal'];
188 $nomorPembayaran = $request['nomorPembayaran'];
189 $idTagihan = $request['idTagihan']; // tidak mandatory
190 $tanggalTransaksi = $request['tanggalTransaksi'];
191 $idTransaksi = $request['idTransaksi'];
192 $totalNominal = $request['totalNominal'];
193 $nomorJurnalPembukuan = $request['nomorJurnalPembukuan'];
194 $rincianTagihan = $request['rincianTagihan'];
195 // mulai proses
196 // cek apakah variable yang dikirim lengkap?
197 if (empty($kodeBank) || empty($kodeChannel) || empty($kodeTerminal) || empty($nomorPembayaran) || empty($tanggalTransaksi) || empty($idTransaksi) || empty($totalNominal) || empty($nomorJurnalPembukuan) || empty($rincianTagihan)) {
198 response(array(
199 'code' => '30',
200 'message' => 'Salah format message dari bank'
201 ));
202 }
203 // cek apakah bank terdaftar?
204 if (!in_array($kodeBank, $allowed_collecting_agents)) {
205 response(array(
206 'code' => '31',
207 'message' => 'Collecting agent tidak terdaftar di ' . $kampus
208 ));
209 }
210 // cek apakah channel disupport?
211 if (!in_array($kodeChannel, $allowed_channels)) {
212 response(array(
213 'code' => '58',
214 'message' => 'Channel tidak diperbolehkan di ' . $kampus
215 ));
216 }
217
218 $jumlahRincian = count($rincianTagihan);
219 $total_nominal_rincian = 0;
220 for ($i = 0; $i < $jumlahRincian; $i++) {
221 $total_nominal_rincian += $rincianTagihan[$i]['nominal'];
222 }
223 if ($total_nominal_rincian != $totalNominal) {
224 response(array(
225 'code' => '30',
226 'message' => 'Salah format nilai tagihan dari bank'
227 ));
228 }
229
230 // cek apakah ada data tagihan?
231 $isAdaTagihan = true; // silahkan cek di database apakah ada tagihan dengan nomor pembayaran tersebut?
232 if ($isAdaTagihan == false) {
233 response(array(
234 'code' => '14',
235 'message' => 'Tagihan tidak ditemukan di ' . $kampus
236 ));
237 }
238 // cek apakah masih dalam periode pembayaran yang diperbolehkan?
239 $isDalamPeriodepembayaran = true; // silahkan cek di database apakah tagihan masih dalam periode pembayaran?
240 if ($isDalamPeriodepembayaran == false) {
241 response(array(
242 'code' => '14',
243 'message' => 'Tidak berlaku periode bayar di ' . $kampus
244 ));
245 }
246 // cek apakah sudah lunas apa belum?
247 $sudahLunas = false; // silahkan cek di database apakah tagihan tersebut sudah lunas apa belum.
248 if ($sudahLunas == true) {
249 response(array(
250 'code' => '88',
251 'message' => 'Tagihan sudah terbayar di ' . $kampus
252 ));
253 }
254 $dataTagihan = array( // silahkan diambil dari database untuk datagihannya
255 'nomorPembayaran' => $nomorPembayaran,
256 'idTagihan' => 'abc123456',
257 'nomorInduk' => '123456',
258 'nama' => 'Abdulloh Umar',
259 'fakultas' => 'Ekonomi',
260 'jurusan' => 'Manajemen',
261 'strata' => 'S1',
262 'periode' => '2016/2017',
263 'angkatan' => '2015',
264 'totalNominal' => 1000000,
265 'rincianTagihan' => array(
266 array(
267 'kodeDetailTagihan' => '123',
268 'deskripsiPendek' => 'SPP',
269 'deskripsiPanjang' => 'Sumbangan Pembinaan Pendidikan',
270 'nominal' => 700000
271 ),
272 array(
273 'kodeDetailTagihan' => '45678',
274 'deskripsiPendek' => 'GEDUNG',
275 'deskripsiPanjang' => 'Uang Gedung',
276 'nominal' => 300000
277 )
278 )
279 );
280 if (!is_array($dataTagihan)) {
281 response(array(
282 'code' => '14',
283 'message' => 'Tagihan yang bisa dibayar tidak ditemukan di ' . $kampus
284 ));
285 }
286 $jumlahRincian = count($dataTagihan['rincianTagihan']);
287 $total_nominal_rincian = 0;
288 for ($i = 0; $i < $jumlahRincian; $i++) {
289 $total_nominal_rincian += $dataTagihan['rincianTagihan'][$i]['nominal'];
290 }
291 if ($total_nominal_rincian != $dataTagihan['totalNominal']) {
292 response(array(
293 'code' => '30',
294 'message' => 'Salah format nilai tagihan dari ' . $kampus
295 ));
296 }
297
298 $prosesmasukkanDatabase = true; // Silahkan memasukkan data pembayaran ke database.
299 if ($prosesmasukkanDatabase == false) {
300 response(array(
301 'code' => '91',
302 'message' => 'Database error saat proses FLAG Bayar di ' . $kampus
303 ));
304 }
305 unset($dataTagihan['rincianTagihan']); // rincianTagihan tidak diperlukan saat payment response
306 debugLog('RESPONSE:');
307 debugLog($dataTagihan);
308 response(array(
309 'code' => '00',
310 'message' => 'Pembayaran sukses dicatat di '.$kampus,
311 'data' => $dataTagihan
312 ));
313 break;
314
315 case 'reversal':
316 // ini yang dikirim oleh bank
317 $kodeBank = $request['kodeBank'];
318 $kodeChannel = $request['kodeChannel'];
319 $kodeTerminal = $request['kodeTerminal'];
320 $nomorPembayaran = $request['nomorPembayaran'];
321 $idTagihan = $request['idTagihan']; // tidak mandatory
322 $tanggalTransaksi = $request['tanggalTransaksi'];
323 $tanggalTransaksiAsal = $request['tanggalTransaksiAsal'];
324 $nomorJurnalPembukuan = $request['nomorJurnalPembukuan'];
325 $idTransaksi = $request['idTransaksi'];
326 $totalNominal = $request['totalNominal'];
327
328 // mulai proses
329 // cek apakah variable yang dikirim lengkap?
330 if (empty($kodeBank) || empty($kodeChannel) || empty($kodeTerminal) || empty($nomorPembayaran) || empty($tanggalTransaksi) || empty($tanggalTransaksiAsal) || empty($nomorJurnalPembukuan) || empty($totalNominal)) {
331 response(array(
332 'code' => '30',
333 'message' => 'Salah format message dari bank'
334 ));
335 }
336 // cek apakah bank terdaftar?
337 if (!in_array($kodeBank, $allowed_collecting_agents)) {
338 response(array(
339 'code' => '31',
340 'message' => 'Collecting agent tidak terdaftar di '.$kampus
341 ));
342 }
343 // cek apakah channel disupport?
344 if (!in_array($kodeChannel, $allowed_channels)) {
345 response(array(
346 'code' => '58',
347 'message' => 'Collecting agent tidak terdaftar di '.$kampus
348 ));
349 }
350 // cek apakah ada transaksi pembayaran tersebut sebelumnya?
351 $isAdaDataPembayaranSebelumnya = true; // silahkan cek di database
352 if ($isAdaDataPembayaranSebelumnya == false) {
353 response(array(
354 'code' => '63',
355 'message' => 'Reversal ditolak. Tagihan belum dibayar di '.$kampus
356 ));
357 }
358
359 $isSudahDireversal = false; // cek di database apakah sudah dilakukan reversal sebelumnya
360 if ($isSudahDireversal == true) {
361 response(array(
362 'code' => '94',
363 'message' => 'Reversal ditolak. Reversal sebelumnya sudah dilakukan di '.$kampus
364 ));
365 }
366 $dataTagihan = array( // silahkan diambil dari database untuk datagihannya
367 'nomorPembayaran' => $nomorPembayaran,
368 'idTagihan' => 'abc123456',
369 'nomorInduk' => '123456',
370 'nama' => 'Abdulloh Umar',
371 'fakultas' => 'Ekonomi',
372 'jurusan' => 'Manajemen',
373 'strata' => 'S1',
374 'periode' => '2016/2017',
375 'angkatan' => '2015',
376 'totalNominal' => 1000000
377 );
378 if (!is_array($dataTagihan)) {
379 response(array(
380 'code' => '14',
381 'message' => 'Tagihan tidak ditemukan di ' . $kampus
382 ));
383 }
384 $prosesReversalDiDatabase = true; // Silahkan membatalkan data pembayaran ke database.
385 if ($prosesReversalDiDatabase == false) {
386 response(array(
387 'code' => '91',
388 'message' => 'Database error saat proses FLAG Reversal di ' . $kampus
389 ));
390 }
391 debugLog('RESPONSE:');
392 debugLog($dataTagihan);
393 response(array(
394 'code' => '00',
395 'message' => 'Reversal sukses dilakukan di '.$kampus,
396 'data' => $dataTagihan
397 ));
398 break;
399
400 default:
401 response(array(
402 'code' => '30',
403 'message' => 'Fungsi tidak tersedia di '.$kampus,
404 'data' => $dataTagihan
405 ));
406}