От автора: в предыдущем уроке мы начали разрабатывать модуль оплаты Bitcoin OpenCart. В частности, мы реализовали панель администратора, чтобы наши пользователи могли управлять плагином. В этом уроке мы продолжим работу над плагином и создадим front end часть.
Контроллер
Перейдите в catalog/controller/payment
Создайте файл PHP файл bitpay.php
Откройте этот файл в вашей IDE и напишите класс этого модуля, придерживаясь способа именования OpenCart, например, class ControllerPaymentBitpay extends Controller {}
Внутри класса создайте стандартную OpenCart функцию index

Бесплатный курс по PHP программированию
Освойте курс и узнайте, как создать динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC
В курсе 39 уроков | 15 часов видео | исходники для каждого урока
Получить курс сейчас!Внутри функции index() напишите код ниже
Загрузка языков и парсинг значений
Первая строка кода ниже загружает язык в контроллер, следующие строки парсят ссылки и тексты на языке для использования в представлении.
1 2 3 |
$this->language->load('payment/bitpay'); $this->data['button_bitpay_confirm'] = $this->language->get('text_button_confirm'); $this->data['continue']= $this->url->link('checkout/success'); |
Шаблон и рендеринг
Чтобы указать путь к шаблону:
1 |
$this->template = $this->config->get('config_template') . '/template/payment/bitpay.tpl'; |
Чтобы отрендерить шаблон: $this->render();.
Функция запроса в API
До настоящего времени мы писали только код, относящийся к настройкам модуля и его макета. Сейчас мы перейдем к связи с API. Для этого мы создадим другую функцию внутри нашего контроллера, которая будет общаться с BitPay API. Мы создадим public function send(){}. Код внутри этой функции ниже объясняется построчно:
Загрузка необходимых библиотек/классов в контроллер
Нам необходимо загрузить в наш контроллер 2 обязательных класса/библиотеки — BitPay Library API и Order Model:
1 2 |
include DIR_APPLICATION.'../bitpay/bp_lib.php'; $this->load->model('checkout/order'); |
(BitPay Library не библиотека OpenCart, поэтому мы напрямую вставим ее функции в наш контроллер, как показано на первой строчке сверху)
Получение деталей заказа и форматирование
Чтобы получить все детали заказа, можно использовать:
1 |
$order = $this->model_checkout_order->getOrder($this->session->data['order_id']); |
В переменную падают все необходимые детали в форме массива. Для форматирования стандартной выбранной валюты заказа мы используем:
1 |
$price = $this->currency->format($order['total'], $order['currency_code'], $order['currency_value'], false); |

Бесплатный курс по PHP программированию
Освойте курс и узнайте, как создать динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC
В курсе 39 уроков | 15 часов видео | исходники для каждого урока
Получить курс сейчас!Взаимодействие с API
Следующий код взаимодействует с API и парсит обязательные данные в функцию API.
1 2 3 4 5 6 7 8 9 10 |
$posData = $order['order_id']; // Order Information to be posted in the API $options = array( 'apiKey' => $this->config->get('bitpay_api_key'), // API Key fetched from database 'notificationURL' => $this->url->link('payment/bitpay/callback'), // The API callback URL 'redirectURL' => $this->url->link('account/order/info&order_id=' . $order['order_id']), // Order Information URL 'currency' => $order['currency_code'], // Ordered Currency Code 'transactionSpeed' => $this->config->get('bitpay_transaction_speed'), // Transaction Speed (See the API Documentation for detail) 'testMode' => $this->config->get('bitpay_test_mode') // Set Test Mode enabled or disabled ); $response = bpCreateInvoice($order['order_id'], $price, $posData, $options); // Parse the Information to API |
Обработка ошибок
По некоторым невалидным действиям API выбрасывает ошибку пользователю. Следующий код бросает ответ нам в формате JSON:
1 2 |
if(array_key_exists('error', $response){ echo "{\"error\": \"Error: Problem communicating with payment provider.\\nPlease try again later.\"}";} else{echo "{\"url\": \"" . $response["url"] . "\"}"; } |
Колбек функция
По заголовку должно быть понятно, что это будет колбек функция API. Она возвращает необходимую информацию о способе оплаты и передает ее пользователю. Выполните следующие шаги:
Создайте публичную функцию callback()
Внутри функции подключите библиотеку DIR_APPLICATION.’../bitpay/bp_lib.php’;
Получите API Response Array Key с помощью следующего кода
1 2 |
$apiKey = $this->config->get('bitpay_api_key'); $response = bpVerifyNotification($apiKey); |
Проверьте ответ. Если это строка, то должна быть ошибка:
1 2 3 4 |
if (is_string($response)) { // Display the response error code here } |
Внутри выражения else необходимо подтвердить заказ с помощью кода ниже.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
switch($response['status']) { // If Order is successful and complete case 'confirmed': case 'complete': $this->load->model('checkout/order'); // Loading the Order Model $order_id = $response['posData']; // Getting the Order ID from the response $order = $this->model_checkout_order->getOrder($order_id); // Get Order Details $this->model_checkout_order->confirm($order_id, $this->config->get('bitpay_confirmed_status_id')); // Confirm the Order Status as complete break; case 'invalid': // If Order is invalid due to some problems $this->load->model('checkout/order'); // loading the Order Model $order_id = $response['posData']; // Getting the Order ID from the response $order = $this->model_checkout_order->getOrder($order_id); // Get Order Details $this->model_checkout_order->confirm($order_id, $this->config->get('bitpay_invalid_status_id')); // Confirm the Order Status as Invalid break; } |
Представление
Созданное представление довольно простое. Всего лишь одна кнопка с AJAX запросом к API:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<div class="buttons"> <div class="right"><a id="confirm-btn" class="button"><span><?php echo $button_bitpay_confirm; ?></span></a></div> </div> <script type="text/javascript"><!-- $('#confirm-btn').bind('click', function() { $.ajax({ type: 'GET', url: 'index.php?route=payment/bitpay/send', timeout: (1000 * 30), // 30 seconds error: function() { alert('Error communication.'); }, success: function(msg) { try { var result = JSON.parse(msg); if(result.error) { alert(result.error); } else { location = result.url; } } catch(e) { alert('JSON parsing error: '+msg); } } }); }); //--></script> |
Заключение
Эта серия должна познакомить вас с созданием более сложных модулей в OpenCart. Теперь чтобы продолжить делать этот плагин, вам необходимо открыть документацию OpenCart.
Автор: Zaman Riaz
Источник: //code.tutsplus.com/
Редакция: Команда webformyself.

Бесплатный курс по PHP программированию
Освойте курс и узнайте, как создать динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC
В курсе 39 уроков | 15 часов видео | исходники для каждого урока
Получить курс сейчас!
Bootstrap5+OpenCart3. Создание интернет-магазина
Овладейте современной версткой и создавайте крутые интернет-магазины
Подробнее