Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

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

Скачать файлы можно здесь:

View file
nameIntellectMoneyCommon.zip
height250

Проект может применяться для трех целей:

- Создание мультиязычной страницы заполнения пользовательских настроек модуля;
- Генерация формы для выставления счета;
- Обработка уведомлений по статусам счета.

Содержимое проекта:

- Currency.php - класс для работы с валютами. Содержит константы валют;
- Customer.php - класс-шаблон для работы с данными о покупателе;
- IntellectMoneyBase.php - базовый функционал, используемый в разных частях кода. Не используется напрямую при создании модуля;
- Item.php - класс-шаблон для работы с данными о товаре в чеке. Не используется напрямую при создании модуля;
- LangiageHelper.php - класс для работы с текстовыми описаниями, языками и кодировками;
- MerchantReceiptHelper.php - класс для генерации чеков. Не используется напрямую при создании модуля;
- Order.php - класс-шаблон для работы с данными заказа;
- Payment.php - класс-агрегатор. Получает информацию из других классов-шаблонов для генерации формы оплаты, которую можно поместить на необходимую Вам страницу;
- ProcessingResponseResultStruct.php - класс-шаблон возвращаемого результата после обработки входящего уведомления о статусе платежа. Не используется напрямую при создании модуля;
- Result.php - класс-обработчик входящих данных о статусе платежа;
- Status.php - класс, содержащий константы, соответствующие статусам платежа;
- StatusWeight.php - класс, используемый для выставления приоритетов статусов платежа. Не используется напрямую при создании модуля;
- UserSettings.php - класс-шаблон для работы с настройками модуля. Имеет методы валидации данных;
- VATs.php - класс для работы с НДС. Не используется напрямую при создании модуля;
- Validator.php - класс, используемый для валидации полученных данных. Не используется напрямую при создании модуля;
- Каталог Exceptions - содержит файлы-обработчики исключений вышеописанных классов. Не используется напрямую при создании модуля;
- Каталог Languages - содержит языковые переменные, используемые для создания админ-страницы с настройками модуля или выдачи необходимых сообщений. Содержит 2 языка: русский и английский. Не используется напрямую при создании модуля.

Проект может применяться для трех целей:

- Создание мультиязычной страницы заполнения пользовательских настроек модуля;
- Генерация формы для выставления счета;
- Обработка уведомлений по статусам счета.

Описание классов

LanguageHelper

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

Для создания экземпляра класса используйте метод getInstance($lang = 'ru', $isCp1251 = false). Параметр $lang принимает язык в формате 'ru', где ru - название языкового файла из каталога Languages, по умолчанию - русский. $isCp1251 - булевый параметр, им можно указать, необходимо ли выводить текст в кодировке cp1251.

Для задания языка и кодировки существует метод setLanguage($lang, $isCp1251 = null), принимающий те же аргументы. Его можно использовать для смены языка, если на странице требуется отобразить оба языка (а такое иногда бывает).

Методы getTitle($name), getDesc($name) и getError($name) позволяют получить название поля настроек, описание и ошибку при валидации в нужных языке и кодировке соответственно. Значения для параметра $name можно посмотреть в языковых файлах, располагающихся в каталоге Languages.

Метод getLanguage() возвращает текущий язык.

UserSettings

Класс UserSettings позволяет сохранить пользовательские настройки из страницы настройки модуля, отвалидировать их и, при необходимости, дать информацию, в какие поля введены неверные данные.

Для создания экземпляра используйте метод getInstance($params = array(), $isAllowChangeValues = true), где $params - массив входных параметров для сохранения, о $isAllowChangeValues ниже.
Метод setParams($params, &$errors = array()) позволяет сохранить массив пользовательских данных в формате

Code Block
languagephp
titleВозвращаемые данные
array(
'eshopId' => '456789',
'secretKey' => '12345678',
...
);

В параметр $errors запишутся названия полей, по которым возникли ошибки. Результирующий массив будет иметь вид

Code Block
languagephp
titleВозвращаемые данные
array(
'eshopId',
'group',
...
);

Метод возвращает булевое значение, которое говорит, возникли ли при вализации ошибки. Параметры, измененные в ходе валидации на дефолтные (в случае неверного заполнения) не учитываются.

Метод setIsAllowChangeValues($allow = false) позволяет установить, будут ли заменяться неверные данные, полученные при заполнении настроек, на дефолтные, если такое возможно. По умолчанию параметр равен true.

Метод getParams() возвращает массив всех значений, хранящихся в классе.

Метод getIsAllowChangeValues() возвращает значение поля $IsAllowChangeValues.

Метод resetParams() позволяет сбросить значения, хранящиеся в классе, на дефолтные.

Метод формата getИмяПараметра() позволяют получить значение параметра, хранящегося в классе. Имена всех параметров, необходимых для работы как юридическое лицо, можно получить, вызвав метод getNamesOfOrganizationParamsToSave(), для физического лица - getNamesOfP2PParamsToSave().

Методы формата setИмяПараметра($value) позволяют установить значение параметра, отвалидировав его и установив дефолтное значение в случае ошибки, если параметр $IsAllowChangeValues установлен в true. Возвращает результат валидации. Установка в дефолтное значение считается успешным выполнением метода.

Payment

За генерацию формы отвечает класс Payment.

Метод getInstance($UserSettings = NULL, $Order = NULL, $Customer = NULL, $lang = 'ru') возвращает экземпляр объекта. Параметр $UserSettings - экземпляр класса UserSettings, $Order - экземпляр класса $Order, $Customer - экземпляр класса Customer. Опционально можно задать язык страницы оплаты и текста назначения оплаты параметром $lang (то же самое можно сделать, вызвав LanguageHelper::getInstance($lang));

