Создание пользовательского способа оплаты в OpenCart: часть 3

Создаем в OpenCart способы оплаты

От автора: если вы следовали вместе с этой серией, то должны быть знакомы с той структурой файлов, которую мы создали для нашего пользовательского способа оплаты в фоновом режиме. Если более ранние части этой серии вам не знакомы, я настоятельно рекомендую прочитать их (часть 1, часть 2), прежде чем приступать к этой.

Чтобы добавить в OpenCart способы оплаты, мы будем использовать аналогичную настройку файла для раздела front-end.

Настройка контроллера

Создаем файл контроллера catalog/controller/payment/custom.php. Вставляем следующее содержимое в созданный файл контроллера custom.php.

<?php
class ControllerPaymentCustom extends Controller {
 protected function index() {
 $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']);
 
 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 function callback() {
 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 с нуля!

Приступить к созданию
<?php
class ModelPaymentCustom extends Model {
 public function getMethod($address, $total) {
 $this->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.

<?php
$_['text_title'] = 'Custom Payment Method';
$_['button_confirm'] = 'Confirm Order';
?>

Довольно легко понять: мы только что создали ярлыки, которые будут использоваться во front-end во время проверки. Создаём файл шаблона catalog/view/theme/default/template/payment/custom.tpl. Вставляем следующее содержимое в созданный файл шаблона custom.tpl.

<form action="<?php echo $action; ?>" method="post">
 <input type="hidden" name="text_config_one" value="<?php echo $text_config_one; ?>" />
 <input type="hidden" name="text_config_two" value="<?php echo $text_config_two; ?>" />
 <input type="hidden" name="orderid" value="<?php echo $orderid; ?>" />
 <input type="hidden" name="callbackurl" value="<?php echo $callbackurl; ?>" />
 <input type="hidden" name="orderdate" value="<?php echo $orderdate; ?>" />
 <input type="hidden" name="currency" value="<?php echo $currency; ?>" />
 <input type="hidden" name="orderamount" value="<?php echo $orderamount; ?>" />
 <input type="hidden" name="billemail" value="<?php echo $billemail; ?>" />
 <input type="hidden" name="billphone" value="<?php echo $billphone; ?>" />
 <input type="hidden" name="billaddress" value="<?php echo $billaddress; ?>" />
 <input type="hidden" name="billcountry" value="<?php echo $billcountry; ?>" />
 <input type="hidden" name="billprovince" value="<?php echo $billprovince; ?>" />
 <input type="hidden" name="billcity" value="<?php echo $billcity; ?>" />
 <input type="hidden" name="billpost" value="<?php echo $billpost; ?>" />
 <input type="hidden" name="deliveryname" value="<?php echo $deliveryname; ?>" />
 <input type="hidden" name="deliveryaddress" value="<?php echo $deliveryaddress; ?>" />
 <input type="hidden" name="deliverycity" value="<?php echo $deliverycity; ?>" />
 <input type="hidden" name="deliverycountry" value="<?php echo $deliverycountry; ?>" />
 <input type="hidden" name="deliveryprovince" value="<?php echo $deliveryprovince; ?>" />
 <input type="hidden" name="deliveryemail" value="<?php echo $deliveryemail; ?>" />
 <input type="hidden" name="deliveryphone" value="<?php echo $deliveryphone; ?>" />
 <input type="hidden" name="deliverypost" value="<?php echo $deliverypost; ?>" />
 
 <div class="buttons">
 <div class="right">
 <input type="submit" value="<?php echo $button_confirm; ?>" class="button" />
 </div>
 </div>
</form>

Как вы, наверное, догадались, это форма, которая будет отправляться, когда пользователь нажимает кнопку Confirm Order. Мы только что установили скрытые переменные и их значения, которые ранее были определены в index методе контроллера. Давайте посмотрим, как все выглядит во front-end:

Давайте быстро пробежимся по сути:

Во-первых, нужно настроить файл модели для своего способа оплаты, чтобы он мог быть указан на вкладке «Step 5: Payment Method».

Во-вторых, когда пользователь выбирает Custom Payment Method на пятой вкладке и нажимает кнопку “Continue”, OpenCart вызывает payment/custom URL-адрес, который вызывает index метод и в конечном итоге отображает custom.tpl файл на шестой вкладке.

Наконец, когда пользователь нажимает кнопку Confirm Order, форма будет отправлена и пользователь будет направлен на сайт платежного шлюза, на котором начнётся процесс оплаты. Как только процесс оплаты будет завершен, пользователь будет перенаправлен обратно на сайт благодаря скрытой переменной callbackurl. Само собой, статус заказа будет обновлен как часть callback метода, если все будет работать, как положено.

Заключение

В этой серии я объяснил, как настроить практически любой способ оплаты, создав свой собственный модуль метода оплаты. Надеюсь, вам понравилась эта серия, и вы узнали что-то полезное.

Автор: Sajal Soni

Источник: http://code.tutsplus.com/

Редакция: Команда webformyself.

Интернет-магазин на OpenCart!

Создайте интернет-магазин на самой популярной CMS – OpenCart с нуля!

Приступить к созданию
Самые свежие новости IT и веб-разработки на нашем Telegram-канале

Интернет-магазин на OpenCart

Создание магазина с уникальным шаблоном на CMS OpenCart

Научиться

Метки:

Похожие статьи:

Комментарии Вконтакте:

Комментарии Facebook:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Я не робот.

Spam Protection by WP-SpamFree