1. Создание файла


Сначала вам нужно создать файл для нового модуля и поместить его в следующий каталог.

/lib/common/modules/orderPayment/

Например, давайте назовем этот новый платежный модуль custom_pay.php

Скелет файла должен выглядеть следующим образом:

<?php

/**
 * namespace
 */
namespace common\modules\orderPayment;

/**
 * used classes
 */
use common\classes\modules\ModulePayment;
use common\classes\modules\ModuleStatus;
use common\classes\modules\ModuleSortOrder;

/**
 * class declaration
 */
class custom_pay extends ModulePayment {

    /**
     * variables
     */
    var $code, $title, $description, $enabled;

    /**
     * default values for translation
     */
    protected $defaultTranslationArray = [
        'MODULE_PAYMENT_CUSTOM_PAY_TEXT_TITLE' => 'Custom payment',
        'MODULE_PAYMENT_CUSTOM_PAY_TEXT_DESCRIPTION' => 'Pay by credit balance',
        'MODULE_PAYMENT_CUSTOM_PAY_ERROR' => 'There has been an error processing your credit card',
    ];

    /**
     * class constructor
     */
    function __construct() {
        parent::__construct();

        $this->code = 'custom_pay';
        $this->title = MODULE_PAYMENT_CUSTOM_PAY_TEXT_TITLE;
        $this->description = MODULE_PAYMENT_CUSTOM_PAY_TEXT_DESCRIPTION;
        if (!defined('MODULE_PAYMENT_CUSTOM_PAY_STATUS')) {
            $this->enabled = false;
            return false;
        }
        $this->sort_order = MODULE_PAYMENT_CUSTOM_PAY_SORT_ORDER;
        $this->enabled = ((MODULE_PAYMENT_CUSTOM_PAY_STATUS == 'True') ? true : false);
        $this->online = false;

        if ((int) MODULE_PAYMENT_CUSTOM_PAY_ORDER_STATUS_ID > 0) {
            $this->order_status = MODULE_PAYMENT_CUSTOM_PAY_ORDER_STATUS_ID;
        }

        $this->update_status();
    }