Метод generateForm($isOrganization = true, $isAutoSubmit = false) возвращает форму оплаты, сформированную на основе данных, содержащихся в классах UserSettings, Order и Customer, переданных в метод getInstance(). Параметром $isOrganization можно форму работы с IntellectMoney: как Юр. лицо или как физ. лицо. Параметр $isAutoSubmit добавляет в возвращаемое значение javascript-код для автоматического редиректа на страницу оплаты при выводе формы на страницу.

Метод getParamsForOrganization() возвращает массив данных, необходимых для генерации формы, если Вы работаете как Юридическое лицо.

Метод getParamsForP2P() возвращает массив данных, необходимых для генерации формы, если Вы работаете как Физическое лицо.

Order

Для хранения данных о заказе и работы с ними предназначен класс Order.

Метод getInstance($invoiceId = NULL, $orderId = NULL, $originalAmount = NULL, $recipientAmount = NULL, $paidAmount = NULL, $deliveryAmount = NULL, $recipientCurrency = NULL, $discount = NULL, $status = NULL) возвращает экземпляр класса Order. Входные параметры:
$invoiceId - номер счета в системе IntellectMoney. Используется для формировании ссылки при повторном переходе на страницу оплаты после обработки уведомления о статусе платежа;
$orderId - номер заказа в CMS;
$originalAmount - Сумма заказа. При выставлении счета равна параметру $recipientAmount;
$recipientAmount - Сумма оплаты. При выставлении счета равна параметру $originalAmount;
$paidAmount - оплаченная сумма заказа;
$deliveryAmount - сумма доставки;
$recipientCurrency - валюта платежа. Для тестирования можно использовать TST. Валюта уставляется на тестовую, если параметр TestMode из класса UserSettings установлен в true;
$discount - общая сумма скидки. При расчете чека, общая сумма скидки равномерно распределяется по всем товарам.
$status - статус заказа в системе IntellectMoney.

Метод setParams($invoiceId = NULL, $orderId = NULL, $originalAmount = NULL, $recipientAmount = NULL, $paidAmount = NULL, $deliveryAmount = NULL, $recipientCurrency = NULL, $discount = NULL, $status = NULL) устанавливает те же параметры, что и getInstance().

Метод addItem($price, $quantity, $title, $tax = 0) добавляет товар в чек. Принимаемые параметры:
$price - стоимость товара;
$quantity - количество товара;
$title - описание товара;
$tax - ставка НДС. Рекомендуется брать значения из класса UserSettings->getTax().

Warning

Доставка также должна добавляться в чек. Для получения значения НДС по доставке используйте метод UserSettings->getDeliveryTax().

Метод getItems() массив с данными о товарах из чека.

Метод getParams() возвращает все параметры, хранящиеся в классе кроме тех, что возвращает метод getItems().

Методы формата getИмяПараметра() позволяют получить значение конкретного параметра, хранящегося в классе. Имена всех параметров перечислены в методе getInstance().

Методы формата setИмяПараметра() позволяют задать значение для параметра, хранящегося в классе.

Метод resetParams() сбрасывает все значения, хранящиеся в классе.

Customer

Для хранения данных о покупателе и работы с ними предназначен класс Customer.

Метод getInstance($email = NULL, $name = NULL, $phone = NULL) возвращает экземпляр класса Customer. Принимаемые параметры:
$email - адрес электронной почты, на который будет выставлен счет.
$name - имя покупателя.
$phone - телефон.

Методы формата getИмяПараметра() позволяют получить значение конкретного параметра, хранящегося в классе. Имена всех параметров перечислены в методе getInstance().

Методы формата setИмяПараметра() позволяют задать значение для параметра, хранящегося в классе.

Метод resetParams() сбрасывает все значения, хранящиеся в классе.

Result

Класс Result предназначен для обработки уведомления о статусе платежа.

Метод getInstance($request = array(), $UserSettings = "", $Order = "", $lang = 'ru', $isCp1251 = false) возвращает экземпляр класса Result. Входные параметры:
$request - глобальный массив $_REQUEST;
$UserSettings - экземпляр класса UserSettings;
$Order - экземпляр класса Order;
$lang - язык вывода уведомлений об ошибках (то же самое можно сделать, вызвав LanguageHelper::getInstance($lang));
$isCp1251 - использование кодировки cp1251.

Метод setParams($request, $userSettings, $order, $lang = 'ru', $isCp1251 = false) устанавливает значения, необходимые для работы метода processingResponse(). Принимает те же аргументы, что и метод getInstance().

Метод resetParams() сбрасывает все значения во всех классах, принимаемых методами getInstance() и setParams().

Метод processingResponse() выполняет обработку статуса платежа. Возвращает экземпляр класса ProcessingResponseResultStruct.

Метод getMessage() выводит сообщение "ОК", если обработка уведомления прошла успешно, либо текст ошибки, если обработка произошла с ошибкой. Необходимо использовать вывод этого метода для ответа системе IntellectMoney. Пример:

Code Block
languagephp
titleПример использования метода getMessage()
echo Result->getMessage();
die();

ProcessingResponseResultStruct

ProcessingResponseResultStruct - результат обработки статуса платежа. Параметры:
$changeStatusResult - булевое значение. Означает, можно ли сменить статус заказа в админ-панели.
$statusCMS - статус заказа CMS, который соответствует принятому файлом-обработчиком уведомлений статусу заказа IntellectMoney. В этот статус необходимо установить заказ.

VATs

VATs - класс для работы со ставками НДС.

Статический метод getList() возвращает локализованный массив данных, необходимый для формирования выпадающего списка с выбором ставки НДС на странице настроек модуля в админ-панели CMS.


Table of Contents
maxLevel4

Примеры использования

Формирование страницы настроек в админ-панели CMS на примере модуля для CMS OpenCart (паттерн MVC)

Expand
titleView на шаблонизаторе twig


