() translation by (you can also view the original English article)
Jika Anda telah mengikuti seri ini, Anda harus terbiasa dengan jenis struktur file yang kami siapkan untuk metode pembayaran kustom kita di back-end. Jika Anda belum melalui bagian awal dari seri ini, saya sangat menyarankan Anda membacanya sebelum melanjutkan dengan yang satu ini.
Kita akan menggunakan sejenis pengaturan file untuk bagian front-end juga.
Pengaturan Controller
Silakan membuat file controller di catalog/controller/payment/custom.php
. Tempel konten berikut di file controller custom.php
yang baru dibuat.
1 |
<?php
|
2 |
class ControllerPaymentCustom extends Controller { |
3 |
protected function index() { |
4 |
$this->language->load('payment/custom'); |
5 |
$this->data['button_confirm'] = $this->language->get('button_confirm'); |
6 |
$this->data['action'] = 'https://yourpaymentgatewayurl'; |
7 |
|
8 |
$this->load->model('checkout/order'); |
9 |
$order_info = $this->model_checkout_order->getOrder($this->session->data['order_id']); |
10 |
|
11 |
if ($order_info) { |
12 |
$this->data['text_config_one'] = trim($this->config->get('text_config_one')); |
13 |
$this->data['text_config_two'] = trim($this->config->get('text_config_two')); |
14 |
$this->data['orderid'] = date('His') . $this->session->data['order_id']; |
15 |
$this->data['callbackurl'] = $this->url->link('payment/custom/callback'); |
16 |
$this->data['orderdate'] = date('YmdHis'); |
17 |
$this->data['currency'] = $order_info['currency_code']; |
18 |
$this->data['orderamount'] = $this->currency->format($order_info['total'], $this->data['currency'] , false, false); |
19 |
$this->data['billemail'] = $order_info['email']; |
20 |
$this->data['billphone'] = html_entity_decode($order_info['telephone'], ENT_QUOTES, 'UTF-8'); |
21 |
$this->data['billaddress'] = html_entity_decode($order_info['payment_address_1'], ENT_QUOTES, 'UTF-8'); |
22 |
$this->data['billcountry'] = html_entity_decode($order_info['payment_iso_code_2'], ENT_QUOTES, 'UTF-8'); |
23 |
$this->data['billprovince'] = html_entity_decode($order_info['payment_zone'], ENT_QUOTES, 'UTF-8');; |
24 |
$this->data['billcity'] = html_entity_decode($order_info['payment_city'], ENT_QUOTES, 'UTF-8'); |
25 |
$this->data['billpost'] = html_entity_decode($order_info['payment_postcode'], ENT_QUOTES, 'UTF-8'); |
26 |
$this->data['deliveryname'] = html_entity_decode($order_info['shipping_firstname'] . $order_info['shipping_lastname'], ENT_QUOTES, 'UTF-8'); |
27 |
$this->data['deliveryaddress'] = html_entity_decode($order_info['shipping_address_1'], ENT_QUOTES, 'UTF-8'); |
28 |
$this->data['deliverycity'] = html_entity_decode($order_info['shipping_city'], ENT_QUOTES, 'UTF-8'); |
29 |
$this->data['deliverycountry'] = html_entity_decode($order_info['shipping_iso_code_2'], ENT_QUOTES, 'UTF-8'); |
30 |
$this->data['deliveryprovince'] = html_entity_decode($order_info['shipping_zone'], ENT_QUOTES, 'UTF-8'); |
31 |
$this->data['deliveryemail'] = $order_info['email']; |
32 |
$this->data['deliveryphone'] = html_entity_decode($order_info['telephone'], ENT_QUOTES, 'UTF-8'); |
33 |
$this->data['deliverypost'] = html_entity_decode($order_info['shipping_postcode'], ENT_QUOTES, 'UTF-8'); |
34 |
|
35 |
if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/payment/custom.tpl')){ |
36 |
$this->template = $this->config->get('config_template') . '/template/payment/custom.tpl'; |
37 |
} else { |
38 |
$this->template = 'default/template/payment/custom.tpl'; |
39 |
}
|
40 |
|
41 |
$this->render(); |
42 |
}
|
43 |
}
|
44 |
|
45 |
public function callback() { |
46 |
if (isset($this->request->post['orderid'])) { |
47 |
$order_id = trim(substr(($this->request->post['orderid']), 6)); |
48 |
} else { |
49 |
die('Illegal Access'); |
50 |
}
|
51 |
|
52 |
$this->load->model('checkout/order'); |
53 |
$order_info = $this->model_checkout_order->getOrder($order_id); |
54 |
|
55 |
if ($order_info) { |
56 |
$data = array_merge($this->request->post,$this->request->get); |
57 |
|
58 |
//payment was made successfully
|
59 |
if ($data['status'] == 'Y' || $data['status'] == 'y') { |
60 |
// update the order status accordingly
|
61 |
}
|
62 |
}
|
63 |
}
|
64 |
}
|
65 |
?>
|
Seperti yang Anda lihat, ada dua metode berbeda. Metode index
akan bertanggung jawab untuk menyiapkan data ketika formulir dikirimkan ke gateway pembayaran pihak ketiga, dan metode callback
digunakan untuk menangani data respons dari gateway pembayaran. Karena itu, Anda dapat menentukan lebih banyak metode jika diperlukan oleh gateway pembayaran Anda. Dalam contoh ini, kita menjaga alurnya sesederhana mungkin.
Mari kita bahas setiap bagian secara rinci. Kita akan mulai dengan metode index
.
Pertama, kita telah memuat file bahasa dan mengatur nilai tombol Confirm. Kita juga telah menyiapkan atribut action
yang akan digunakan oleh formulir pengiriman pembayaran. Anda harus mengubahnya sesuai dengan gateway pembayaran Anda.
1 |
$this->language->load('payment/custom'); |
2 |
$this->data['button_confirm'] = $this->language->get('button_confirm'); |
3 |
$this->data['action'] = 'https://yourpaymentgatewayurl'; |
Selanjutnya, kita telah memuat informasi pesanan dari sesi aktif pengguna.
1 |
$this->load->model('checkout/order'); |
2 |
$order_info = $this->model_checkout_order->getOrder($this->session->data['order_id']); |
Jika informasi pemesanan tersedia, kita akan melanjutkan dan mengatur data untuk variabel tersembunyi yang akan digunakan untuk mengirimkan formulir ke URL gateway pembayaran. Jika Anda mengikuti kode ini dengan cermat, Anda akan melihat bahwa kami juga telah menggunakan parameter kustom kami, text_config_one
dan text_config_two
, yang kami konfigurasikan dalam formulir konfigurasi admin di bagian sebelumnya dari seri ini.
Variabel penting lainnya yang perlu diperhatikan di sini adalah callbackurl
, yang menyimpan URL yang digunakan oleh gateway pembayaran untuk mengalihkan pengguna kembali ke toko kita setelah proses pembayaran. Dan ya, melihat URL payment/custom/callback
harus menunjukkan bahwa itu akan memanggil metode callback
, seperti yang akan kita lihat pada saat ini.
1 |
$this->data['text_config_one'] = trim($this->config->get('text_config_one')); |
2 |
$this->data['text_config_two'] = trim($this->config->get('text_config_two')); |
3 |
$this->data['orderid'] = date('His') . $this->session->data['order_id']; |
4 |
$this->data['callbackurl'] = $this->url->link('payment/custom/callback'); |
5 |
$this->data['orderdate'] = date('YmdHis'); |
6 |
$this->data['currency'] = $order_info['currency_code']; |
7 |
$this->data['orderamount'] = $this->currency->format($order_info['total'], $this->data['currency'] , false, false); |
8 |
$this->data['billemail'] = $order_info['email']; |
9 |
$this->data['billphone'] = html_entity_decode($order_info['telephone'], ENT_QUOTES, 'UTF-8'); |
10 |
$this->data['billaddress'] = html_entity_decode($order_info['payment_address_1'], ENT_QUOTES, 'UTF-8'); |
11 |
$this->data['billcountry'] = html_entity_decode($order_info['payment_iso_code_2'], ENT_QUOTES, 'UTF-8'); |
12 |
$this->data['billprovince'] = html_entity_decode($order_info['payment_zone'], ENT_QUOTES, 'UTF-8');; |
13 |
$this->data['billcity'] = html_entity_decode($order_info['payment_city'], ENT_QUOTES, 'UTF-8'); |
14 |
$this->data['billpost'] = html_entity_decode($order_info['payment_postcode'], ENT_QUOTES, 'UTF-8'); |
15 |
$this->data['deliveryname'] = html_entity_decode($order_info['shipping_firstname'] . $order_info['shipping_lastname'], ENT_QUOTES, 'UTF-8'); |
16 |
$this->data['deliveryaddress'] = html_entity_decode($order_info['shipping_address_1'], ENT_QUOTES, 'UTF-8'); |
17 |
$this->data['deliverycity'] = html_entity_decode($order_info['shipping_city'], ENT_QUOTES, 'UTF-8'); |
18 |
$this->data['deliverycountry'] = html_entity_decode($order_info['shipping_iso_code_2'], ENT_QUOTES, 'UTF-8'); |
19 |
$this->data['deliveryprovince'] = html_entity_decode($order_info['shipping_zone'], ENT_QUOTES, 'UTF-8'); |
20 |
$this->data['deliveryemail'] = $order_info['email']; |
21 |
$this->data['deliveryphone'] = html_entity_decode($order_info['telephone'], ENT_QUOTES, 'UTF-8'); |
22 |
$this->data['deliverypost'] = html_entity_decode($order_info['shipping_postcode'], ENT_QUOTES, 'UTF-8'); |
Akhirnya, kita menetapkan file template kustom custom.tpl
kita dan me-render view.
1 |
if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/payment/custom.tpl')){ |
2 |
$this->template = $this->config->get('config_template') . '/template/payment/custom.tpl'; |
3 |
} else { |
4 |
$this->template = 'default/template/payment/custom.tpl'; |
5 |
}
|
6 |
|
7 |
$this->render(); |
Mari kita tinjau kode dari metode callback
. Metode ini akan dipanggil ketika pengguna kembali ke toko dari situs gateway pembayaran.
Pertama, kita memeriksa apakah variabel orderid
tersedia atau tidak sebelum melanjutkan lebih jauh. Jika tidak tersedia, kita hanya berhenti memproses lebih lanjut.
1 |
if (isset($this->request->post['orderid'])) { |
2 |
$order_id = trim(substr(($this->request->post['orderid']), 6)); |
3 |
} else { |
4 |
die('Illegal Access'); |
5 |
}
|
Selanjutnya, kita memuat informasi pemesanan dari database. Dan akhirnya, kita akan memeriksa apakah kita mendapat indikator success
dari respons gateway pembayaran. Jika demikian, kita akan melanjutkan dan memperbarui informasi status pesanan yang sesuai.
1 |
$this->load->model('checkout/order'); |
2 |
$order_info = $this->model_checkout_order->getOrder($order_id); |
3 |
|
4 |
if ($order_info) { |
5 |
$data = array_merge($this->request->post,$this->request->get); |
6 |
|
7 |
//payment was made succ
|
8 |
if ($data['status'] == 'Y' || $data['status'] == 'y') { |
9 |
// update the order status accordingly
|
10 |
}
|
11 |
}
|
Itu pengaturan controller. Sederhana, bukan?
Model Konvensional
Seperti yang Anda ketahui, OpenCart memiliki kumpulan konvensi dan standar tersendiri untuk menangani cara kerja bagian dalam toko. Seperti halnya dengan pengaturan model untuk deteksi metode pembayaran. Anda hanya mengaturnya sesuai konvensi, dan itu akan diambil secara otomatis.
Silakan membuat file model di catalog/model/payment/custom.php
. Tempel konten berikut di file model custom.php
yang baru dibuat.
1 |
<?php
|
2 |
class ModelPaymentCustom extends Model { |
3 |
public function getMethod($address, $total) { |
4 |
$this->load->language('payment/custom'); |
5 |
|
6 |
$method_data = array( |
7 |
'code' => 'custom', |
8 |
'title' => $this->language->get('text_title'), |
9 |
'sort_order' => $this->config->get('custom_sort_order') |
10 |
);
|
11 |
|
12 |
return $method_data; |
13 |
}
|
14 |
}
|
Kelas ini akan digunakan oleh OpenCart ketika mencantumkan metode pembayaran aktif selama proses checkout. Selama proses ini, OpenCart mengumpulkan daftar metode pembayaran aktif dari back-end, dan untuk setiap metode itu akan memeriksa apakah kelas model yang sesuai tersedia atau tidak. Metode pembayaran hanya akan dicantumkan jika kelas model terkait tersedia.
Yang penting dalam pengaturan ini adalah nilai dari variabel code
. Dalam kasus kita, kita telah menetapkannya menjadi custom
, yang berarti bahwa ketika Anda memilih metode pembayaran dan menekan Continue, itu akan memanggil URL payment/custom
secara internal, yang akhirnya menyiapkan formulir untuk gateway pembayaran kita.
Singkatnya, kita dapat mengatakan bahwa itu adalah file wajib untuk deteksi dan kerja yang tepat dari metode pembayaran di front-end.
File Bahasa dan Template
Sekarang, kita hanya perlu membuat file bahasa dan view. Silakan membuat file bahasa di catalog/language/english/payment/custom.php
. Tempel konten berikut di file bahasa custom.php
yang baru dibuat.
1 |
<?php |
2 |
$_['text_title'] = 'Custom Payment Method'; |
3 |
$_['button_confirm'] = 'Confirm Order'; |
4 |
?> |
Cukup mudah dimengerti: kita baru saja menyiapkan label yang akan digunakan di front-end saat checkout.
Silakan membuat file template di catalog/view/theme/default/template/payment/custom.tpl
. Tempel konten berikut di file template custom.tpl
yang baru dibuat.
1 |
<form action="<?php echo $action; ?>" method="post"> |
2 |
<input type="hidden" name="text_config_one" value="<?php echo $text_config_one; ?>" /> |
3 |
<input type="hidden" name="text_config_two" value="<?php echo $text_config_two; ?>" /> |
4 |
<input type="hidden" name="orderid" value="<?php echo $orderid; ?>" /> |
5 |
<input type="hidden" name="callbackurl" value="<?php echo $callbackurl; ?>" /> |
6 |
<input type="hidden" name="orderdate" value="<?php echo $orderdate; ?>" /> |
7 |
<input type="hidden" name="currency" value="<?php echo $currency; ?>" /> |
8 |
<input type="hidden" name="orderamount" value="<?php echo $orderamount; ?>" /> |
9 |
<input type="hidden" name="billemail" value="<?php echo $billemail; ?>" /> |
10 |
<input type="hidden" name="billphone" value="<?php echo $billphone; ?>" /> |
11 |
<input type="hidden" name="billaddress" value="<?php echo $billaddress; ?>" /> |
12 |
<input type="hidden" name="billcountry" value="<?php echo $billcountry; ?>" /> |
13 |
<input type="hidden" name="billprovince" value="<?php echo $billprovince; ?>" /> |
14 |
<input type="hidden" name="billcity" value="<?php echo $billcity; ?>" /> |
15 |
<input type="hidden" name="billpost" value="<?php echo $billpost; ?>" /> |
16 |
<input type="hidden" name="deliveryname" value="<?php echo $deliveryname; ?>" /> |
17 |
<input type="hidden" name="deliveryaddress" value="<?php echo $deliveryaddress; ?>" /> |
18 |
<input type="hidden" name="deliverycity" value="<?php echo $deliverycity; ?>" /> |
19 |
<input type="hidden" name="deliverycountry" value="<?php echo $deliverycountry; ?>" /> |
20 |
<input type="hidden" name="deliveryprovince" value="<?php echo $deliveryprovince; ?>" /> |
21 |
<input type="hidden" name="deliveryemail" value="<?php echo $deliveryemail; ?>" /> |
22 |
<input type="hidden" name="deliveryphone" value="<?php echo $deliveryphone; ?>" /> |
23 |
<input type="hidden" name="deliverypost" value="<?php echo $deliverypost; ?>" /> |
24 |
|
25 |
<div class="buttons"> |
26 |
<div class="right"> |
27 |
<input type="submit" value="<?php echo $button_confirm; ?>" class="button" /> |
28 |
</div>
|
29 |
</div>
|
30 |
</form>
|
Seperti yang Anda duga, ini adalah formulir yang akan dikirimkan ketika pengguna mengklik tombol Confirm Order. Kita baru saja mengatur variabel tersembunyi dan nilai-nilai mereka yang sebelumnya didefinisikan dalam metode index
dari controller.
Mari kita lihat bagaimana tampilannya di front-end:



