Статьи

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

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

Мы будем использовать аналогичные настройки файлов для раздела переднего плана.

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

01
02
03
04
05
06
07
08
09
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
<?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->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’) .
      } 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 .

Сначала мы загрузили языковой файл и установили значение кнопки « Подтвердить» . Мы также настроили атрибут action который будет использоваться в форме отправки платежа. Вы должны изменить это согласно вашему платежному шлюзу.

1
2
3
$this->language->load(‘payment/custom’);
$this->data[‘button_confirm’] = $this->language->get(‘button_confirm’);
$this->data[‘action’] = ‘https://yourpaymentgatewayurl’;

Затем мы загрузили информацию о заказе из активного сеанса пользователя.

1
2
$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 , как мы увидим в данный момент.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
$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->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 и отображаем представление.

1
2
3
4
5
6
7
if (file_exists(DIR_TEMPLATE . $this->config->get(‘config_template’) . ‘/template/payment/custom.tpl’)){
  $this->template = $this->config->get(‘config_template’) .
} else {
  $this->template = ‘default/template/payment/custom.tpl’;
}
 
$this->render();

Давайте рассмотрим код метода callback . Этот метод вызывается, когда пользователь возвращается в магазин с сайта платежного шлюза.

Сначала мы проверяем, доступна ли переменная orderid или нет, прежде чем продолжить. Если он недоступен, мы просто прекращаем дальнейшую обработку.

1
2
3
4
5
if (isset($this->request->post[‘orderid’])) {
  $order_id = trim(substr(($this->request->post[‘orderid’]), 6));
} else {
  die(‘Illegal Access’);
}

Далее мы загружаем информацию о заказе из базы данных. И, наконец, мы проверим, есть ли у нас индикатор success из ответа платежного шлюза. Если это так, мы пойдем дальше и соответствующим образом обновим информацию о статусе заказа.

01
02
03
04
05
06
07
08
09
10
11
$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 .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
<?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 собирает список активных методов оплаты из серверной части и для каждого метода проверяет, доступен ли соответствующий класс модели или нет. Способ оплаты будет указан только в том случае, если доступен соответствующий класс модели.

Важным в этой настройке является значение переменной code . В нашем случае мы определили его как custom , что означает, что когда вы выбираете способ оплаты и нажимаете « Продолжить» , он вызывает внутренний payment/custom URL-адрес, что в конечном итоге устанавливает форму для нашего платежного шлюза.

Короче говоря, можно сказать, что это обязательный файл для обнаружения и правильной работы метода оплаты во внешнем интерфейсе.

Теперь нам просто нужно создать язык и просмотреть файлы. Идите вперед и создайте языковой файл в catalog/language/english/payment/custom.php . Вставьте следующее содержимое во вновь созданный языковой файл custom.php .

1
2
3
4
<?php
$_[‘text_title’] = ‘Custom Payment Method’;
$_[‘button_confirm’] = ‘Confirm Order’;
?>

Довольно легко понять: мы только что установили метки, которые будут использоваться во внешнем интерфейсе во время оформления заказа.

Создайте файл шаблона в catalog/view/theme/default/template/payment/custom.tpl . Вставьте следующее содержимое во вновь созданный файл шаблона custom.tpl .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<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>

Как вы уже, наверное, догадались, это форма, которая будет отправлена, когда пользователь нажмет кнопку « Подтвердить заказ» . Мы только что установили скрытые переменные и их значения, которые были ранее определены в методе index контроллера.

Давайте посмотрим, как все выглядит на переднем конце:

Внешний вид оформления заказа

Давайте быстро пройдемся по общему потоку:

  • Во-первых, вы должны настроить файл модели для вашего способа оплаты, чтобы он мог быть указан на вкладке Шаг 5: Способ оплаты .
  • Затем, когда пользователь выбирает пользовательский метод оплаты на пятой вкладке и нажимает кнопку « Продолжить» , OpenCart внутренне вызывает payment/custom URL-адрес, который в конечном итоге вызывает метод index и отображает файл custom.tpl на шестой вкладке.
  • Наконец, когда пользователь нажимает кнопку « Подтвердить заказ» , форма отправляется, и пользователь перенаправляется на сайт платежного шлюза, где начинается процесс оплаты. После завершения процесса оплаты пользователь будет перенаправлен обратно на наш сайт благодаря скрытой переменной callbackurl . Конечно, статус заказа будет обновляться как часть метода callback если все работает так, как ожидалось.

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

Это всегда весело — создавать собственные вещи для любого фреймворка, не так ли? Помните, что вы всегда можете предоставить комментарии и вопросы, используя форму комментариев ниже.