Code Block
languagephp
titleView на шаблонизаторе twig
linenumberstrue
{{ header }}{{ column_left }}
<div id="content">
    <div class="page-header">
        <div class="container-fluid">
            <div class="pull-right">
                <button type="submit" form="form-intellectmoney" class="btn btn-primary"><i class="fa fa-check-circle"></i> {{ button_save }}</button>
                <a href="{{ cancel }}" class="btn btn-default"><i class="fa fa-reply"></i> {{ button_cancel }}</a></div>
            <h1 style="background:url('/admin/view/image/payment/intellectmoney.png') center left; background-repeat: no-repeat;  background-size: 28%; padding: 10px 0 10px 90px;">{{ heading_title }}</h1>
            <ul class="breadcrumb">
                {% for breadcrumb in breadcrumbs %}
                    <li><a href="{{ breadcrumb.href }}">{{ breadcrumb.text }}</a></li>
                    {% endfor %}
            </ul>
        </div>
    </div>
    <div class="container-fluid">
        {% if error_warning %}
            <div class="alert alert-danger"><i class="fa fa-exclamation-circle"></i> {{ error_warning }}
                <button type="button" class="close" data-dismiss="alert">×</button>
            </div>
        {% endif %}
        <div class="panel panel-default">
            <div class="panel-heading">
                <h3 class="panel-title"><i class="fa fa-pencil"></i> {{ text_edit }}</h3>
            </div>
            <div class="panel-body">
                <form action="{{ action }}" method="post" enctype="multipart/form-data" id="form-intellectmoney" class="form-horizontal">

                    <div class="form-group required">
                        <label class="col-sm-2 control-label" for="payment_intellectmoney_eshopId">{{ entry_eshopId }}</label>
                        <div class="col-sm-10">
                            <input type="text" name="payment_intellectmoney_eshopId" value="{{ payment_intellectmoney_eshopId }}" class="form-control" id="payment_intellectmoney_eshopId" />
                            {% if error_eshopId %}
                                <div class="text-danger">{{ error_eshopId }}</div>
                            {% endif %}
                        </div>
                    </div>

                    <div class="form-group required">
                        <label class="col-sm-2 control-label" for="payment_intellectmoney_secretKey">{{ entry_secretKey }}</label>
                        <div class="col-sm-10">
                            <input type="text" name="payment_intellectmoney_secretKey" value="{{ payment_intellectmoney_secretKey }}" class="form-control" id="payment_intellectmoney_secretKey" />
                            {% if error_secretKey %}
                                <div class="text-danger">{{ error_secretKey }}</div>
                            {% endif %}</td>
                        </div>
                    </div>

                    <div class="form-group">
                        <label class="col-sm-2 control-label" for="payment_intellectmoney_total">{{ entry_total }}</label>
                        <div class="col-sm-10">
                            <input type="text" name="payment_intellectmoney_total" value="{{ payment_intellectmoney_total }}" class="form-control" id="payment_intellectmoney_total" />
                        </div>
                    </div>

                    <div class="form-group required">
                        <label class="col-sm-2 control-label" for="payment_intellectmoney_resultUrl">{{ entry_resultUrl }}</label>
                        <div class="col-sm-10">
                            <div class="input-group"><span class="input-group-addon"><i class="fa fa-link"></i></span>
                                <input type="text" readonly="readonly" value="{{ payment_intellectmoney_resultUrl }}" id="payment_intellectmoney_resultUrl" class="form-control">
                                {% if error_resultUrl %}
                                    <div class="text-danger">{{ error_resultUrl }}</div>
                                {% endif %}
                            </div>
                        </div>
                    </div>

                    <div class="form-group">
                        <label class="col-sm-2 control-label" for="payment_intellectmoney_testMode">{{ entry_testMode }}</label>
                        <div class="col-sm-10">
                            <input type="checkbox" name="payment_intellectmoney_testMode" {% if payment_intellectmoney_testMode %}checked {% endif %} class="form-control" id="payment_intellectmoney_testMode" />
                        </div>
                    </div>

                    <div class="form-group">
                        <label class="col-sm-2 control-label" for="payment_intellectmoney_holdMode">{{ entry_holdMode }}</label>
                        <div class="col-sm-10">
                            <input type="checkbox" name="payment_intellectmoney_holdMode" {% if payment_intellectmoney_holdMode %}checked {% endif %} class="form-control" id="payment_intellectmoney_holdMode" />
                        </div>
                    </div>

                    <div class="form-group">
                        <label class="col-sm-2 control-label" for="payment_intellectmoney_holdTime">{{ entry_holdTime }}</label>
                        <div class="col-sm-10">
                            <input type="text" name="payment_intellectmoney_holdTime" value="{{ payment_intellectmoney_holdTime }}" class="form-control" id="payment_intellectmoney_holdTime" />
                            {% if error_holdTime %}
                                <div class="text-danger">{{ error_holdTime }}</div>
                            {% endif %}
                        </div>
                    </div>

                    <div class="form-group">
                        <label class="col-sm-2 control-label" for="payment_intellectmoney_expireDate">{{ entry_expireDate }}</label>
                        <div class="col-sm-10">
                            <input type="text" name="payment_intellectmoney_expireDate" value="{{ payment_intellectmoney_expireDate }}" class="form-control" id="payment_intellectmoney_expireDate" />
                            {% if error_expireDate %}
                                <div class="text-danger">{{ error_expireDate }}</div>
                            {% endif %}
                        </div>
                    </div>

                    <div class="form-group">
                        <label class="col-sm-2 control-label" for="payment_intellectmoney_successUrl">{{ entry_successUrl }}</label>
                        <div class="col-sm-10">
                            <input type="text" name="payment_intellectmoney_successUrl" value="{{ payment_intellectmoney_successUrl }}" class="form-control" id="payment_intellectmoney_successUrl" />
                            {% if error_successUrl %}
                                <div class="text-danger">{{ error_successUrl }}</div>
                            {% endif %}
                        </div>
                    </div>

                    <div class="form-group">
                        <label class="col-sm-2 control-label" for="payment_intellectmoney_preference">{{ entry_preference }}</label>
                        <div class="col-sm-10">
                            <input type="text" name="payment_intellectmoney_preference" value="{{ payment_intellectmoney_preference }}" class="form-control" id="payment_intellectmoney_preference" />
                            {% if error_preference %}
                                <div class="text-danger">{{ error_preference }}</div>
                            {% endif %}
                        </div>
                    </div>

                    <div class="form-group">
                        <label class="col-sm-2 control-label" for="payment_intellectmoney_tax">{{ entry_tax }}</label>
                        <div class="col-sm-10">
                            <select name="payment_intellectmoney_tax" id="payment_intellectmoney_tax" class="form-control">
                                {% for VAT in VATs %}
                                    <option value="{{ VAT.id }}" {% if VAT.id == payment_intellectmoney_tax %} selected="selected" {% endif %}>{{ VAT.name }}</option>
                                {% endfor %}
                            </select>
                        </div>
                    </div>

                    <div class="form-group">
                        <label class="col-sm-2 control-label" for="payment_intellectmoney_deliveryTax">{{ entry_deliveryTax }}</label>
                        <div class="col-sm-10">
                            <select name="payment_intellectmoney_deliveryTax" id="payment_intellectmoney_deliveryTax" class="form-control">
                                {% for VAT in VATs %}
                                    <option value="{{ VAT.id }}" {% if VAT.id == payment_intellectmoney_deliveryTax %} selected="selected" {% endif %}>{{ VAT.name }}</option>
                                {% endfor %}
                            </select>
                        </div>
                    </div>

                    <div class="form-group">
                        <label class="col-sm-2 control-label" for="payment_intellectmoney_group">{{ entry_group }}</label>
                        <div class="col-sm-10">
                            <input type="text" name="payment_intellectmoney_group" value="{{ payment_intellectmoney_group }}" class="form-control" id="payment_intellectmoney_group" />
                            {% if error_group %}
                                <div class="text-danger">{{ error_group }}</div>
                            {% endif %}
                        </div>
                    </div>

                    {% for statusIm in statusesIm %}
                        <div class="form-group required">
                            <label class="col-sm-2 control-label" for="{{ statusIm.dataName }}">{{ statusIm.name }}</label>
                            <div class="col-sm-10">
                                <select name="{{ statusIm.dataName }}" id="{{ statusIm.dataName }}" class="form-control">
                                    {% for order_status in order_statuses %}
                                        <option value="{{ order_status.order_status_id }}" {% if order_status.order_status_id == statusIm.value %} selected="selected" {% endif %}>{{ order_status.name }}</option>
                                    {% endfor %}
                                </select>
                            </div>
                        </div>
                    {% endfor %}

                    <div class="form-group">
                        <label class="col-sm-2 control-label" for="payment_intellectmoney_geo_zone_id">{{ entry_geo_zone }}</label>
                        <div class="col-sm-10">
                            <select name="payment_intellectmoney_geo_zone_id" id="payment_intellectmoney_geo_zone_id" class="form-control">
                                <option value="0">{{ text_all_zones }}</option>
                                {% for geo_zone in geo_zones %}
                                    {% if geo_zone.geo_zone_id == payment_intellectmoney_geo_zone_id %}
                                        <option value="{{ geo_zone.geo_zone_id }}" selected="selected">{{ geo_zone.name }}</option>
                                    {% else %}
                                        <option value="{{ geo_zone.geo_zone_id }}">{{ geo_zone.name }}</option>
                                    {% endif %}
                                {% endfor %}
                            </select>
                        </div>
                    </div>

                    <div class="form-group required">
                        <label class="col-sm-2 control-label" for="payment_intellectmoney_status">{{ entry_status }}</label>
                        <div class="col-sm-10">
                            <select name="payment_intellectmoney_status" id="payment_intellectmoney_status" class="form-control">
                                <option value="1" {% if payment_intellectmoney_status == 1 %} selected="selected" {% endif %}>{{ text_enabled }}</option>
                                <option value="0" {% if payment_intellectmoney_status == 0 %} selected="selected" {% endif %}>{{ text_disabled }}</option>
                            </select>
                        </div>
                    </div>

                    <div class="form-group">
                        <label class="col-sm-2 control-label" for="payment_intellectmoney_sort_order">{{ entry_sort_order }}</label>
                        <div class="col-sm-10">
                            <input type="text" name="payment_intellectmoney_sort_order" value="{{ payment_intellectmoney_sort_order }}" class="form-control" id="payment_intellectmoney_sort_order" />
                        </div>
                    </div>
                </form>
            </div>
        </div>
    </div>