Mari kita dengan cepat melalui keseluruhan alurnya:
- Pertama, Anda harus menyiapkan file model untuk metode pembayaran Anda sehingga dapat dicantumkan di Langkah 5: Tab Metode Pembayaran.
- Selanjutnya, ketika pengguna memilih Custom Payment Method di tab kelima dan klik pada tombol Continue, OpenCart secara internal memanggil URL
payment/custom
, yang memanggil metodeindex
pada akhirnya dan me-render filecustom.tpl
di tab keenam.
- Akhirnya, ketika pengguna mengklik tombol Confirm Order, formulir akan dikirimkan dan pengguna dibawa ke situs gateway pembayaran tempat proses pembayaran dimulai. Setelah proses pembayaran selesai, pengguna akan diarahkan kembali ke situs kita, berkat variabel tersembunyi
callbackurl
. Tentu saja, status pesanan akan diperbarui sebagai bagian dari metodecallback
jika semuanya telah beroperasi seperti yang diharapkan.
Kesimpulan
Dalam seri ini, saya telah menjelaskan cara menyiapkan hampir semua metode pembayaran dengan membuat modul metode pembayaran Anda sendiri. Saya harap Anda menikmati seri ini dan belajar sesuatu yang bermanfaat.
Selalu menyenangkan membuat barang-barang kustom untuk kerangka apa pun, bukan? Ingat Anda selalu dapat memberikan komentar dan pertanyaan menggunakan formulir komentar di bawah ini.