Розробка кастомного плагіна оплати OpenCart

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Пропоновані послуги
Показано 1 з 1 послугУсі 2065 послуг
Розробка кастомного плагіна оплати OpenCart
Середня
~3-5 робочих днів
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    874
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851

Розробка кастомного плагіну оплати OpenCart

OpenCart 3.x і 4.x мають різну архітектуру розширень. В 3.x — класична MVC-структура в папці catalog/. В 4.x — Event system + namespaced класи, структура стала ближче до сучасних фреймворків. Кастомний плагін пишеться під конкретну версію.

Розробка займає 3–5 робочих днів. Якщо потрібна підтримка обох версій — помножити на 1.5.

Структура плагіну OpenCart 4.x

extension/mypay/
├── admin/
│   ├── controller/payment/mypay.php
│   ├── language/en-gb/payment/mypay.php
│   ├── language/ru-ru/payment/mypay.php
│   └── view/template/payment/mypay.twig
├── catalog/
│   ├── controller/payment/mypay.php
│   ├── language/ru-ru/payment/mypay.php
│   └── view/template/payment/mypay.twig
└── install.json

Каталог: контроллер оплати

namespace Opencart\Catalog\Controller\Extension\Mypay\Payment;

class Mypay extends \Opencart\System\Engine\Controller
{
    public function index(): string
    {
        $this->load->language('extension/mypay/payment/mypay');

        $data['action'] = $this->url->link(
            'extension/mypay/payment/mypay.confirm',
            'language=' . $this->config->get('config_language')
        );
        $data['amount']   = $this->currency->format($this->session->data['mypay_total'], 'RUB', 1, false);
        $data['order_id'] = $this->session->data['order_id'];

        return $this->load->view('extension/mypay/payment/mypay', $data);
    }

    public function confirm(): void
    {
        $this->load->model('checkout/order');
        $orderId  = (int) $this->session->data['order_id'];
        $order    = $this->model_checkout_order->getOrder($orderId);
        $total    = (int) round($order['total'] * 100);

        $client   = new \Mypay\ApiClient(
            $this->config->get('payment_mypay_api_key'),
            $this->config->get('payment_mypay_secret_key')
        );

        $payment = $client->createPayment([
            'amount'       => $total,
            'currency'     => 'RUB',
            'order_id'     => $orderId,
            'callback_url' => HTTPS_CATALOG . 'index.php?route=extension/mypay/payment/mypay.callback',
            'success_url'  => HTTPS_CATALOG . 'index.php?route=checkout/success',
            'fail_url'     => HTTPS_CATALOG . 'index.php?route=checkout/failure',
        ]);

        if (!$payment['payment_url']) {
            $this->session->data['error'] = 'Помилка створення платежу';
            $this->response->redirect(HTTPS_CATALOG . 'index.php?route=checkout/checkout');
            return;
        }

        $this->model_checkout_order->addHistory(
            $orderId,
            $this->config->get('payment_mypay_pending_status'),
            'MyPay Payment ID: ' . $payment['payment_id'],
            false
        );

        $this->response->redirect($payment['payment_url']);
    }

    public function callback(): void
    {
        $raw    = file_get_contents('php://input');
        $data   = json_decode($raw, true);
        $secret = $this->config->get('payment_mypay_secret_key');

        $expectedSig = hash_hmac('sha256', $raw, $secret);
        if (!hash_equals($expectedSig, $_SERVER['HTTP_X_SIGNATURE'] ?? '')) {
            http_response_code(403);
            exit('Forbidden');
        }

        $this->load->model('checkout/order');
        $orderId = (int) $data['order_id'];

        $statusMap = [
            'succeeded' => (int) $this->config->get('payment_mypay_complete_status'),
            'failed'    => (int) $this->config->get('payment_mypay_failed_status'),
            'cancelled' => (int) $this->config->get('payment_mypay_cancelled_status'),
        ];

        $newStatus = $statusMap[$data['status']] ?? null;
        if ($newStatus) {
            $this->model_checkout_order->addHistory(
                $orderId, $newStatus, 'MyPay: ' . $data['status'], $data['status'] === 'succeeded'
            );
        }

        http_response_code(200);
        echo 'OK';
        exit;
    }
}

Admin: настройки плагіну

namespace Opencart\Admin\Controller\Extension\Mypay\Payment;

class Mypay extends \Opencart\System\Engine\Controller
{
    public function save(): void
    {
        $this->load->language('extension/mypay/payment/mypay');

        if (!$this->user->hasPermission('modify', 'extension/mypay/payment/mypay')) {
            $this->response->setOutput(json_encode(['error' => ['warning' => 'Нема прав']]));
            return;
        }

        $keys = ['status', 'api_key', 'secret_key', 'testmode', 'pending_status', 'complete_status', 'failed_status'];
        foreach ($keys as $key) {
            $this->config->set('payment_mypay_' . $key, $this->request->post['payment_mypay_' . $key] ?? '');
            $this->model_setting_setting->editSettingValue('payment_mypay', 'payment_mypay_' . $key, $this->request->post['payment_mypay_' . $key] ?? '');
        }

        $this->response->setOutput(json_encode(['success' => 'Настройки збережені']));
    }
}

install.json

{
    "name": "MyPay Payment Gateway",
    "version": "1.0.0",
    "author": "Your Company",
    "link": "https://yourcompany.com",
    "type": "payment",
    "category": "payment"
}

Особливості OpenCart 3.x

В OpenCart 3.x структура папок інша: upload/catalog/controller/payment/mypay.php. Namespace не використовується, класи називаються ControllerPaymentMypay. Установка через Extension Installer (zip-архів) або вручну. Замість install.json — файл upload/ layout.

Тестування та отладка

OpenCart записує помилки в /system/storage/logs/. При розробці callback — використовувати ngrok для доступу до localhost. Статуси замовлень конфігурюються в admin → System → Order Statuses, їхні ID підставляються в настройки плагіну.