</div>
{{ footer }} 



Expand
titleController PHP


Code Block
languagephp
titleController PHP
linenumberstrue
<?php

class ControllerExtensionPaymentIntellectmoney extends Controller {

    private $error = array();

    public function index() {
        $this->load->language('extension/payment/intellectmoney');

        if (method_exists($this->document, 'setTitle'))
            $this->document->setTitle($this->language->get('heading_title'));
        else
            $this->document->title = $this->language->get('heading_title');

        $this->load->model('setting/setting');
        $this->load->model('IntellectMoney/intellectmoney_model');
        $im_lang = $this->model_IntellectMoney_intellectmoney_model->getLanguageHelperInstance($this->language->data['code']);
        $im_userSettings = $this->model_IntellectMoney_intellectmoney_model->getUserSettingsInstance();

        if (($this->request->server['REQUEST_METHOD'] == 'POST') && ($this->validate($im_lang, $im_userSettings))) {
            foreach ($this->request->post as &$value) {
                $value = htmlspecialchars_decode($value);
            }

            $this->model_setting_setting->editSetting('payment_intellectmoney', $this->request->post);
            $this->session->data['success'] = $this->language->get('text_success');

            $this->response->redirect($this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=payment', true));
        }

        //map breadcrums
        $data['breadcrumbs'] = array();
        $data['breadcrumbs'][] = array(
            'text' => $this->language->get('text_home'),
            'href' => $this->url->link('common/dashboard', 'user_token=' . $this->session->data['user_token'], true)
        );
        $data['breadcrumbs'][] = array(
            'text' => $this->language->get('text_payment'),
            'href' => $this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'], true)
        );
        $data['breadcrumbs'][] = array(
            'text' => $this->language->get('heading_title'),
            'href' => $this->url->link('extension/payment/intellectmoney', 'user_token=' . $this->session->data['user_token'], true)
        );
        $data['action'] = $this->url->link('extension/payment/intellectmoney', 'user_token=' . $this->session->data['user_token'], true);
        $data['cancel'] = $this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=payment', true);

        //map Titles
        foreach ($im_userSettings->getNamesOfOrganizationParamsToSave() as $value) {
            $data['entry_' . $value] = $im_lang->getTitle($value);
        }
        $data['entry_total'] = $this->language->get('entry_total');
        $data['entry_resultUrl'] = $im_lang->getTitle('resultUrl');
        $data['heading_title'] = $this->language->get('heading_title');
        $data['text_edit'] = $this->language->get('text_edit');
        $data['button_save'] = $this->language->get('button_save');
        $data['button_cancel'] = $this->language->get('button_cancel');
        $data['tab_general'] = $this->language->get('tab_general');
        $data['entry_geo_zone'] = $this->language->get('entry_geo_zone');
        $data['entry_status'] = $this->language->get('entry_status');
        $data['entry_sort_order'] = $this->language->get('entry_sort_order');
        $data['text_enabled'] = $this->language->get('text_enabled');
        $data['text_disabled'] = $this->language->get('text_disabled');
        $data['text_all_zones'] = $this->language->get('text_all_zones');

        //map Errors
        $data['error_warning'] = isset($this->error['warning']) ? $this->error['warning'] : "";
        foreach ($this->error as $key => $value) {
            $data['error_' . $key] = $value;
        }

        //map Values
        foreach ($im_userSettings->getNamesOfOrganizationParamsToSave() as $value) {
            if (isset($this->request->post['payment_intellectmoney_' . $value])) {
                $funcName = 'get' . ucfirst($value);
                $data['payment_intellectmoney_' . $value] = $this->request->post['payment_intellectmoney_' . $value];
            } else {
                $data['payment_intellectmoney_' . $value] = $this->config->get('payment_intellectmoney_' . $value);
            }
        }
        $this->load->model('localisation/geo_zone');
        $data['geo_zones'] = $this->model_localisation_geo_zone->getGeoZones();
        $this->load->model('localisation/order_status');
        $data['order_statuses'] = $this->model_localisation_order_status->getOrderStatuses();
        $data['payment_intellectmoney_total'] = isset($this->request->post['payment_intellectmoney_total']) ? $this->request->post['payment_intellectmoney_total'] : $this->config->get('payment_intellectmoney_total');
        $data['payment_intellectmoney_geo_zone_id'] = isset($this->request->post['payment_intellectmoney_geo_zone_id']) ? $this->request->post['payment_intellectmoney_geo_zone_id'] : $this->config->get('payment_intellectmoney_geo_zone_id');
        $data['payment_intellectmoney_status'] = isset($this->request->post['payment_intellectmoney_status']) ? $this->request->post['payment_intellectmoney_status'] : $this->config->get('payment_intellectmoney_status');
        $data['payment_intellectmoney_sort_order'] = isset($this->request->post['payment_intellectmoney_sort_order']) ? $this->request->post['payment_intellectmoney_sort_order'] : $this->config->get('payment_intellectmoney_sort_order');
        $data['payment_intellectmoney_total'] = isset($this->request->post['payment_intellectmoney_total']) ? $this->request->post['payment_intellectmoney_total'] : $this->config->get('payment_intellectmoney_total');
        $data['payment_intellectmoney_geo_zone_id'] = isset($this->request->post['payment_intellectmoney_geo_zone_id']) ? $this->request->post['payment_intellectmoney_geo_zone_id'] : $this->config->get('payment_intellectmoney_geo_zone_id');
        $data['payment_intellectmoney_status'] = isset($this->request->post['payment_intellectmoney_status']) ? $this->request->post['payment_intellectmoney_status'] : $this->config->get('payment_intellectmoney_status');
        $data['payment_intellectmoney_sort_order'] = isset($this->request->post['payment_intellectmoney_sort_order']) ? $this->request->post['payment_intellectmoney_sort_order'] : $this->config->get('payment_intellectmoney_sort_order');
        $data['payment_intellectmoney_resultUrl'] = HTTP_CATALOG . 'index.php?route=extension/payment/intellectmoney/callback';

        $this->load->model('localisation/order_status');
        $data['order_statuses'] = $this->model_localisation_order_status->getOrderStatuses();
        $data['VATs'] = $this->model_IntellectMoney_intellectmoney_model->getVATsList();
        $data['statusesIm'] = array(
            array(
                'name' => $data['entry_statusCreated'],
                'dataName' => 'payment_intellectmoney_statusCreated',
                'value' => $data['payment_intellectmoney_statusCreated']
            ),
            array(
                'name' => $data['entry_statusCancelled'],
                'dataName' => 'payment_intellectmoney_statusCancelled',
                'value' => $data['payment_intellectmoney_statusCancelled']
            ),
            array(
                'name' => $data['entry_statusPaid'],
                'dataName' => 'payment_intellectmoney_statusPaid',
                'value' => $data['payment_intellectmoney_statusPaid']
            ),
            array(
                'name' => $data['entry_statusHolded'],
                'dataName' => 'payment_intellectmoney_statusHolded',
                'value' => $data['payment_intellectmoney_statusHolded']
            ),
            array(
                'name' => $data['entry_statusPartiallyPaid'],
                'dataName' => 'payment_intellectmoney_statusPartiallyPaid',
                'value' => $data['payment_intellectmoney_statusPartiallyPaid']
            ),
            array(
                'name' => $data['entry_statusRefunded'],
                'dataName' => 'payment_intellectmoney_statusRefunded',
                'value' => $data['payment_intellectmoney_statusRefunded']
            ),
        );

        $data['header'] = $this->load->controller('common/header');
        $data['column_left'] = $this->load->controller('common/column_left');
        $data['footer'] = $this->load->controller('common/footer');

        $this->response->setOutput($this->load->view('extension/payment/intellectmoney', $data));
    }

    private function validate($im_lang, $im_userSettings) {
        if (!$this->user->hasPermission('modify', 'extension/payment/intellectmoney')) {
            $this->error['warning'] = $this->language->get('error_permission');
        }

        foreach ($im_userSettings->getNamesOfOrganizationParamsToSave() as $paramName) {
            $methodName = 'set' . ucfirst($paramName);
            $paramValue = isset($this->request->post['payment_intellectmoney_' . $paramName]) ? $this->request->post['payment_intellectmoney_' . $paramName] : "";
            if (in_array($paramName, array('holdMode', 'testMode')) && $paramValue == 'on') {
                $paramValue = 1;
            }
            if (!$im_userSettings->$methodName($paramValue)) {
                $this->error[$paramName] = $im_lang->getDesc($paramName);
            }
        }
        return empty($this->error);
    }

}

?>



Expand
titleModel PHP


Code Block
languagephp
titleModel PHP
linenumberstrue
<?php

require_once("IntellectMoneyCommon/LanguageHelper.php");
require_once("IntellectMoneyCommon/UserSettings.php");
require_once("IntellectMoneyCommon/VATs.php");

class ModelIntellectMoneyIntellectmoneyModel extends Model {

