diff --git a/OpenCart_3/upload/admin/controller/extension/payment/shoputils_ik.php b/OpenCart_3/upload/admin/controller/extension/payment/shoputils_ik.php new file mode 100644 index 0000000..51dde22 --- /dev/null +++ b/OpenCart_3/upload/admin/controller/extension/payment/shoputils_ik.php @@ -0,0 +1,379 @@ +load->language('extension/payment/shoputils_ik'); + $this->document->setTitle($this->language->get('heading_title')); + } + + public function index() { + if (($this->request->server['REQUEST_METHOD'] == 'POST') && ($this->validate())) { + $this->_trimData(array( + 'payment_shoputils_ik_shop_id', + 'payment_shoputils_ik_sign_hash', + 'payment_shoputils_ik_sign_test_key', + 'payment_shoputils_ik_minimal_order', + 'payment_shoputils_ik_maximal_order' + )); + + $this->_replaceData(',', '.', array( + 'payment_shoputils_ik_minimal_order', + 'payment_shoputils_ik_maximal_order' + )); + + $this->load->model('setting/setting'); + + $this->model_setting_setting->editSetting('payment_shoputils_ik', $this->request->post); + $this->session->data['success'] = sprintf($this->language->get('text_success'), $this->language->get('heading_title')); + + $this->response->redirect($this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=payment', true)); + } + + $this->load->model('localisation/currency'); + $this->load->model('localisation/geo_zone'); + $this->load->model('localisation/language'); + $this->load->model('localisation/order_status'); + + $ik_currencies = array( + '' => $this->language->get('text_currency_auto'), + 'RUB' => $this->language->get('text_currency_rub'), + 'UAH' => $this->language->get('text_currency_uah'), + 'USD' => $this->language->get('text_currency_usd'), + 'EUR' => $this->language->get('text_currency_eur') + ); + + $ik_lifetimes = array( + 5 => $this->language->get('text_lifetime_5minuts'), + 30 => $this->language->get('text_lifetime_30minuts'), + 60 => $this->language->get('text_lifetime_1hour'), + 1440 => $this->language->get('text_lifetime_1day'), + 10080 => $this->language->get('text_lifetime_1weekly'), + 43200 => $this->language->get('text_lifetime_30days') + ); + + $permission = $this->validatePermission(); + if (!$permission ) { + $this->error['warning'] = sprintf($this->language->get('error_permission'), $this->language->get('heading_title')); + } + + $server = isset($this->request->server['HTTPS']) && (($this->request->server['HTTPS'] == 'on') || ($this->request->server['HTTPS'] == '1')) ? HTTPS_CATALOG : HTTP_CATALOG; + + $data = $this->_setData(array( + 'heading_title', + 'button_save', + 'button_cancel', + 'button_clear', + 'tab_general', + 'tab_emails', + 'tab_settings', + 'tab_log', + 'tab_information', + 'lang', + 'text_confirm', + 'text_enabled', + 'text_disabled', + 'text_all_zones', + 'text_yes', + 'text_no', + 'text_info', + 'text_info_content', + 'text_parameters', + 'entry_geo_zone', + 'entry_status', + 'entry_sort_order', + 'entry_minimal_order', + 'entry_maximal_order', + 'entry_order_status', + 'entry_order_confirm_status', + 'entry_order_fail_status', + 'entry_laterpay_mode', + 'entry_order_later_status', + 'entry_title', + 'entry_instruction', + + 'entry_notify_customer_success', + 'entry_mail_customer_success_subject', + 'entry_mail_customer_success_content', + 'entry_notify_customer_fail', + 'entry_mail_customer_fail_subject', + 'entry_mail_customer_fail_content', + 'entry_notify_admin_success', + 'entry_mail_admin_success_subject', + 'entry_mail_admin_success_content', + 'entry_notify_admin_fail', + 'entry_mail_admin_fail_subject', + 'entry_mail_admin_fail_content', + + 'entry_shop_id', + 'entry_sign_hash', + 'entry_sign_test_key', + 'entry_test_mode', + 'entry_currency', + 'entry_lifetime', + 'entry_success_url', + 'entry_fail_url', + 'entry_pending_url', + 'entry_status_url', + + 'entry_log', + 'entry_log_file', + + 'placeholder_instruction', + + 'help_minimal_order', + 'help_maximal_order', + 'help_order_confirm_status', + 'help_order_status', + 'help_order_fail_status', + 'help_laterpay_mode', + 'help_order_later_status', + 'help_title', + 'help_instruction', + + 'help_notify_customer_success', + 'help_mail_customer_success_subject', + 'help_mail_customer_success_content', + 'help_notify_customer_fail', + 'help_mail_customer_fail_subject', + 'help_mail_customer_fail_content', + 'help_notify_admin_success', + 'help_mail_admin_success_subject', + 'help_mail_admin_success_content', + 'help_notify_admin_fail', + 'help_mail_admin_fail_subject', + 'help_mail_admin_fail_content', + + 'help_shop_id', + 'help_sign_hash', + 'help_sign_test_key', + 'help_test_mode', + 'help_currency', + 'help_lifetime', + 'help_log_file' => sprintf($this->language->get('help_log_file'), self::MAX_LAST_LOG_LINES), + 'help_log' => sprintf($this->language->get('help_log'), self::FILE_NAME_LOG), + 'title_default' => explode(',', $this->language->get('heading_title')), + 'action' => $this->makeUrl('extension/payment/shoputils_ik'), + 'cancel' => $this->makeUrl('extension/extension', 'type=payment'), + 'clear_log' => $this->makeUrl('extension/payment/shoputils_ik/clearLog'), + 'text_copyright' => sprintf($this->language->get('text_copyright'), $this->language->get('heading_title')), + 'payment_shoputils_ik_success_url' => $server . 'index.php?route=extension/payment/shoputils_ik/success', + 'payment_shoputils_ik_fail_url' => $server . 'index.php?route=extension/payment/shoputils_ik/fail', + 'payment_shoputils_ik_pending_url' => $server . 'index.php?route=extension/payment/shoputils_ik/success', + 'payment_shoputils_ik_status_url' => $server . 'index.php?route=extension/payment/shoputils_ik/status', + 'permission' => $permission, + 'error_warning' => isset($this->error['warning']) ? $this->error['warning'] : '', + 'error_shop_id' => isset($this->error['error_shop_id']) ? $this->error['error_shop_id'] : '', + 'error_sign_hash' => isset($this->error['error_sign_hash']) ? $this->error['error_sign_hash'] : '', + 'error_sign_test_key' => isset($this->error['error_sign_test_key']) ? $this->error['error_sign_test_key'] : '', + 'version' => $this->version, + 'log_lines' => $this->readLastLines(DIR_LOGS . 'payment_shoputils_ik.log', self::MAX_LAST_LOG_LINES), + 'log_filename' => self::FILE_NAME_LOG, + 'currencies' => array_intersect_key($ik_currencies, $this->model_localisation_currency->getCurrencies()), + 'lifetimes' => $ik_lifetimes, + 'geo_zones' => $this->model_localisation_geo_zone->getGeoZones(), + 'order_statuses' => array_merge(array(0 => array('order_status_id' => '0', 'name' => $this->language->get('text_order_status_cart'))), + $this->model_localisation_order_status->getOrderStatuses()), + 'oc_languages' => $this->model_localisation_language->getLanguages() + )); + + $data['breadcrumbs'][] = array( + 'href' => $this->makeUrl('common/dashboard'), + 'text' => $this->language->get('text_home') + ); + + $data['breadcrumbs'][] = array( + 'href' => $this->makeUrl('extension/extension', 'type=payment'), + 'text' => $this->language->get('text_extension') + ); + + $data['breadcrumbs'][] = array( + 'href' => $this->makeUrl('extension/payment/shoputils_ik'), + 'text' => $this->language->get('heading_title') + ); + + $data['logs'] = array( + '0' => $this->language->get('text_log_off'), + '1' => $this->language->get('text_log_short'), + '2' => $this->language->get('text_log_full') + ); + + $data['test_modes'] = array( + '0' => $this->language->get('text_disabled'), + '1' => $this->language->get('text_enabled'), + ); + + $data = array_merge($data, $this->_updateData( + array( + 'payment_shoputils_ik_geo_zone_id', + 'payment_shoputils_ik_sort_order', + 'payment_shoputils_ik_status', + 'payment_shoputils_ik_minimal_order', + 'payment_shoputils_ik_maximal_order', + 'payment_shoputils_ik_order_status_id', + 'payment_shoputils_ik_order_fail_status_id', + 'payment_shoputils_ik_order_confirm_status_id', + 'payment_shoputils_ik_langdata', + + 'payment_shoputils_ik_shop_id', + 'payment_shoputils_ik_sign_hash', + 'payment_shoputils_ik_sign_test_key', + 'payment_shoputils_ik_test_mode', + 'payment_shoputils_ik_currency', + 'payment_shoputils_ik_lifetime', + 'payment_shoputils_ik_log' + ), + array() + )); + + $data = array_merge($data, $this->_setData( + array( + 'header' => $this->load->controller('common/header'), + 'column_left' => $this->load->controller('common/column_left'), + 'footer' => $this->load->controller('common/footer') + ) + )); + + $this->response->setOutput($this->load->view('extension/payment/shoputils_ik', $data)); + } + + public function clearLog() { + $json = array(); + + if ($this->validatePermission()) { + if (is_file(DIR_LOGS . self::FILE_NAME_LOG)) { + @unlink(DIR_LOGS . self::FILE_NAME_LOG); + } + $json['success'] = $this->language->get('text_clear_log_success'); + } else { + $json['error'] = $this->language->get('error_clear_log'); + } + + $this->response->addHeader('Content-Type: application/json'); + $this->response->setOutput(json_encode($json)); + } + + protected function validate() { + if (!$this->validatePermission()) { + $this->error['warning'] = sprintf($this->language->get('error_permission'), $this->language->get('heading_title')); + } else { + if (!isset($this->request->post['payment_shoputils_ik_shop_id']) || !trim($this->request->post['payment_shoputils_ik_shop_id'])) { + $this->error['warning'] = $this->error['error_shop_id'] = sprintf($this->language->get('error_form'), + $this->language->get('entry_shop_id'), + $this->language->get('tab_settings')); + } + + if (!isset($this->request->post['payment_shoputils_ik_sign_hash']) || !trim($this->request->post['payment_shoputils_ik_sign_hash'])) { + $this->error['warning'] = $this->error['error_sign_hash'] = sprintf($this->language->get('error_form'), + $this->language->get('entry_sign_hash'), + $this->language->get('tab_settings')); + } + + if (!isset($this->request->post['payment_shoputils_ik_sign_test_key']) || !trim($this->request->post['payment_shoputils_ik_sign_test_key'])) { + $this->error['warning'] = $this->error['error_sign_test_key'] = sprintf($this->language->get('error_form'), + $this->language->get('entry_sign_test_key'), + $this->language->get('tab_settings')); + } + } + + return !$this->error; + } + + protected function _setData($values) { + $data = array(); + foreach ($values as $key => $value) { + if (is_int($key)) { + $data[$value] = $this->language->get($value); + } else { + $data[$key] = $value; + } + } + return $data; + } + + protected function _updateData($keys, $info = array()) { + $data = array(); + foreach ($keys as $key) { + if (isset($this->request->post[$key])) { + $data[$key] = $this->request->post[$key]; + } elseif (isset($info[$key])) { + $data[$key] = $info[$key]; + } else { + $data[$key] = $this->config->get($key); + } + } + return $data; + } + + protected function validatePermission() { + return $this->user->hasPermission('modify', 'extension/payment/shoputils_ik'); + } + + protected function _trimData($values) { + foreach ($values as $value) { + if (isset($this->request->post[$value])) { + $this->request->post[$value] = trim($this->request->post[$value]); + } + } + } + + protected function _replaceData($search, $replace, $values) { + foreach ($values as $value) { + if (isset($this->request->post[$value])) { + $this->request->post[$value] = str_replace($search, $replace, $this->request->post[$value]); + } + } + } + + protected function makeUrl($route, $url = '') { + return str_replace('&', '&', $this->url->link($route, $url . '&user_token=' . $this->session->data['user_token'], true)); + } + + protected function readLastLines($filename, $lines) { + if (!is_file($filename)) { + return array(); + } + $handle = @fopen($filename, "r"); + if (!$handle) { + return array(); + } + $linecounter = $lines; + $pos = -1; + $beginning = false; + $text = array(); + + while ($linecounter > 0) { + $t = " "; + + while ($t != "\n") { + /* if fseek() returns -1 we need to break the cycle*/ + if (fseek($handle, $pos, SEEK_END) == -1) { + $beginning = true; + break; + } + $t = fgetc($handle); + $pos--; + } + + $linecounter--; + + if ($beginning) { + rewind($handle); + } + + $text[$lines - $linecounter - 1] = fgets($handle); + + if ($beginning) { + break; + } + } + fclose($handle); + + return array_reverse($text); + } +} +?> \ No newline at end of file diff --git a/OpenCart_3/upload/admin/language/en-gb/extension/payment/shoputils_ik.php b/OpenCart_3/upload/admin/language/en-gb/extension/payment/shoputils_ik.php new file mode 100644 index 0000000..505fd72 --- /dev/null +++ b/OpenCart_3/upload/admin/language/en-gb/extension/payment/shoputils_ik.php @@ -0,0 +1,119 @@ +new.interkassa.com'; +$_['text_order_status_cart'] = 'Корзина (Ошибочный заказ)'; +$_['text_log_off'] = 'Выключен'; +$_['text_log_short'] = 'Частичный (Только результаты операций)'; +$_['text_log_full'] = 'Полный (Все запросы)'; + +$_['text_currency_auto'] = 'Определять автоматически'; +$_['text_currency_rub'] = 'Российские рубли (RUB-643)'; +$_['text_currency_uah'] = 'Украинские гривны (UAH-980)'; +$_['text_currency_usd'] = 'Доллары США (USD-840)'; +$_['text_currency_eur'] = 'Евро (EUR-978)'; +$_['text_lifetime_5minuts'] = '5 минут'; +$_['text_lifetime_30minuts'] = '30 минут'; +$_['text_lifetime_1hour'] = '1 час'; +$_['text_lifetime_1day'] = '1 день'; +$_['text_lifetime_1weekly'] = '1 неделя'; +$_['text_lifetime_30days'] = '30 дней'; +$_['text_copyright'] = 'Модуль оплаты "%s" разработан по заказу платежной системы "Interkassa" при поддержке ShopUtils. Если Вам требуется больше возможностей, возможно Вам потребуется более функциональный модуль.'; +$_['text_copyright'] = '© Разработано ShopUtils по заказу платежной системы "Interkassa". Расширенный функционал - в коммерческой версии модуля.'; +$_['text_info'] = 'После регистрации учетной записи интернет-магазина в «INTERKASSA» +необходимо настроить магазин для приема платежей. Сделать это можно в личном кабинете раздела Мои Кассы, нажав на кнопку "Настройки" +напротив своего магазина. Данные которые необходимо ввести в настройках магазина:'; +$_['text_info_content'] = 'В разделе "Мои кассы -> Настройки кассы -> Настройки платежей" необходимо установить следующие значения:
+"Проверять уникальность платежей" - вкл.
+"Передавать описание на платежную систему" - вкл.
+"Время жизни платежа (в минутах)" - вкл. "разрешить переопределять в запросе "


+В разделе "Мои кассы -> Настройки кассы -> Интерфейс" необходимо везде установить следующие значения:
+"Тип запроса" - "POST"
+везде выключить "Разрешить переопределять в запросе "


+В разделе "Мои кассы -> Настройки кассы -> Безопасность" необходимо установить следующие значения:
+"Алгоритм подписи" - "MD5"
+"Проверять подпись в форме запроса платежа" - вкл.
'; + +// Text FT +$_['text_order_id_ft'] = '№ заказа'; +$_['text_store_name_ft'] = 'Название магазина'; +$_['text_logo_ft'] = 'Логотип магазина'; +$_['text_products_ft'] = 'Список купленных товаров'; +$_['text_total_ft'] = 'Итого'; +$_['text_customer_firstname_ft'] = 'Имя Отчество покупателя'; +$_['text_customer_lastname_ft'] = 'Фамилия покупателя'; +$_['text_customer_group_ft'] = 'Группа покупателя'; +$_['text_customer_email_ft'] = 'e-mail покупателя'; +$_['text_customer_telephone_ft'] = 'Телефон покупателя'; +$_['text_order_status_ft'] = 'Статус заказа'; +$_['text_comment_ft'] = 'Комментарий покупателя к заказу'; +$_['text_ip_ft'] = 'IP адрес покупателя'; +$_['text_date_added_ft'] = 'Дата и время добавления заказа'; +$_['text_date_modified_ft'] = 'Дата и время изменения заказа'; + +// Entry +$_['entry_status'] = 'Статус'; +$_['entry_order_status'] = 'Статус заказа после оплаты'; +$_['entry_geo_zone'] = 'Географическая зона'; +$_['entry_sort_order'] = 'Порядок сортировки'; +$_['entry_minimal_order'] = 'Минимальная стоимость заказа'; +$_['entry_maximal_order'] = 'Максимальная стоимость заказа'; +$_['entry_order_confirm_status'] = 'Статус заказа после подтверждения'; +$_['entry_order_fail_status'] = 'Статус заказа после неудачной оплаты'; +$_['entry_title'] = 'Название'; +$_['entry_instruction'] = 'Инструкция по оплате'; + +$_['entry_shop_id'] = 'Идентификатор кассы'; +$_['entry_sign_hash'] = 'Секретный ключ'; +$_['entry_sign_test_key'] = 'Тестовый ключ'; +$_['entry_test_mode'] = 'Тестовый режим'; +$_['entry_currency'] = 'Валюта магазина'; +$_['entry_lifetime'] = 'Время жизни платежа'; + +$_['entry_log'] = 'Журнал'; +$_['entry_log_file'] = 'Файл журнала'; + +$_['entry_success_url'] = 'URL успешной оплаты'; +$_['entry_fail_url'] = 'URL неуспешной оплаты'; +$_['entry_pending_url'] = 'URL ожидания проведения платежа'; +$_['entry_status_url'] = 'URL взаимодействия'; + +// Placeholder +$_['placeholder_instruction'] = 'Уважаемый покупатель! Просим Вас дождаться звонка от нашего менеджера перед оплатой. Это необходимо для подтверждения наличия товара на складе и возможности доставки в Ваш регион. После чего менеджер отправит Вам письмо со ссылкой на оплату заказа.'; + +// Help +$_['help_order_confirm_status'] = 'При нажатии на кнопку "Подтвердить" на последнем этапе оформления заказа, заказу будет установлен выбранный статус'; +$_['help_order_status'] = 'После успешной оплаты заказа, заказу будет установлен выбранный статус.'; +$_['help_minimal_order'] = 'Если сумма заказа меньше указанной суммы, и сумма не пустая и не равна нулю, то этот метод оплаты не будет доступен, при оформлении заказа.
Например: 190.90'; +$_['help_maximal_order'] = 'Если сумма заказа больше указанной суммы, и сумма не пустая и не равна нулю, то этот метод оплаты не будет доступен, при оформлении заказа.
Например: 5000.01'; +$_['help_order_fail_status'] = 'Если Интеркасса вернет покупателя после неудачного платежа, заказу будет установлен выбранный статус.'; +$_['help_laterpay_mode'] = 'При включенном режиме отсроченной (отложенной) оплаты покупатель сможет оплатить заказ только после проверки заказа менеджером магазина.
Если Вам необходимо, чтобы у покупателя была возможность произвести оплату сразу после оформления заказа без подтверждения менеджером - не включайте эту опцию.'; +$_['help_order_later_status'] = 'После проверки заказа менеджер магазина выставит данный статус, покупатель будет уведомлен по e-mail и сможет оплатить заказ. Также, ссылка на оплату появится в личном кабинете покупателя в разделе "Мои заказы".
БУДЬТЕ ВНИМАТЕЛЬНЫ!
Если данный статус будет совпадать со "статус заказа после подтверждения" - режим отсроченной оплаты будет отключен и покупатели будут перенаправляться на сайт "Робокассы" для оплаты сразу после нажатия на кнопку "Оформить заказ".'; +$_['help_title'] = 'Название метода оплаты на странице оформления заказа'; +$_['help_instruction'] = 'Инструкция по оплате выводится при подтверждении заказа. Если поле не заполнено - инструкция по оплате выводиться не будет.'; + +$_['help_shop_id'] = 'Идентификатор кассы зарегистрированного в системе «INTERKASSA». Узнать его можно в разделе «Мои кассы». Пример: 529a6e08bf4efcae2d1b8488'; +$_['help_sign_hash'] = 'Используется SCI (Интеркассой) при формировании цифровой подписи. Должен совпадать с секретным ключем в разделе "Мои кассы -> Настройки кассы -> Безопасность -> Секретный ключ".'; +$_['help_sign_test_key'] = 'Используется SCI (Интеркассой) при формировании цифровой подписи, если платеж был совершен через тестовую платежную систему. Должен совпадать с тестовым ключем в разделе "Мои кассы -> Настройки кассы -> Безопасность -> Тестовый ключ".'; +$_['help_test_mode'] = 'В тестовом режиме можно проверить настройки модуля и Интеркассы через тестовую валюту Интеркассы, выбрав при оплате "Тестовая платежная система". В этом случае для подписывания ЭЦП (электронной цифровой подписи) используется тестовый ключ. Для приема реальных платежей - тестовый режим необходимо выключить.'; +$_['help_currency'] = 'Валюта, в которой магазин передает сумму платежа на платежный шлюз "Интеркасса". Интеркасса принимает следующие валюты: RUB, UAH, EUR, USD.'; +$_['help_lifetime'] = 'Платеж невозможно будет совершить по истечении срока жизни платежа после его создания.'; +$_['help_log_file'] = 'Последние %d строк из файла журнала.'; +$_['help_log'] = 'Журнал запросов от Интеркассы сохраняется в файле: /system/storage/logs/%s'; + +// Error +$_['error_permission'] = 'У Вас нет прав для управления модулем "%s"!'; +$_['error_clear_log'] = 'У Вас нет прав для очистки журнала модуля!'; +$_['error_form'] = 'Необходимо заполнить поле "%s" (вкладка "%s")!'; +?> \ No newline at end of file diff --git a/OpenCart_3/upload/admin/language/ru-ru/extension/payment/shoputils_ik.php b/OpenCart_3/upload/admin/language/ru-ru/extension/payment/shoputils_ik.php new file mode 100644 index 0000000..505fd72 --- /dev/null +++ b/OpenCart_3/upload/admin/language/ru-ru/extension/payment/shoputils_ik.php @@ -0,0 +1,119 @@ +new.interkassa.com'; +$_['text_order_status_cart'] = 'Корзина (Ошибочный заказ)'; +$_['text_log_off'] = 'Выключен'; +$_['text_log_short'] = 'Частичный (Только результаты операций)'; +$_['text_log_full'] = 'Полный (Все запросы)'; + +$_['text_currency_auto'] = 'Определять автоматически'; +$_['text_currency_rub'] = 'Российские рубли (RUB-643)'; +$_['text_currency_uah'] = 'Украинские гривны (UAH-980)'; +$_['text_currency_usd'] = 'Доллары США (USD-840)'; +$_['text_currency_eur'] = 'Евро (EUR-978)'; +$_['text_lifetime_5minuts'] = '5 минут'; +$_['text_lifetime_30minuts'] = '30 минут'; +$_['text_lifetime_1hour'] = '1 час'; +$_['text_lifetime_1day'] = '1 день'; +$_['text_lifetime_1weekly'] = '1 неделя'; +$_['text_lifetime_30days'] = '30 дней'; +$_['text_copyright'] = 'Модуль оплаты "%s" разработан по заказу платежной системы "Interkassa" при поддержке ShopUtils. Если Вам требуется больше возможностей, возможно Вам потребуется более функциональный модуль.'; +$_['text_copyright'] = '© Разработано ShopUtils по заказу платежной системы "Interkassa". Расширенный функционал - в коммерческой версии модуля.'; +$_['text_info'] = 'После регистрации учетной записи интернет-магазина в «INTERKASSA» +необходимо настроить магазин для приема платежей. Сделать это можно в личном кабинете раздела Мои Кассы, нажав на кнопку "Настройки" +напротив своего магазина. Данные которые необходимо ввести в настройках магазина:'; +$_['text_info_content'] = 'В разделе "Мои кассы -> Настройки кассы -> Настройки платежей" необходимо установить следующие значения:
+"Проверять уникальность платежей" - вкл.
+"Передавать описание на платежную систему" - вкл.
+"Время жизни платежа (в минутах)" - вкл. "разрешить переопределять в запросе "


+В разделе "Мои кассы -> Настройки кассы -> Интерфейс" необходимо везде установить следующие значения:
+"Тип запроса" - "POST"
+везде выключить "Разрешить переопределять в запросе "


+В разделе "Мои кассы -> Настройки кассы -> Безопасность" необходимо установить следующие значения:
+"Алгоритм подписи" - "MD5"
+"Проверять подпись в форме запроса платежа" - вкл.
'; + +// Text FT +$_['text_order_id_ft'] = '№ заказа'; +$_['text_store_name_ft'] = 'Название магазина'; +$_['text_logo_ft'] = 'Логотип магазина'; +$_['text_products_ft'] = 'Список купленных товаров'; +$_['text_total_ft'] = 'Итого'; +$_['text_customer_firstname_ft'] = 'Имя Отчество покупателя'; +$_['text_customer_lastname_ft'] = 'Фамилия покупателя'; +$_['text_customer_group_ft'] = 'Группа покупателя'; +$_['text_customer_email_ft'] = 'e-mail покупателя'; +$_['text_customer_telephone_ft'] = 'Телефон покупателя'; +$_['text_order_status_ft'] = 'Статус заказа'; +$_['text_comment_ft'] = 'Комментарий покупателя к заказу'; +$_['text_ip_ft'] = 'IP адрес покупателя'; +$_['text_date_added_ft'] = 'Дата и время добавления заказа'; +$_['text_date_modified_ft'] = 'Дата и время изменения заказа'; + +// Entry +$_['entry_status'] = 'Статус'; +$_['entry_order_status'] = 'Статус заказа после оплаты'; +$_['entry_geo_zone'] = 'Географическая зона'; +$_['entry_sort_order'] = 'Порядок сортировки'; +$_['entry_minimal_order'] = 'Минимальная стоимость заказа'; +$_['entry_maximal_order'] = 'Максимальная стоимость заказа'; +$_['entry_order_confirm_status'] = 'Статус заказа после подтверждения'; +$_['entry_order_fail_status'] = 'Статус заказа после неудачной оплаты'; +$_['entry_title'] = 'Название'; +$_['entry_instruction'] = 'Инструкция по оплате'; + +$_['entry_shop_id'] = 'Идентификатор кассы'; +$_['entry_sign_hash'] = 'Секретный ключ'; +$_['entry_sign_test_key'] = 'Тестовый ключ'; +$_['entry_test_mode'] = 'Тестовый режим'; +$_['entry_currency'] = 'Валюта магазина'; +$_['entry_lifetime'] = 'Время жизни платежа'; + +$_['entry_log'] = 'Журнал'; +$_['entry_log_file'] = 'Файл журнала'; + +$_['entry_success_url'] = 'URL успешной оплаты'; +$_['entry_fail_url'] = 'URL неуспешной оплаты'; +$_['entry_pending_url'] = 'URL ожидания проведения платежа'; +$_['entry_status_url'] = 'URL взаимодействия'; + +// Placeholder +$_['placeholder_instruction'] = 'Уважаемый покупатель! Просим Вас дождаться звонка от нашего менеджера перед оплатой. Это необходимо для подтверждения наличия товара на складе и возможности доставки в Ваш регион. После чего менеджер отправит Вам письмо со ссылкой на оплату заказа.'; + +// Help +$_['help_order_confirm_status'] = 'При нажатии на кнопку "Подтвердить" на последнем этапе оформления заказа, заказу будет установлен выбранный статус'; +$_['help_order_status'] = 'После успешной оплаты заказа, заказу будет установлен выбранный статус.'; +$_['help_minimal_order'] = 'Если сумма заказа меньше указанной суммы, и сумма не пустая и не равна нулю, то этот метод оплаты не будет доступен, при оформлении заказа.
Например: 190.90'; +$_['help_maximal_order'] = 'Если сумма заказа больше указанной суммы, и сумма не пустая и не равна нулю, то этот метод оплаты не будет доступен, при оформлении заказа.
Например: 5000.01'; +$_['help_order_fail_status'] = 'Если Интеркасса вернет покупателя после неудачного платежа, заказу будет установлен выбранный статус.'; +$_['help_laterpay_mode'] = 'При включенном режиме отсроченной (отложенной) оплаты покупатель сможет оплатить заказ только после проверки заказа менеджером магазина.
Если Вам необходимо, чтобы у покупателя была возможность произвести оплату сразу после оформления заказа без подтверждения менеджером - не включайте эту опцию.'; +$_['help_order_later_status'] = 'После проверки заказа менеджер магазина выставит данный статус, покупатель будет уведомлен по e-mail и сможет оплатить заказ. Также, ссылка на оплату появится в личном кабинете покупателя в разделе "Мои заказы".
БУДЬТЕ ВНИМАТЕЛЬНЫ!
Если данный статус будет совпадать со "статус заказа после подтверждения" - режим отсроченной оплаты будет отключен и покупатели будут перенаправляться на сайт "Робокассы" для оплаты сразу после нажатия на кнопку "Оформить заказ".'; +$_['help_title'] = 'Название метода оплаты на странице оформления заказа'; +$_['help_instruction'] = 'Инструкция по оплате выводится при подтверждении заказа. Если поле не заполнено - инструкция по оплате выводиться не будет.'; + +$_['help_shop_id'] = 'Идентификатор кассы зарегистрированного в системе «INTERKASSA». Узнать его можно в разделе «Мои кассы». Пример: 529a6e08bf4efcae2d1b8488'; +$_['help_sign_hash'] = 'Используется SCI (Интеркассой) при формировании цифровой подписи. Должен совпадать с секретным ключем в разделе "Мои кассы -> Настройки кассы -> Безопасность -> Секретный ключ".'; +$_['help_sign_test_key'] = 'Используется SCI (Интеркассой) при формировании цифровой подписи, если платеж был совершен через тестовую платежную систему. Должен совпадать с тестовым ключем в разделе "Мои кассы -> Настройки кассы -> Безопасность -> Тестовый ключ".'; +$_['help_test_mode'] = 'В тестовом режиме можно проверить настройки модуля и Интеркассы через тестовую валюту Интеркассы, выбрав при оплате "Тестовая платежная система". В этом случае для подписывания ЭЦП (электронной цифровой подписи) используется тестовый ключ. Для приема реальных платежей - тестовый режим необходимо выключить.'; +$_['help_currency'] = 'Валюта, в которой магазин передает сумму платежа на платежный шлюз "Интеркасса". Интеркасса принимает следующие валюты: RUB, UAH, EUR, USD.'; +$_['help_lifetime'] = 'Платеж невозможно будет совершить по истечении срока жизни платежа после его создания.'; +$_['help_log_file'] = 'Последние %d строк из файла журнала.'; +$_['help_log'] = 'Журнал запросов от Интеркассы сохраняется в файле: /system/storage/logs/%s'; + +// Error +$_['error_permission'] = 'У Вас нет прав для управления модулем "%s"!'; +$_['error_clear_log'] = 'У Вас нет прав для очистки журнала модуля!'; +$_['error_form'] = 'Необходимо заполнить поле "%s" (вкладка "%s")!'; +?> \ No newline at end of file diff --git a/OpenCart_3/upload/admin/view/image/payment/shoputils_ik.gif b/OpenCart_3/upload/admin/view/image/payment/shoputils_ik.gif new file mode 100644 index 0000000..4380be0 Binary files /dev/null and b/OpenCart_3/upload/admin/view/image/payment/shoputils_ik.gif differ diff --git a/OpenCart_3/upload/admin/view/image/payment/shoputils_ik23x30.gif b/OpenCart_3/upload/admin/view/image/payment/shoputils_ik23x30.gif new file mode 100644 index 0000000..c88040f Binary files /dev/null and b/OpenCart_3/upload/admin/view/image/payment/shoputils_ik23x30.gif differ diff --git a/OpenCart_3/upload/admin/view/template/extension/payment/shoputils_ik.twig b/OpenCart_3/upload/admin/view/template/extension/payment/shoputils_ik.twig new file mode 100644 index 0000000..0d5cf70 --- /dev/null +++ b/OpenCart_3/upload/admin/view/template/extension/payment/shoputils_ik.twig @@ -0,0 +1,386 @@ +{{ header }}{{ column_left }} +
+ +
+ {% if error_warning %} +
{{ error_warning }} + +
+ {% endif %} +
+
+
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ + {{ help_minimal_order }} +
+
+
+ +
+ + {{ help_maximal_order }} +
+
+
+ +
+ + {{ help_order_confirm_status }} +
+
+
+ +
+ + {{ help_order_status }} +
+
+
+ +
+ + {{ help_order_fail_status }} +
+
+
+ +
+ {% for language in oc_languages %} +
+ {% set language_image = language.code %} + + +
+ {% endfor %} + {{ help_title }} +
+
+
+ +
+ {% for language in oc_languages %} +
+ {% set language_image = language.code %} + + +
+ {% endfor %} + {{ help_instruction }} +
+
+
+ +
+
+ +
+ + {{ help_shop_id }} + {% if error_shop_id %} +
{{ error_shop_id }}
+ {% endif %} +
+
+ {% if permission %} +
+ +
+ + {{ help_sign_hash }} + {% if error_sign_hash %} +
{{ error_sign_hash }}
+ {% endif %} +
+
+
+ +
+ + {{ help_sign_test_key }} + {% if error_sign_test_key %} +
{{ error_sign_test_key }}
+ {% endif %} +
+
+ {% endif %} + +
+ +
+ + {{ help_test_mode }} +
+
+
+ +
+ + {{ help_currency }} +
+
+ + + +
+ +
+
+ +
+ + + + {{ help_log }} +
+ +
+ + +
+ +
+
+
{% for log_line, log_line in log_lines %}{% endfor %}
+
+ {{ help_log_file }} +
+
+
+ +
+
+ {{ text_info}} +
+
+ {{ text_info_content }} +
+
+ +
+
+ + +
+
+
+
+ +
+
+ + +
+
+
+
+ +
+
+ + +
+
+
+
+ +
+
+ + +
+
+
+
+
+
+
{{ text_copyright }}
+
+
+
+
+ +{{ footer }} \ No newline at end of file diff --git a/OpenCart_3/upload/catalog/controller/extension/payment/shoputils_ik.php b/OpenCart_3/upload/catalog/controller/extension/payment/shoputils_ik.php new file mode 100644 index 0000000..8004698 --- /dev/null +++ b/OpenCart_3/upload/catalog/controller/extension/payment/shoputils_ik.php @@ -0,0 +1,211 @@ +load->language('extension/payment/shoputils_ik'); + } + + public function index() { + $langdata = $this->config->get('shoputils_ik_langdata'); + $this->_setData( + array( + 'button_confirm', + 'instruction' => nl2br($langdata[$this->config->get('config_language_id')]['instruction']), + 'action' => self::$ACTION, + 'parameters' => $this->makeForm() + ) + ); + + return $this->load->view('extension/payment/shoputils_ik', $this->data); + } + + public function status() { + $this->logWrite('StatusURL: ', self::$LOG_SHORT); + $this->logWrite(' POST:' . var_export($this->request->post, true), self::$LOG_FULL); + $this->logWrite(' GET:' . var_export($this->request->get, true), self::$LOG_FULL); + + if (!$this->validate(true)) { + return; + } + + if ($this->request->post['ik_inv_st']) { + $this->load->model('checkout/order'); + $this->model_checkout_order->addOrderHistory($this->order['order_id'], + $this->config->get('shoputils_ik_order_status_id'), + sprintf($this->language->get('text_comment'), $this->request->post['ik_pw_via'], $this->request->post['ik_am']), + true); + } + + $this->sendOk(); + } + + public function success() { + $this->logWrite('SuccessURL', self::$LOG_SHORT); + $this->logWrite(' POST:' . var_export($this->request->post, true), self::$LOG_FULL); + $this->logWrite(' GET:' . var_export($this->request->get, true), self::$LOG_FULL); + + if ($this->validate(false)) { + if (!isset($this->session->data['order_id'])) { + $this->session->data['order_id'] = $this->order['order_id']; //Добавляем в сессию номер заказа на случай, если в checkout/success на экран пользователю выводится номер заказа + } + $this->response->redirect($this->url->link('checkout/success', '', 'SSL')); + } else { + $this->response->redirect($this->url->link('checkout/failure', '', 'SSL')); + } + } + + public function fail() { + $this->logWrite('FailURL', self::$LOG_SHORT); + $this->logWrite(' POST:' . var_export($this->request->post, true), self::$LOG_FULL); + $this->logWrite(' GET:' . var_export($this->request->get, true), self::$LOG_FULL); + if ($this->validate(false)) { + $this->load->model('checkout/order'); + $this->model_checkout_order->addOrderHistory($this->order['order_id'], + $this->config->get('shoputils_ik_order_fail_status_id'), + $this->language->get('text_comment_fail'), + true); + } + + $this->response->redirect($this->url->link('checkout/failure', '', 'SSL')); + } + + public function confirm() { + if (!empty($this->session->data['order_id']) && $this->config->get('shoputils_ik_order_confirm_status_id') && ($this->session->data['payment_method']['code'] == 'shoputils_ik')) { + $this->load->model('checkout/order'); + $this->model_checkout_order->addOrderHistory($this->session->data['order_id'], $this->config->get('shoputils_ik_order_confirm_status_id')); + } + } + + protected function makeForm($order_id = false) { + $this->load->model('checkout/order'); + if (!$order_id ) { + if (isset($this->session->data['order_id'])) { + $order_id = $this->session->data['order_id']; + } else { + $this->logWrite('Error: Unsupported Checkout Extension', self::$LOG_SHORT); + die($this->language->get('error_fail_checkout_extension')); + } + } + $order_info = $this->model_checkout_order->getOrder($order_id); + + $ikCurrencyCode = $this->config->get('shoputils_ik_currency'); + if (!$this->currency->has($ikCurrencyCode)) { + die(sprintf('Currency code (for code: %s) not found', $ikCurrencyCode)); + } + + $ik_payment_amount = number_format($this->currency->convert($order_info['total'], $this->config->get('config_currency'), $ikCurrencyCode), 2, '.', ''); + $ik_shop_id = $this->config->get('shoputils_ik_shop_id'); + $ik_payment_desc = sprintf($this->language->get('text_ik_payment_desc'), $order_info['order_id']); + $ik_lifetime = $this->config->get('shoputils_ik_lifetime'); + + $params = array( + 'ik_am' => $ik_payment_amount, + 'ik_co_id' => $ik_shop_id, + 'ik_cur' => $ikCurrencyCode, + 'ik_desc' => $ik_payment_desc, + //'ik_ltm' => $ik_lifetime, + 'ik_pm_no' => $order_info['order_id'] + ); + $params['ik_sign'] = base64_encode(md5(implode(':', array_values($params)) . ':' . $this->config->get('shoputils_ik_sign_hash'), true)); + + $this->logWrite('Make payment form: ', self::$LOG_SHORT); + $this->logWrite(' DATA: ' . var_export($params, true), self::$LOG_FULL); + + return $params; + } + + protected function validate($check_sign_hash = true) { + $this->load->model('checkout/order'); + + if ((ip2long($this->request->server['REMOTE_ADDR']) < ip2long('151.80.190.97')) && (ip2long($this->request->server['REMOTE_ADDR']) > ip2long('151.80.190.104'))) { + $this->sendForbidden(sprintf($this->language->get('text_error_allowed_range_ip'), $this->request->server['REMOTE_ADDR'])); + return false; + } + + if ($this->request->server['REQUEST_METHOD'] != 'POST') { + $this->sendForbidden($this->language->get('text_error_post')); + return false; + } + + if ($check_sign_hash && isset($sign_ik)) { + $ik_sign_hash_array = $this->request->post; + unset($ik_sign_hash_array['ik_sign']); + ksort($ik_sign_hash_array, SORT_STRING); + array_push($ik_sign_hash_array, $this->config->get('shoputils_ik_test_mode') ? $this->config->get('shoputils_ik_sign_test_key') : $this->config->get('shoputils_ik_sign_hash')); //$this->config->get('shoputils_ik_sign_hash'); + $ik_sign_hash_string = implode(':', $ik_sign_hash_array); + $ik_sign_hash = base64_encode(md5($ik_sign_hash_string, true)); + + if ($this->request->post['ik_sign'] != $ik_sign_hash) { + $this->sendForbidden($this->language->get('text_error_ik_sign_hash')); + $this->logWrite($ik_sign_hash . '=md5(' . $ik_sign_hash_string . ')', self::$LOG_SHORT); + return false; + } + } + + $this->order = $this->model_checkout_order->getOrder($this->request->post['ik_pm_no']); + + if (!$this->order) { + $this->sendForbidden(sprintf($this->language->get('text_error_order_not_found'), $this->request->post['ik_pm_no'])); + return false; + } + + return true; + } + + protected function sendForbidden($error) { + $this->logWrite('ERROR: ' . $error, self::$LOG_SHORT); + $this->response->addHeader('HTTP/1.1 403 Forbidden'); + //header('HTTP/1.1 403 Forbidden'); + echo " + + 403 Forbidden + + +

$error.

+ + "; + } + + protected function sendOk() { + $this->logWrite('OK: ' . http_build_query($this->request->post, '', ','), self::$LOG_SHORT); + $this->response->addHeader('HTTP/1.1 200 OK'); + //header('HTTP/1.1 200 OK'); + echo "200 OK"; + } + + protected function _setData($values) { + $this->data = array(); + foreach ($values as $key => $value) { + if (is_int($key)) { + $this->data[$value] = $this->language->get($value); + } else { + $this->data[$key] = $value; + } + } + } + + protected function logWrite($message, $type) { + switch ($this->config->get('shoputils_ik_log')) { + case self::$LOG_OFF: + return; + case self::$LOG_SHORT: + if ($type == self::$LOG_FULL) { + return; + } + } + + if (!$this->log) { + $this->log = new Log($this->config->get('shoputils_ik_log_filename')); + } + $this->log->Write($message); + } +} +?> \ No newline at end of file diff --git a/OpenCart_3/upload/catalog/language/en-gb/extension/payment/shoputils_ik.php b/OpenCart_3/upload/catalog/language/en-gb/extension/payment/shoputils_ik.php new file mode 100644 index 0000000..ff74d1e --- /dev/null +++ b/OpenCart_3/upload/catalog/language/en-gb/extension/payment/shoputils_ik.php @@ -0,0 +1,13 @@ +Методы оплаты'; + +$_['text_error_allowed_range_ip'] = 'Удаленный IP шлюза %s не из разрешенного диапазона'; +$_['text_error_post'] = 'Ответ от шлюза не типа POST'; +$_['text_error_ik_sign_hash'] = 'Некорректная подпись сообщения от платёжного шлюза'; +$_['text_error_order_not_found'] = 'Заказ № "%s" не найден'; +?> \ No newline at end of file diff --git a/OpenCart_3/upload/catalog/language/ru-ru/extension/payment/shoputils_ik.php b/OpenCart_3/upload/catalog/language/ru-ru/extension/payment/shoputils_ik.php new file mode 100644 index 0000000..ff74d1e --- /dev/null +++ b/OpenCart_3/upload/catalog/language/ru-ru/extension/payment/shoputils_ik.php @@ -0,0 +1,13 @@ +Методы оплаты'; + +$_['text_error_allowed_range_ip'] = 'Удаленный IP шлюза %s не из разрешенного диапазона'; +$_['text_error_post'] = 'Ответ от шлюза не типа POST'; +$_['text_error_ik_sign_hash'] = 'Некорректная подпись сообщения от платёжного шлюза'; +$_['text_error_order_not_found'] = 'Заказ № "%s" не найден'; +?> \ No newline at end of file diff --git a/OpenCart_3/upload/catalog/model/extension/payment/shoputils_ik.php b/OpenCart_3/upload/catalog/model/extension/payment/shoputils_ik.php new file mode 100644 index 0000000..53ba2c2 --- /dev/null +++ b/OpenCart_3/upload/catalog/model/extension/payment/shoputils_ik.php @@ -0,0 +1,39 @@ +load->language('extension/payment/payment_shoputils_ik'); + + if (($this->config->get('payment_shoputils_ik_status')) && ($total) && + (!$this->config->get('payment_shoputils_ik_minimal_order') || ($total >= (float)$this->config->get('payment_shoputils_ik_minimal_order'))) && + (!$this->config->get('payment_shoputils_ik_maximal_order') || ($total <= (float)$this->config->get('payment_shoputils_ik_maximal_order')))) { + $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "zone_to_geo_zone WHERE geo_zone_id = '" . (int) $this->config->get('payment_shoputils_ik_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_shoputils_ik_geo_zone_id')) { + $status = true; + } elseif ($query->num_rows) { + $status = true; + } else { + $status = false; + } + } else { + $status = false; + } + + $method_data = array(); + + if ($status) { + $title = $this->config->get('payment_shoputils_ik_langdata'); + $server = isset($this->request->server['HTTPS']) && (($this->request->server['HTTPS'] == 'on') || ($this->request->server['HTTPS'] == '1')) ? $this->config->get('config_ssl') : $this->config->get('config_url'); + + $method_data = array( + 'code' => 'shoputils_ik', + 'title' => $title[$this->config->get('config_language_id')]['title'], + 'description' => sprintf($this->language->get('text_description'), $server), + 'terms' => '', + 'sort_order' => $this->config->get('payment_shoputils_ik_sort_order') + ); + } + return $method_data; + } +} +?> \ No newline at end of file diff --git a/OpenCart_3/upload/catalog/view/theme/default/image/shoputils_ik.png b/OpenCart_3/upload/catalog/view/theme/default/image/shoputils_ik.png new file mode 100644 index 0000000..39e32a8 Binary files /dev/null and b/OpenCart_3/upload/catalog/view/theme/default/image/shoputils_ik.png differ diff --git a/OpenCart_3/upload/catalog/view/theme/default/template/extension/payment/shoputils_ik.twig b/OpenCart_3/upload/catalog/view/theme/default/template/extension/payment/shoputils_ik.twig new file mode 100644 index 0000000..6e0ecc1 --- /dev/null +++ b/OpenCart_3/upload/catalog/view/theme/default/template/extension/payment/shoputils_ik.twig @@ -0,0 +1,38 @@ +{% if instruction %} +

{{ instruction }}

+{% endif %} +
+ {% for key, value in parameters %} + {% if value is iterable %} + {% for val in value %} + + {% endfor %} + {% else %} + + {% endif %} +{% endfor %} + +
+
+
+ +
+ +