Від автора: якщо ви слідували разом з цією серією, то повинні бути знайомі з тією структурою файлів, яку ми створили для нашого користувача способу оплати у фоновому режимі. Якщо більш ранні частини цієї серії вам не знайомі, я настійно рекомендую прочитати їх (частина 1, частина 2), перш ніж приступати до цієї.
Щоб додати в OpenCart способи оплати, ми будемо використовувати аналогічну налаштування файлу для розділу front-end.
Налаштування контролера
Створюємо файл контролера catalog/controller/payment/custom.php. Вставляємо наступне вміст в створений файл контролера custom.php.
language->load(‘payment/custom’);
$this->data[‘button_confirm’] = $this->language->get(‘button_confirm’);
$this->data[‘action’] = ‘https://yourpaymentgatewayurl’;
$this->load->model(‘checkout/order’);
$order_info = $this->model_checkout_order->getOrder($this->session->data[‘order_id’]);
if ($order_info) {
$this->data[‘text_config_one’] = trim($this->config->get(‘text_config_one’));
$this->data[‘text_config_two’] = trim($this->config->get(‘text_config_two’));
$this->data[‘orderid’] = date(‘His’) . $this->session->data[‘order_id’];
$this->data[‘callbackurl’] = $this->url->link(‘payment/custom/callback’);
$this->data[‘orderdate’] = date(‘YmdHis’);
$this->data[‘currency’] = $order_info[‘currency_code’];
$this->data[‘orderamount’] = $this->currency->format($order_info[‘total’], $this->data[‘currency’] , false, false);
$this->data[‘billemail’] = $order_info[’email’];
$this->data[‘billphone’] = html_entity_decode($order_info[‘telephone’], ENT_QUOTES, ‘UTF-8’);
$this->data[‘billaddress’] = html_entity_decode($order_info[‘payment_address_1’], ENT_QUOTES, ‘UTF-8’);
$this->data[‘billcountry’] = html_entity_decode($order_info[‘payment_iso_code_2’], ENT_QUOTES, ‘UTF-8’);
$this->data[‘billprovince’] = html_entity_decode($order_info[‘payment_zone’], ENT_QUOTES, ‘UTF-8’);;
$this->data[‘billcity’] = html_entity_decode($order_info[‘payment_city’], ENT_QUOTES, ‘UTF-8’);
$this->data[‘billpost’] = html_entity_decode($order_info[‘payment_postcode’], ENT_QUOTES, ‘UTF-8’);
$this->data[‘deliveryname’] = html_entity_decode($order_info[‘shipping_firstname’] . $order_info[‘shipping_lastname’], ENT_QUOTES, ‘UTF-8’);
$this->data[‘deliveryaddress’] = html_entity_decode($order_info[‘shipping_address_1’], ENT_QUOTES, ‘UTF-8’);
$this->data[‘deliverycity’] = html_entity_decode($order_info[‘shipping_city’], ENT_QUOTES, ‘UTF-8’);
$this->data[‘deliverycountry’] = html_entity_decode($order_info[‘shipping_iso_code_2’], ENT_QUOTES, ‘UTF-8’);
$this->data[‘deliveryprovince’] = html_entity_decode($order_info[‘shipping_zone’], ENT_QUOTES, ‘UTF-8’);
$this->data[‘deliveryemail’] = $order_info[’email’];
$this->data[‘deliveryphone’] = html_entity_decode($order_info[‘telephone’], ENT_QUOTES, ‘UTF-8’);
$this->data[‘deliverypost’] = html_entity_decode($order_info[‘shipping_postcode’], ENT_QUOTES, ‘UTF-8’);
if (file_exists(DIR_TEMPLATE . $this->config->get(‘config_template’) . ‘/template/payment/custom.tpl’)){
$this->template = $this->config->get(‘config_template’) . ‘/template/payment/custom.tpl’;
} else {
$this->template = ‘default/template/payment/custom.tpl’;
}
$this->render();
}
}
public callback function() {
if (isset($this->request->post[‘orderid’])) {
$order_id = trim(substr(($this->request->post[‘orderid’]), 6));
} else {
die(‘Illegal Access’);
}
$this->load->model(‘checkout/order’);
$order_info = $this->model_checkout_order->getOrder($order_id);
if ($order_info) {
$data = array_merge($this->request->post,$this->request->get);
//payment was made successfully
if ($data[‘status’] == ‘Y’ || $data[‘status’] == ‘y’) {
// update the order status accordingly
}
}
}
}
?>
Як можна побачити, існують два різних методу. index метод буде відповідати за налаштування даних, коли форма буде відправлена на шлюз третьої сторони, а callback метод використовується для обробки даних відповіді з платіжного шлюзу. Можна визначити більше методів, якщо це потрібно платіжним шлюзом. Але в цьому прикладі ми все максимально спростили. Давайте детально розглянемо кожний розділ. Почнемо з методу index.
Спочатку ми завантажуємо мовний файл і встановлюємо значення кнопки Confirm. Також ми встановлюємо атрибут action, який буде використовуватися формою відправлення платежу. При необхідності міняйте це у відповідності з платіжним шлюзом.
Інтернет-магазин на OpenCart!
Створити інтернет-магазин на самій популярної CMS OpenCart з нуля!
Приступити до створення
$this->language->load(‘payment/custom’);
$this->data[‘button_confirm’] = $this->language->get(‘button_confirm’);
$this->data[‘action’] = ‘https://yourpaymentgatewayurl’;
Потім ми завантажуємо інформацію про замовлення з активного сеансу користувача.
$this->load->model(‘checkout/order’);
$order_info = $this->model_checkout_order->getOrder($this->session->data[‘order_id’]);
Якщо інформація про замовлення доступна, ми продовжуємо роботу і налаштовуємо дані для прихованих змінних, які будуть використовуватися для відправки форми на URL-адресу платіжного шлюзу. Якщо ви уважно стежили за кодом, то помітили, що ми використовували власні параметри text_config_one і text_config_two, які встановили у формі конфігурації адміністратора в попередній частині цієї серії.
Інша важлива змінна callbackurl, яка тут вказана, — це URL-адреса, що використовується шлюзом платежів для перенаправлення користувача назад в магазин після процесу оплати. Ми побачимо, як URL-адресу, payment/custom/callback викличе метод callback в певний момент.
$this->data[‘text_config_one’] = trim($this->config->get(‘text_config_one’));
$this->data[‘text_config_two’] = trim($this->config->get(‘text_config_two’));
$this->data[‘orderid’] = date(‘His’) . $this->session->data[‘order_id’];
$this->data[‘callbackurl’] = $this->url->link(‘payment/custom/callback’);
$this->data[‘orderdate’] = date(‘YmdHis’);
$this->data[‘currency’] = $order_info[‘currency_code’];
$this->data[‘orderamount’] = $this->currency->format($order_info[‘total’], $this->data[‘currency’] , false, false);
$this->data[‘billemail’] = $order_info[’email’];
$this->data[‘billphone’] = html_entity_decode($order_info[‘telephone’], ENT_QUOTES, ‘UTF-8’);
$this->data[‘billaddress’] = html_entity_decode($order_info[‘payment_address_1’], ENT_QUOTES, ‘UTF-8’);
$this->data[‘billcountry’] = html_entity_decode($order_info[‘payment_iso_code_2’], ENT_QUOTES, ‘UTF-8’);
$this->data[‘billprovince’] = html_entity_decode($order_info[‘payment_zone’], ENT_QUOTES, ‘UTF-8’);;
$this->data[‘billcity’] = html_entity_decode($order_info[‘payment_city’], ENT_QUOTES, ‘UTF-8’);
$this->data[‘billpost’] = html_entity_decode($order_info[‘payment_postcode’], ENT_QUOTES, ‘UTF-8’);
$this->data[‘deliveryname’] = html_entity_decode($order_info[‘shipping_firstname’] . $order_info[‘shipping_lastname’], ENT_QUOTES, ‘UTF-8’);
$this->data[‘deliveryaddress’] = html_entity_decode($order_info[‘shipping_address_1’], ENT_QUOTES, ‘UTF-8’);
$this->data[‘deliverycity’] = html_entity_decode($order_info[‘shipping_city’], ENT_QUOTES, ‘UTF-8’);
$this->data[‘deliverycountry’] = html_entity_decode($order_info[‘shipping_iso_code_2’], ENT_QUOTES, ‘UTF-8’);
$this->data[‘deliveryprovince’] = html_entity_decode($order_info[‘shipping_zone’], ENT_QUOTES, ‘UTF-8’);
$this->data[‘deliveryemail’] = $order_info[’email’];
$this->data[‘deliveryphone’] = html_entity_decode($order_info[‘telephone’], ENT_QUOTES, ‘UTF-8’);
$this->data[‘deliverypost’] = html_entity_decode($order_info[‘shipping_postcode’], ENT_QUOTES, ‘UTF-8’);
Нарешті, ми призначаємо власний файл шаблону custom.tpl і пропонуємо подання.
if (file_exists(DIR_TEMPLATE . $this->config->get(‘config_template’) . ‘/template/payment/custom.tpl’)){
$this->template = $this->config->get(‘config_template’) . ‘/template/payment/custom.tpl’;
} else {
$this->template = ‘default/template/payment/custom.tpl’;
}
$this->render();
Давайте розглянемо код callback методу. Цей метод викликається, коли користувач повертається в магазин з сайту шлюзу оплати. Перш ніж продовжити, ми перевіряємо, чи є змінна orderid чи ні. Якщо немає, ми просто припиняємо подальшу обробку.
if (isset($this->request->post[‘orderid’])) {
$order_id = trim(substr(($this->request->post[‘orderid’]), 6));
} else {
die(‘Illegal Access’);
}
Потім ми завантажуємо інформацію про замовлення з бази даних. І перевіряємо, чи є індикатор success з відповіді платіжного шлюзу. Якщо є, ми продовжуємо оновлювати інформацію про статус замовлення відповідним чином.
$this->load->model(‘checkout/order’);
$order_info = $this->model_checkout_order->getOrder($order_id);
if ($order_info) {
$data = array_merge($this->request->post,$this->request->get);
//payment was made succ
if ($data[‘status’] == ‘Y’ || $data[‘status’] == ‘y’) {
// update the order status accordingly
}
}
Це була налаштування контролера. Просто, чи не так?
Стандартна модель
Як ви, напевно, знаєте, OpenCart має власний набір стандартів і угод для взаємодії з внутрішньою роботою магазину. Те ж саме і у випадку з установкою моделі для виявлення способу оплати. Досить його просто налаштувати згідно стандарту та угодами, і він буде автоматично підібраний. Створюємо файл моделі catalog/model/payment/custom.php. Вставляємо наступне вміст в створений файл моделі custom.php.
Інтернет-магазин на OpenCart!
Створити інтернет-магазин на самій популярної CMS OpenCart з нуля!
Приступити до створення
load->language(‘payment/custom’);
$method_data = array(
‘code’ => ‘custom’,
‘title’ => $this->language->get(‘text_title’),
‘sort_order’ => $this->config->get(‘custom_sort_order’)
);
return $method_data;
}
}
Цей клас буде використовуватися OpenCart при перерахуванні активних способів оплати під час процесу перевірки. Під час цього процесу OpenCart збирає список активних методів оплати з back-end і перевіряє для кожного методу, доступний відповідний клас моделі чи ні. Спосіб оплати буде вказано тільки в тому випадку, якщо доступний клас моделі.
Важливим пунктом в цій установці є значення змінної code. У нашому випадку ми визначили custom, це означає, що при виборі способу оплати після натискання «Continue» він буде викликати внутрішній URL payment/custom, який в кінцевому підсумку встановить форму для нашого платіжного шлюзу. Простіше кажучи, це обов’язковий файл для виявлення і правильної роботи методу оплати під front-end.
Мова і файли шаблонів
Тепер нам потрібно створити мову і переглянути файли. Створюємо мовний файл catalog/language/english/payment/custom.php. Вставляємо наступне вміст створений мовний файл custom.php.
Досить легко зрозуміти: ми тільки що створили ярлики, які будуть використовуватися під front-end під час перевірки. Створюємо файл шаблону catalog/view/theme/default/template/payment/custom.tpl. Вставляємо наступне вміст в створений файл шаблону custom.tpl.