    function update_status() {

        if (($this->enabled == true) && ((int) MODULE_PAYMENT_CUSTOM_PAY_ZONE > 0)) {
            $check_flag = false;
            $check_query = tep_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_CUSTOM_PAY_ZONE . "' and zone_country_id = '" . $this->delivery['country']['id'] . "' order by zone_id");
            while ($check = tep_db_fetch_array($check_query)) {
                if ($check['zone_id'] < 1) {
                    $check_flag = true;
                    break;
                } elseif ($check['zone_id'] == $this->delivery['zone_id']) {
                    $check_flag = true;
                    break;
                }
            }

            if ($check_flag == false) {
                $this->enabled = false;
            }
        }
    }

    function selection() {
        return array('id' => $this->code,
            'module' => $this->title);
    }

    function process_button() {
        return false;
    }

    function before_process() {
        try {
            $transaction_currency = \Yii::$app->settings->get('currency');
            $order = $this->manager->getOrderInstance();

            //-----------------------------------------
            // make your request here with credentials:
            // MODULE_PAYMENT_CUSTOM_PAY_USERNAME
            // MODULE_PAYMENT_CUSTOM_PAY_PASSWORD
            $result = [
                'success' => true,
                'transaction' => '',
            ];
            //-----------------------------------------
            
            if (isset($result['success']) && $result['success']) {
                $orderPayment = new \common\models\OrdersPayment();
                $orderPayment->orders_payment_module = $this->code;
                $orderPayment->orders_payment_transaction_id = $result['transaction'];
                $orderPayment->orders_payment_id_parent = 0;
                $orderPayment->orders_payment_order_id = 0;
                $orderPayment->orders_payment_is_credit = 0;
                $orderPayment->orders_payment_status = \common\helpers\OrderPayment::OPYS_PROCESSING;
                $orderPayment->orders_payment_amount = $this->formatCurrencyRaw($order->info['total_inc_tax'], $transaction_currency);
                $orderPayment->orders_payment_currency = trim($order->info['currency']);
                $orderPayment->orders_payment_currency_rate = (float) $order->info['currency_value'];
                $orderPayment->orders_payment_snapshot = json_encode(\common\helpers\OrderPayment::getOrderPaymentSnapshot($order));
                $orderPayment->orders_payment_transaction_status = '';
                $orderPayment->orders_payment_transaction_commentary = '';
                $orderPayment->orders_payment_date_create = date('Y-m-d H:i:s');
                $orderPayment->orders_payment_transaction_full = json_encode($result);
                $orderPayment->save(false);
                return true; // success
            }
            if (isset($result['data']['message'])) {
                tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, 'error_message=' . urlencode($result['data']['message']), 'SSL'));
            }
        } catch (\Exception $e) {
            tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, 'error_message=' . urlencode($e->getMessage()), 'SSL'));
        }
        tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, 'error_message=' . urlencode(MODULE_PAYMENT_CUSTOM_PAY_ERROR), 'SSL'));
    }

    function after_process() {
        
    }

    function formatCurrencyRaw($total, $currency_code = null, $currency_value = null) {

        if (!isset($currency_code)) {
            $currency_code = DEFAULT_CURRENCY;
        }

        if (!isset($currency_value) || !is_numeric($currency_value)) {
            $currencies = \Yii::$container->get('currencies');
            $currency_value = $currencies->currencies[$currency_code]['value'];
        }

        return number_format(self::round($total * $currency_value, $currencies->currencies[$currency_code]['decimal_places']), $currencies->currencies[$currency_code]['decimal_places'], '.', '');
    }

    function isOnline() {
        return true;
    }

    public function configure_keys() {
        return array(
            'MODULE_PAYMENT_CUSTOM_PAY_STATUS' => array(
                'title' => 'Enable Custom payment Module',
                'value' => 'True',
                'description' => 'Do you want to accept Custom payments?',
                'sort_order' => '1',
                'set_function' => 'tep_cfg_select_option(array(\'True\', \'False\'), ',
            ),
            'MODULE_PAYMENT_CUSTOM_PAY_USERNAME' => array(
                'title' => 'API username',
                'value' => '',
                'description' => 'Authorization username.',
                'sort_order' => '2',
            ),
            'MODULE_PAYMENT_CUSTOM_PAY_PASSWORD' => array(
                'title' => 'API password',
                'value' => '',
                'description' => 'Authorization password.',
                'sort_order' => '3',
            ),
            'MODULE_PAYMENT_CUSTOM_PAY_ZONE' => array(
                'title' => 'Payment Zone',
                'value' => '0',
                'description' => 'If a zone is selected, only enable this payment method for that zone.',
                'sort_order' => '4',
                'use_function' => '\\common\\helpers\\Zones::get_zone_class_title',
                'set_function' => 'tep_cfg_pull_down_zone_classes(',
            ),
            'MODULE_PAYMENT_CUSTOM_PAY_ORDER_STATUS_ID' => array(
                'title' => 'Set Order Status',
                'value' => '0',
                'description' => 'Set the status of orders made with this payment module to this value',
                'sort_order' => '5',
                'set_function' => 'tep_cfg_pull_down_order_statuses(',
                'use_function' => '\\common\\helpers\\Order::get_order_status_name',
            ),
            'MODULE_PAYMENT_CUSTOM_PAY_SORT_ORDER' => array(
                'title' => 'Sort order of  display.',
                'value' => '0',
                'description' => 'Sort order of Custom payment display. Lowest is displayed first.',
                'sort_order' => '6',
            ),
        );
    }

    public function describe_status_key() {
        return new ModuleStatus('MODULE_PAYMENT_CUSTOM_PAY_STATUS', 'True', 'False');
    }

    public function describe_sort_key() {
        return new ModuleSortOrder('MODULE_PAYMENT_CUSTOM_PAY_SORT_ORDER');
    }

}

Примечание: обратите внимание на обязательные элементы:

  • namespace указывающее размещение класса

  • использовать классы модулей, используемые для создания установки

  • объявление класса с обязательным наследованием от ModulePayment

  • переменные необходимые для вашего модуля

  • ключи для перевода

  • конструктор выполняет инициализацию

  • функция before_process для действий

  • поддержка tax_class

  • минимальный набор полей конфигурации

  • функция description_status_key отвечающая за условие

  • Функция description_sort_key отвечающая за порядок сортировки

Не рекомендуется закрывать php tag во избежание отображения непечатаемых символов на страницах.


2. Установка модуля


После того, как вы вошли в админ-панель вашего сайта, нажмите « Модули », « Оплата», «Онлайн» и необходимые вкладки внешнего интерфейса . Включите переключатели « Показать неактивные » и «Показать не установленные », найдите свой модуль и нажмите кнопку «Установить » .

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