    public function getLanguageHelperInstance($lang = 'ru', $isCp1251 = NULL) {
        return \PaySystem\LanguageHelper::getInstance($lang, $isCp1251);
    }

    public function getUserSettingsInstance($params = array(), $isAllowChangeValues = true) {
        return \PaySystem\UserSettings::getInstance($params, $isAllowChangeValues);
    }

    public function getVATsList() {
        return \PaySystem\VATs::getList();
    }

}



Вывод формы для выставления платежа на примере модуля для CMS OpenCart (Паттерн MVC)

Expand
titleView на шаблонизаторе twig


Code Block
languagephp
titleView на шаблонизаторе twig
linenumberstrue
{{ form }}
<div class="buttons">
    <div class="pull-right">
        <input type="submit" value="{{ button_confirm }}" class="btn btn-primary" onclick="getElementById('IntellectMoneyPaymentForm').submit();" />
    </div>
</div>



Expand
titleController PHP


Code Block
languagephp
titleController PHP
linenumberstrue
<?php

class ControllerExtensionPaymentIntellectmoney extends Controller {

    public function index() {
        $im_userSettings = $this->loadSettings();
        $orderInfo = $this->model_checkout_order->getOrder($this->session->data['order_id']);
        $im_customer = $this->model_extension_payment_intellectmoney->getCustomerInstance($orderInfo['email'], $orderInfo['shipping_firstname'] . " " . $orderInfo['shipping_lastname'], $orderInfo['telephone']);
        $im_order = $this->model_extension_payment_intellectmoney->getOrderInstance(NULL, $orderInfo['order_id'], $orderInfo['total'], $orderInfo['total'], NULL, NULL, $orderInfo['currency_code'], NULL, NULL);
        //products
        foreach ($this->cart->getProducts() as $product) {
            $im_order->addItem($product['price'], $product['quantity'], $product['name'], $this->loadSettings()->getTax());
        }
        //delivery
        if (isset($this->session->data['shipping_methods'])) {
            $im_order->addItem($this->session->data['shipping_methods']['flat']['quote']['flat']['cost'], 1, $this->session->data['shipping_methods']['flat']['quote']['flat']['title'], $this->loadSettings()->getDeliveryTax());
        }

        $im_payment = $this->model_extension_payment_intellectmoney->getPaymentInstance($im_userSettings, $im_order, $im_customer, $this->language->data['code']);
        $data['form'] = $im_payment->generateForm(true);
        $data['button_confirm'] = $this->language->get('button_confirm');

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

    private function loadSettings() {
        $this->load->language('extension/payment/intellectmoney');
        $this->load->model('extension/payment/intellectmoney');
        $this->load->model('checkout/order');

        $im_userSettings = $this->model_extension_payment_intellectmoney->getUserSettingsInstance();
        $params = array();
        foreach ($im_userSettings->getNamesOfOrganizationParamsToSave() as $value) {
            if (in_array($value, array('holdMode', 'testMode')) && $this->config->get('payment_intellectmoney_' . $value) == 'on') {
                $params[$value] = 1;
            } else {
                $params[$value] = $this->config->get('payment_intellectmoney_' . $value);
            }
        }
        $im_userSettings->setParams($params);
        $im_userSettings->setMerchantUrl('https://merchant.intellectmoney.ru');
        return $im_userSettings;
    }

}

?>



Expand
titleModel PHP


Code Block
languagephp
titleModel PHP
linenumberstrue
<?php

require_once("admin/model/IntellectMoney/IntellectMoneyCommon/LanguageHelper.php");
require_once("admin/model/IntellectMoney/IntellectMoneyCommon/UserSettings.php");
require_once("admin/model/IntellectMoney/IntellectMoneyCommon/Order.php");
require_once("admin/model/IntellectMoney/IntellectMoneyCommon/Customer.php");
require_once("admin/model/IntellectMoney/IntellectMoneyCommon/Payment.php");
require_once("admin/model/IntellectMoney/IntellectMoneyCommon/Result.php");

class ModelExtensionPaymentIntellectMoney extends Model {

    public function getMethod($address, $total) {
        $this->load->language('extension/payment/intellectmoney');

        $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "zone_to_geo_zone WHERE geo_zone_id = '" . (int) $this->config->get('payment_intellectmoney_geo_zone_id') . "' AND country_id = '" . (int) $address['country_id'] . "' AND (zone_id = '" . (int) $address['zone_id'] . "' OR zone_id = '0')");

        if ($this->config->get('payment_intellectmoney_total') > 0 && $this->config->get('payment_intellectmoney_total') > $total) {
            $status = false;
        } elseif (!$this->config->get('payment_intellectmoney_geo_zone_id')) {
            $status = true;
        } elseif ($query->num_rows) {
            $status = true;
        } else {
            $status = false;
        }

        $method_data = array();
        if ($status) {
            $method_data = array(
                'code' => 'intellectmoney',
                'title' => $this->language->get('text_title'),
                'terms' => '',
                'sort_order' => $this->config->get('payment_intellectmoney_sort_order')
            );
        }

        return $method_data;
    }

    public function getLanguageHelperInstance($lang = 'ru', $isCp1251 = NULL) {
        return \PaySystem\LanguageHelper::getInstance($lang, $isCp1251);
    }

    public function getUserSettingsInstance($params = array(), $isAllowChangeValues = true) {
        return \PaySystem\UserSettings::getInstance($params, $isAllowChangeValues);
    }

    public function getOrderInstance($invoiceId = NULL, $orderId = NULL, $originalAmount = NULL, $recipientAmount = NULL, $paidAmount = NULL, $deliveryAmount = NULL, $recipientCurrency = NULL, $discount = NULL, $status = NULL) {
        return \PaySystem\Order::getInstance($invoiceId, $orderId, $originalAmount, $recipientAmount, $paidAmount, $deliveryAmount, $recipientCurrency, $discount, $status);
    }

    public function getCustomerInstance($email = NULL, $name = NULL, $phone = NULL) {
        return \PaySystem\Customer::getInstance($email, $name, $phone);
    }

    public function getPaymentInstance($UserSettings = NULL, $Order = NULL, $Customer = NULL, $lang = 'ru') {
        return \PaySystem\Payment::getInstance($UserSettings, $Order, $Customer, $lang);
    }

    public function getResultInstance($request = array(), $UserSettings = "", $Order = "", $lang = 'ru', $isCp1251 = false) {
        return \PaySystem\Result::getInstance($request, $UserSettings, $Order, $lang, $isCp1251);
    }

    public function changeOrderStatusCMS($orderId, $statusCMS) {
        $this->load->model('checkout/order');
        $this->model_checkout_order->addOrderHistory($orderId, $statusCMS, 'IntellectMoney', False);
        return true;
    }

    public function getImStatusFromOrder($orderId) {
        return $this->getParamFromOrder($orderId, 'imStatus');
    }

    public function getinvoiceIdFromOrder($orderId) {
        return $this->getParamFromOrder($orderId, 'invoiceId');
    }

    public function getParamFromOrder($orderId, $paramName) {
        $params = $this->getCustomDataFromOrder($orderId);
        return isset($params['custom_field'][$paramName]) ? $params['custom_field'][$paramName] : NULL;
    }

    public function saveImStatusToOrder($orderId, $imStatus) {
        return $this->saveParamToOrder($orderId, 'imStatus', $imStatus);
    }

    public function saveInvoiceIdToOrder($orderId, $invoiceId) {
        return $this->saveParamToOrder($orderId, 'invoiceId', $invoiceId);
    }

    public function saveParamToOrder($orderId, $paramName, $value) {
        $params = $this->getCustomDataFromOrder($orderId);
        $params['custom_field'][$paramName] = $value;
        return $this->saveCustomDataToOrder($orderId, $params);
    }

    private function saveCustomDataToOrder($orderId, $params) {
        $this->load->model('checkout/order');
        $this->model_checkout_order->editOrder($orderId, $params);
        return true;
    }

    private function getCustomDataFromOrder($orderId) {
        $this->load->model('checkout/order');
        $orderData = $this->model_checkout_order->getOrder($orderId);
        return isset($orderData['custom_field']) ? $orderData : false;
    }

}


Обработка статуса платежа на примере модуля для CMS OpenCart (Паттерн MVC)

Expand
titleController PHP


Code Block
languagephp
titleController PHP
linenumberstrue
<?php

class ControllerExtensionPaymentIntellectmoney extends Controller {

    public function callback() {
        $im_userSettings = $this->loadSettings();

        $orderInfo = $this->model_checkout_order->getOrder($this->request->get['orderId']);
        $im_order = $this->model_extension_payment_intellectmoney->getOrderInstance($this->model_extension_payment_intellectmoney->getinvoiceIdFromOrder($orderInfo['order_id']), $orderInfo['order_id'], $orderInfo['total'], $orderInfo['total'], NULL, NULL, $orderInfo['currency_code'], NULL, $this->model_extension_payment_intellectmoney->getImStatusFromOrder($orderInfo['order_id']));
        $im_result = $this->model_extension_payment_intellectmoney->getResultInstance($this->request->get, $im_userSettings, $im_order, $this->language->data['code']);

        $response = $im_result->processingResponse();
        if ($response->changeStatusResult) {
            if (!$this->model_extension_payment_intellectmoney->getinvoiceIdFromOrder($this->request->get['orderId'])) {
                $this->model_extension_payment_intellectmoney->saveInvoiceIdToOrder($this->request->get['orderId'], $this->request->get['paymentId']);
            }
            $this->model_extension_payment_intellectmoney->saveImStatusToOrder($this->request->get['orderId'], $this->request->get['paymentStatus']);
            $this->model_extension_payment_intellectmoney->changeOrderStatusCMS($this->request->get['orderId'], $response->statusCMS);
        }

        echo $im_result->getMessage();
        die;
    }

    private function loadSettings() {
        $this->load->language('extension/payment/intellectmoney');
        $this->load->model('extension/payment/intellectmoney');
        $this->load->model('checkout/order');

        $im_userSettings = $this->model_extension_payment_intellectmoney->getUserSettingsInstance();
        $params = array();
        foreach ($im_userSettings->getNamesOfOrganizationParamsToSave() as $value) {
            if (in_array($value, array('holdMode', 'testMode')) && $this->config->get('payment_intellectmoney_' . $value) == 'on') {
                $params[$value] = 1;
            } else {
                $params[$value] = $this->config->get('payment_intellectmoney_' . $value);
            }
        }
        $im_userSettings->setParams($params);
        $im_userSettings->setMerchantUrl('https://merchant.intellectmoney.ru');
        return $im_userSettings;
    }

}

?>



Expand
titleModel PHP


Code Block
languagephp
titleModel PHP
linenumberstrue
<?php

require_once("admin/model/IntellectMoney/IntellectMoneyCommon/LanguageHelper.php");
require_once("admin/model/IntellectMoney/IntellectMoneyCommon/UserSettings.php");
require_once("admin/model/IntellectMoney/IntellectMoneyCommon/Order.php");
require_once("admin/model/IntellectMoney/IntellectMoneyCommon/Customer.php");
require_once("admin/model/IntellectMoney/IntellectMoneyCommon/Payment.php");
require_once("admin/model/IntellectMoney/IntellectMoneyCommon/Result.php");

class ModelExtensionPaymentIntellectMoney extends Model {

    public function getMethod($address, $total) {
        $this->load->language('extension/payment/intellectmoney');

        $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "zone_to_geo_zone WHERE geo_zone_id = '" . (int) $this->config->get('payment_intellectmoney_geo_zone_id') . "' AND country_id = '" . (int) $address['country_id'] . "' AND (zone_id = '" . (int) $address['zone_id'] . "' OR zone_id = '0')");

        if ($this->config->get('payment_intellectmoney_total') > 0 && $this->config->get('payment_intellectmoney_total') > $total) {
            $status = false;
        } elseif (!$this->config->get('payment_intellectmoney_geo_zone_id')) {
            $status = true;
        } elseif ($query->num_rows) {
            $status = true;
        } else {
            $status = false;
        }

        $method_data = array();
        if ($status) {
            $method_data = array(
                'code' => 'intellectmoney',
                'title' => $this->language->get('text_title'),
                'terms' => '',
                'sort_order' => $this->config->get('payment_intellectmoney_sort_order')
            );
        }

        return $method_data;
    }

    public function getLanguageHelperInstance($lang = 'ru', $isCp1251 = NULL) {
        return \PaySystem\LanguageHelper::getInstance($lang, $isCp1251);
    }

    public function getUserSettingsInstance($params = array(), $isAllowChangeValues = true) {
        return \PaySystem\UserSettings::getInstance($params, $isAllowChangeValues);
    }

    public function getOrderInstance($invoiceId = NULL, $orderId = NULL, $originalAmount = NULL, $recipientAmount = NULL, $paidAmount = NULL, $deliveryAmount = NULL, $recipientCurrency = NULL, $discount = NULL, $status = NULL) {
        return \PaySystem\Order::getInstance($invoiceId, $orderId, $originalAmount, $recipientAmount, $paidAmount, $deliveryAmount, $recipientCurrency, $discount, $status);
    }

    public function getCustomerInstance($email = NULL, $name = NULL, $phone = NULL) {
        return \PaySystem\Customer::getInstance($email, $name, $phone);
    }

    public function getPaymentInstance($UserSettings = NULL, $Order = NULL, $Customer = NULL, $lang = 'ru') {
        return \PaySystem\Payment::getInstance($UserSettings, $Order, $Customer, $lang);
    }

    public function getResultInstance($request = array(), $UserSettings = "", $Order = "", $lang = 'ru', $isCp1251 = false) {
        return \PaySystem\Result::getInstance($request, $UserSettings, $Order, $lang, $isCp1251);
    }

    public function changeOrderStatusCMS($orderId, $statusCMS) {
        $this->load->model('checkout/order');
        $this->model_checkout_order->addOrderHistory($orderId, $statusCMS, 'IntellectMoney', False);
        return true;
    }

    public function getImStatusFromOrder($orderId) {
        return $this->getParamFromOrder($orderId, 'imStatus');
    }

    public function getinvoiceIdFromOrder($orderId) {
        return $this->getParamFromOrder($orderId, 'invoiceId');
    }

    public function getParamFromOrder($orderId, $paramName) {
        $params = $this->getCustomDataFromOrder($orderId);
        return isset($params['custom_field'][$paramName]) ? $params['custom_field'][$paramName] : NULL;
    }

    public function saveImStatusToOrder($orderId, $imStatus) {
        return $this->saveParamToOrder($orderId, 'imStatus', $imStatus);
    }

    public function saveInvoiceIdToOrder($orderId, $invoiceId) {
        return $this->saveParamToOrder($orderId, 'invoiceId', $invoiceId);
    }

    public function saveParamToOrder($orderId, $paramName, $value) {
        $params = $this->getCustomDataFromOrder($orderId);
        $params['custom_field'][$paramName] = $value;
        return $this->saveCustomDataToOrder($orderId, $params);
    }

    private function saveCustomDataToOrder($orderId, $params) {
        $this->load->model('checkout/order');
        $this->model_checkout_order->editOrder($orderId, $params);
        return true;
    }

    private function getCustomDataFromOrder($orderId) {
        $this->load->model('checkout/order');
        $orderData = $this->model_checkout_order->getOrder($orderId);
        return isset($orderData['custom_field']) ? $orderData : false;
    }

}