From 5d38b6ffc3112b54c47194ef8c34c9dea87ab7e8 Mon Sep 17 00:00:00 2001 From: pavluk Date: Sat, 5 Oct 2019 09:55:44 +0300 Subject: [PATCH] add module opencart 3 --- "OpenCart 3.x \342\200\224 API 2.0/ReadMe.md" | 14 + .../controller/extension/payment/tranzzo.php" | 267 +++++++++++++ .../en-gb/extension/payment/tranzzo.php" | 43 ++ .../ru-ru/extension/payment/tranzzo.php" | 41 ++ .../model/extension/payment/tranzzo.php" | 29 ++ .../admin/view/image/payment/tranzzo.png" | Bin 0 -> 7680 bytes .../template/extension/payment/tranzzo.twig" | 255 ++++++++++++ .../controller/extension/payment/tranzzo.php" | 370 ++++++++++++++++++ .../en-gb/extension/payment/tranzzo.php" | 17 + .../ru-ru/extension/payment/tranzzo.php" | 16 + .../model/extension/payment/tranzzo.php" | 71 ++++ .../template/extension/payment/tranzzo.twig" | 17 + .../upload/system/library/tranzzoApi.php" | 369 +++++++++++++++++ 13 files changed, 1509 insertions(+) create mode 100644 "OpenCart 3.x \342\200\224 API 2.0/ReadMe.md" create mode 100644 "OpenCart 3.x \342\200\224 API 2.0/upload/admin/controller/extension/payment/tranzzo.php" create mode 100644 "OpenCart 3.x \342\200\224 API 2.0/upload/admin/language/en-gb/extension/payment/tranzzo.php" create mode 100644 "OpenCart 3.x \342\200\224 API 2.0/upload/admin/language/ru-ru/extension/payment/tranzzo.php" create mode 100644 "OpenCart 3.x \342\200\224 API 2.0/upload/admin/model/extension/payment/tranzzo.php" create mode 100644 "OpenCart 3.x \342\200\224 API 2.0/upload/admin/view/image/payment/tranzzo.png" create mode 100644 "OpenCart 3.x \342\200\224 API 2.0/upload/admin/view/template/extension/payment/tranzzo.twig" create mode 100644 "OpenCart 3.x \342\200\224 API 2.0/upload/catalog/controller/extension/payment/tranzzo.php" create mode 100644 "OpenCart 3.x \342\200\224 API 2.0/upload/catalog/language/en-gb/extension/payment/tranzzo.php" create mode 100644 "OpenCart 3.x \342\200\224 API 2.0/upload/catalog/language/ru-ru/extension/payment/tranzzo.php" create mode 100644 "OpenCart 3.x \342\200\224 API 2.0/upload/catalog/model/extension/payment/tranzzo.php" create mode 100644 "OpenCart 3.x \342\200\224 API 2.0/upload/catalog/view/theme/default/template/extension/payment/tranzzo.twig" create mode 100644 "OpenCart 3.x \342\200\224 API 2.0/upload/system/library/tranzzoApi.php" diff --git "a/OpenCart 3.x \342\200\224 API 2.0/ReadMe.md" "b/OpenCart 3.x \342\200\224 API 2.0/ReadMe.md" new file mode 100644 index 0000000..abb4a4a --- /dev/null +++ "b/OpenCart 3.x \342\200\224 API 2.0/ReadMe.md" @@ -0,0 +1,14 @@ +## Платежный модуль TRANZZO для CMS OpenCart 3.x + +Тестировался модуль на CMS OpenCart 3.0.2.0 + +### Установка +1. Создать архив **tranzzo.ocmod.zip**, добавить в архив папку **upload** +2. Установить модуль через установщик дополнений, в панели управления зайти в раздел меню _**Дополнения → Установка дополнений**_. +3. Открыть панель управления Вашего сайта и выбрать в меню _**Дополнения → Дополнения**_ , выберать тип дополнения "Платежи". +4. Найдите строчку со способом оплаты TRANZZO и нажмите "Установить". + +### Настройка +1. Получите ключи авторизации и идентификации сервиса TRANZZO (*POS_ID, API_KEY, API_SECRET, ENDPOINTS_KEY*). +2. После установки модуля, на странице списка способов оплаты, нажмите "Редактировать". +3. Настройте способ оплаты, заполнив все необходимые поля. \ No newline at end of file diff --git "a/OpenCart 3.x \342\200\224 API 2.0/upload/admin/controller/extension/payment/tranzzo.php" "b/OpenCart 3.x \342\200\224 API 2.0/upload/admin/controller/extension/payment/tranzzo.php" new file mode 100644 index 0000000..ccb431d --- /dev/null +++ "b/OpenCart 3.x \342\200\224 API 2.0/upload/admin/controller/extension/payment/tranzzo.php" @@ -0,0 +1,267 @@ +load->language('extension/payment/tranzzo'); + $this->document->setTitle($this->language->get('heading_title')); + $data = $this->language->all(); + + if (($this->request->server['REQUEST_METHOD'] == 'POST') && $this->validate()) { + $this->load->model('setting/setting'); + + $this->model_setting_setting->editSetting('payment_tranzzo', $this->request->post); + + $this->session->data['success'] = $this->language->get('text_success'); + + $this->response->redirect($this->url->link('extension/payment/tranzzo', 'user_token=' . $this->session->data['user_token']. '&type=payment', true)); + } + + if (isset($this->session->data['success'])) { + $data['success'] = $this->session->data['success']; + unset($this->session->data['success']); + } else { + $data['success'] = ''; + } + + if (isset($this->error['warning'])) { + $data['error_warning'] = $this->error['warning']; + } else { + $data['error_warning'] = ''; + } + + if (isset($this->error['pos_id'])) { + $data['error_pos_id'] = $this->error['pos_id']; + } else { + $data['error_pos_id'] = ''; + } + + if (isset($this->error['api_key'])) { + $data['error_api_key'] = $this->error['api_key']; + } else { + $data['error_api_key'] = ''; + } + if (isset($this->error['api_secret'])) { + $data['error_api_secret'] = $this->error['api_secret']; + } else { + $data['error_api_secret'] = ''; + } + if (isset($this->error['endpoints_key'])) { + $data['error_endpoints_key'] = $this->error['endpoints_key']; + } else { + $data['error_endpoints_key'] = ''; + } + + if (isset($this->error['order_status'])) { + $data['error_order_status'] = $this->error['order_status']; + } else { + $data['error_order_status'] = ''; + } + + if (isset($this->error['order_status_complete_id'])) { + $data['error_order_status_complete_id'] = $this->error['order_status_complete_id']; + } else { + $data['error_order_status_complete_id'] = ''; + } + if (isset($this->error['order_status_failure_id'])) { + $data['error_order_status_failure_id'] = $this->error['order_status_failure_id']; + } else { + $data['error_order_status_failure_id'] = ''; + } + if (isset($this->error['order_status_listen'])) { + $data['error_order_status_listen'] = $this->error['order_status_listen']; + } else { + $data['error_order_status_listen'] = ''; + } + + //new + if (isset($this->error['order_status_auth_id'])) { + $data['error_order_status_auth_id'] = $this->error['order_status_auth_id']; + } else { + $data['error_order_status_auth_id'] = ''; + } + //new + + $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_extension'), + 'href' => $this->url->link('extension/extension', 'user_token=' . $this->session->data['user_token'] . '&type=payment', true) + ); + $data['breadcrumbs'][] = array( + 'text' => $this->language->get('heading_title'), + 'href' => $this->url->link('extension/payment/tranzzo', 'user_token=' . $this->session->data['user_token'], true) + ); + + $data['action'] = $this->url->link('extension/payment/tranzzo', '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); + + $data['header'] = $this->load->controller('common/header'); + $data['column_left'] = $this->load->controller('common/column_left'); + $data['footer'] = $this->load->controller('common/footer'); + + $data = $this->prepareSettings($data); + + $data['user_token'] = $this->session->data['user_token']; + + $this->response->setOutput($this->load->view('extension/payment/tranzzo', $data)); + + } + + public function prepareSettings($data) + { + $this->load->model('localisation/order_status'); + $data['order_statuses'] = $this->model_localisation_order_status->getOrderStatuses(); + + $this->load->model('localisation/geo_zone'); + $data['geo_zones'] = $this->model_localisation_geo_zone->getGeoZones(); + + if (isset($this->request->post['payment_tranzzo_geo_zone_id'])) { + $data['payment_tranzzo_geo_zone_id'] = $this->request->post['payment_tranzzo_geo_zone_id']; + } else { + $data['payment_tranzzo_geo_zone_id'] = $this->config->get('payment_tranzzo_geo_zone_id'); + } + + if (isset($this->request->post['payment_tranzzo_sort_order'])) { + $data['payment_tranzzo_sort_order'] = $this->request->post['payment_tranzzo_sort_order']; + } else { + $data['payment_tranzzo_sort_order'] = $this->config->get('payment_tranzzo_sort_order'); + } + + if (isset($this->request->post['payment_tranzzo_pos_id'])) { + $data['payment_tranzzo_pos_id'] = $this->request->post['payment_tranzzo_pos_id']; + } else { + $data['payment_tranzzo_pos_id'] = $this->config->get('payment_tranzzo_pos_id'); + } + if (isset($this->request->post['payment_tranzzo_api_secret'])) { + $data['payment_tranzzo_api_secret'] = $this->request->post['payment_tranzzo_api_secret']; + } else { + $data['payment_tranzzo_api_secret'] = $this->config->get('payment_tranzzo_api_secret'); + } + if (isset($this->request->post['payment_tranzzo_api_key'])) { + $data['payment_tranzzo_api_key'] = $this->request->post['payment_tranzzo_api_key']; + } else { + $data['payment_tranzzo_api_key'] = $this->config->get('payment_tranzzo_api_key'); + } + if (isset($this->request->post['payment_tranzzo_endpoints_key'])) { + $data['payment_tranzzo_endpoints_key'] = $this->request->post['payment_tranzzo_endpoints_key']; + } else { + $data['payment_tranzzo_endpoints_key'] = $this->config->get('payment_tranzzo_endpoints_key'); + } + + if (isset($this->request->post['payment_tranzzo_status'])) { + $data['payment_tranzzo_status'] = $this->request->post['payment_tranzzo_status']; + } else { + $data['payment_tranzzo_status'] = $this->config->get('payment_tranzzo_status'); + } + if (isset($this->request->post['payment_tranzzo_total'])) { + $data['payment_tranzzo_total'] = $this->request->post['payment_tranzzo_total']; + } else { + $data['payment_tranzzo_total'] = $this->config->get('payment_tranzzo_total'); + } + if (isset($this->request->post['payment_tranzzo_order_status_complete_id'])) { + $data['payment_tranzzo_order_status_complete_id'] = $this->request->post['payment_tranzzo_order_status_complete_id']; + } else { + $data['payment_tranzzo_order_status_complete_id'] = $this->config->get('payment_tranzzo_order_status_complete_id'); + } + if (isset($this->request->post['payment_tranzzo_order_status_failure_id'])) { + $data['payment_tranzzo_order_status_failure_id'] = $this->request->post['payment_tranzzo_order_status_failure_id']; + } else { + $data['payment_tranzzo_order_status_failure_id'] = $this->config->get('payment_tranzzo_order_status_failure_id'); + } + if (isset($this->request->post['payment_tranzzo_order_status_listen'])) { + $data['payment_tranzzo_order_status_listen'] = $this->request->post['payment_tranzzo_order_status_listen']; + } else { + $data['payment_tranzzo_order_status_listen'] = $this->config->get('payment_tranzzo_order_status_listen'); + } + //new + if (isset($this->request->post['payment_tranzzo_type_payment'])) { + $data['payment_tranzzo_type_payment'] = $this->request->post['payment_tranzzo_type_payment']; + } else { + $data['payment_tranzzo_type_payment'] = $this->config->get('payment_tranzzo_type_payment'); + } + if (isset($this->request->post['payment_tranzzo_order_status_auth_id'])) { + $data['payment_tranzzo_order_status_auth_id'] = $this->request->post['payment_tranzzo_order_status_auth_id']; + } else { + $data['payment_tranzzo_order_status_auth_id'] = $this->config->get('payment_tranzzo_order_status_auth_id'); + } + + return $data; + } + + + protected function validate() + { + if (!$this->user->hasPermission('modify', 'extension/payment/tranzzo')) { + $this->error['warning'] = $this->language->get('error_permission'); + } + if (!$this->request->post['payment_tranzzo_pos_id']) { + $this->error['pos_id'] = $this->language->get('error_pos_id'); + } + if (!$this->request->post['payment_tranzzo_api_key']) { + $this->error['api_key'] = $this->language->get('error_api_key'); + } + if (!$this->request->post['payment_tranzzo_api_secret']) { + $this->error['api_secret'] = $this->language->get('error_api_secret'); + } + if (!$this->request->post['payment_tranzzo_endpoints_key']) { + $this->error['endpoints_key'] = $this->language->get('error_endpoints_key'); + } + if (!$this->request->post['payment_tranzzo_order_status_complete_id']) { + $this->error['order_status_complete_id'] = $this->language->get('error_order_status_complete_id'); + } + if (!$this->request->post['payment_tranzzo_order_status_failure_id']) { + $this->error['order_status_failure_id'] = $this->language->get('error_order_status_failure_id'); + } + + //new + if ($this->request->post['payment_tranzzo_type_payment'] && !$this->request->post['payment_tranzzo_order_status_auth_id']) { + $this->error['order_status_auth_id'] = $this->language->get('error_order_status_auth_id'); + } + //new + + $complete = (int)$this->request->post['payment_tranzzo_order_status_complete_id']; + //new + $auth = (int)$this->request->post['payment_tranzzo_order_status_auth_id']; + //new + $fail = (int)$this->request->post['payment_tranzzo_order_status_failure_id']; + if ($complete == $fail || $complete == $auth || $auth == $fail) { + $this->error['order_status'] = $this->language->get('error_order_status'); + } + + return !$this->error; + } + + public function install() + { + $this->load->model('setting/event'); + + $this->model_setting_event->addEvent('tranzzo', + 'catalog/model/checkout/order/addOrderHistory/before', + 'extension/payment/tranzzo/tranzzoRefund' + ); + + //new + $this->load->model('extension/payment/tranzzo'); + $this->model_extension_payment_tranzzo->install(); + //new + } + + public function uninstall() + { + $this->load->model('setting/event'); + $this->model_setting_event->deleteEvent('tranzzo'); + + //new + $this->load->model('extension/payment/tranzzo'); + $this->model_extension_payment_tranzzo->uninstall(); + //new + } +} \ No newline at end of file diff --git "a/OpenCart 3.x \342\200\224 API 2.0/upload/admin/language/en-gb/extension/payment/tranzzo.php" "b/OpenCart 3.x \342\200\224 API 2.0/upload/admin/language/en-gb/extension/payment/tranzzo.php" new file mode 100644 index 0000000..2a02d84 --- /dev/null +++ "b/OpenCart 3.x \342\200\224 API 2.0/upload/admin/language/en-gb/extension/payment/tranzzo.php" @@ -0,0 +1,43 @@ +TRANZZO'; + +// Entry +$_['entry_pos_id'] = 'POS_ID'; +$_['entry_api_key'] = 'API_KEY'; +$_['entry_api_secret'] = 'API_SECRET'; +$_['entry_endpoints_key'] = 'ENDPOINTS_KEY'; +$_['entry_status'] = 'Status'; +$_['entry_total'] = 'Lower bound'; +$_['entry_order_status_complete'] = 'Order status after payment'; +$_['entry_order_status_failure'] = 'Order status in case of failure'; +$_['entry_order_status_listen'] = 'Order status for refund'; +$_['entry_geo_zone'] = 'Geographical area'; +$_['entry_sort_order'] = 'Sorting order'; +//new +$_['error_type_payment'] = 'type_payment'; +$_['entry_order_status_auth'] = 'Order status after auth payment'; +//new + +// Error +$_['error_permission'] = 'You are not authorized to manage this module!'; +$_['error_pos_id'] = 'It is necessary to fill POS_ID!'; +$_['error_api_key'] = 'You must fill API_KEY!'; +$_['error_api_secret'] = 'API_SECRET must be filled!'; +$_['error_endpoints_key'] = 'You need to fill ENDPOINTS_KEY!'; +$_['error_order_status'] = 'Selected statuses can not be the same'; +$_['error_order_status_complete_id'] = 'You must select a status'; +$_['error_order_status_failure_id'] = 'You must select a status'; +$_['error_order_status_listen'] = 'You must select a status'; +//new +$_['error_order_status_auth_id'] = 'You must select a status'; +//new + +// Help +$_['help_total'] = 'The minimum order amount. Below this amount, the payment method will not be available.'; \ No newline at end of file diff --git "a/OpenCart 3.x \342\200\224 API 2.0/upload/admin/language/ru-ru/extension/payment/tranzzo.php" "b/OpenCart 3.x \342\200\224 API 2.0/upload/admin/language/ru-ru/extension/payment/tranzzo.php" new file mode 100644 index 0000000..abb4040 --- /dev/null +++ "b/OpenCart 3.x \342\200\224 API 2.0/upload/admin/language/ru-ru/extension/payment/tranzzo.php" @@ -0,0 +1,41 @@ +TRANZZO'; + +// Entry +$_['entry_pos_id'] = 'POS_ID'; +$_['entry_api_key'] = 'API_KEY'; +$_['entry_api_secret'] = 'API_SECRET'; +$_['entry_endpoints_key'] = 'ENDPOINTS_KEY'; +$_['entry_status'] = 'Статус'; +$_['entry_total'] = 'Нижняя граница'; +$_['entry_order_status_complete'] = 'Статус заказа после оплаты'; +$_['entry_order_status_failure'] = 'Статус заказа в случае неудачи'; +$_['entry_order_status_listen'] = 'Статус заказа для возврата средств'; +$_['entry_geo_zone'] = 'Географическая зона'; +$_['entry_sort_order'] = 'Порядок сортировки'; +//new +$_['entry_type_payment'] = 'Блокировка платежа'; +$_['entry_order_status_auth'] = 'Статус заказа с заблокированной оплатой'; +//new + +// Error +$_['error_permission'] = 'У Вас нет прав для управления данным модулем!'; +$_['error_pos_id'] = 'Необходимо заполнить POS_ID!'; +$_['error_api_key'] = 'Необходимо заполнить API_KEY!'; +$_['error_api_secret'] = 'Необходимо заполнить API_SECRET!'; +$_['error_endpoints_key'] = 'Необходимо заполнить ENDPOINTS_KEY!'; +$_['error_order_status'] = 'Выбраные статусы немогу совпадать'; +$_['error_order_status_complete_id'] = 'Необходимо выбрать статус'; +$_['error_order_status_failure_id'] = 'Необходимо выбрать статус'; +$_['error_order_status_listen'] = 'Необходимо выбрать статус'; + +// Help +$_['help_total'] = 'Минимальная сумма заказа. Ниже данной суммы, способ оплаты будет недоступен.'; \ No newline at end of file diff --git "a/OpenCart 3.x \342\200\224 API 2.0/upload/admin/model/extension/payment/tranzzo.php" "b/OpenCart 3.x \342\200\224 API 2.0/upload/admin/model/extension/payment/tranzzo.php" new file mode 100644 index 0000000..449a890 --- /dev/null +++ "b/OpenCart 3.x \342\200\224 API 2.0/upload/admin/model/extension/payment/tranzzo.php" @@ -0,0 +1,29 @@ +db->query("ALTER TABLE `" . DB_PREFIX . "order` ADD tranzzo_payment TEXT"); + } + + public function uninstall() + { + $this->db->query("ALTER TABLE `" . DB_PREFIX . "order` DROP tranzzo_payment"); + } +} + +//new + + diff --git "a/OpenCart 3.x \342\200\224 API 2.0/upload/admin/view/image/payment/tranzzo.png" "b/OpenCart 3.x \342\200\224 API 2.0/upload/admin/view/image/payment/tranzzo.png" new file mode 100644 index 0000000000000000000000000000000000000000..50c59e44a5d3076a766948f82166ec6e90d2bc30 GIT binary patch literal 7680 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 + +
+ {% if error_warning %} +
{{ error_warning }} + +
+ {% endif %} + {% if success %} +
{{ success }} + +
+ {% endif %} +
+
+

{{ text_edit }}

+
+
+
+
+ +
+ + {% if error_pos_id %} +
{{ error_pos_id }}
+ {% endif %} +
+
+
+ +
+ + {% if error_api_key %} +
{{ error_api_key }}
+ {% endif %} +
+
+
+ +
+ + {% if error_api_secret %} +
{{ error_api_secret }}
+ {% endif %} +
+
+
+ +
+ + {% if error_endpoints_key %} +
{{ error_endpoints_key }}
+ {% endif %} +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ + + {% if error_order_status_complete_id %} +
{{ error_order_status_complete_id }}
+ {% endif %} + {% if error_order_status %} +
{{ error_order_status }}
+ {% endif %} +
+
+
+ +
+ + + {% if error_order_status_auth_id %} +
{{ error_order_status_auth_id }}
+ {% endif %} + {% if error_order_status %} +
{{ error_order_status }}
+ {% endif %} +
+
+
+ +
+ + + {% if error_order_status_failure_id %} +
{{ error_order_status_failure_id }}
+ {% endif %} + {% if error_order_status %} +
{{ error_order_status }}
+ {% endif %} +
+
+
+ +
+ {% for order_status in order_statuses %} + {% if (payment_tranzzo_order_status_listen is iterable) and (order_status.order_status_id in payment_tranzzo_order_status_listen) %} + + {% else %} + + {% endif %} + {% endfor %} + + {% if error_order_status_listen %} +
{{ error_order_status_listen }}
+ {% endif %} + {% if error_order_status %} +
{{ error_order_status }}
+ {% endif %} +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+ +{{ footer }} \ No newline at end of file diff --git "a/OpenCart 3.x \342\200\224 API 2.0/upload/catalog/controller/extension/payment/tranzzo.php" "b/OpenCart 3.x \342\200\224 API 2.0/upload/catalog/controller/extension/payment/tranzzo.php" new file mode 100644 index 0000000..863a1da --- /dev/null +++ "b/OpenCart 3.x \342\200\224 API 2.0/upload/catalog/controller/extension/payment/tranzzo.php" @@ -0,0 +1,370 @@ +load->language('extension/payment/tranzzo'); + $data = $this->language->all(); + + $this->load->model('checkout/order'); + $order_info = $this->model_checkout_order->getOrder($this->session->data['order_id']); + + $this->load->library('tranzzoApi'); + + $order_id = $order_info['order_id']; + + $amount = $order_info['total'] * $order_info['currency_value']; + + $params = array(); + $params[TranzzoApi::P_REQ_SERVER_URL] = $this->url->link('extension/payment/tranzzo/callback', '', true); + $params[TranzzoApi::P_REQ_RESULT_URL] = $this->url->link('account/order/info&order_id=' . $order_id, '', true); + $params[TranzzoApi::P_REQ_ORDER] = strval($order_id); + $params[TranzzoApi::P_REQ_AMOUNT] = TranzzoApi::amountToDouble($amount); + $params[TranzzoApi::P_REQ_CURRENCY] = $order_info['currency_code']; + $params[TranzzoApi::P_REQ_DESCRIPTION] = "Order #{$order_id}"; + + if (!empty($order_info['customer_id'])) + $params[TranzzoApi::P_REQ_CUSTOMER_ID] = strval($order_info['customer_id']); + else + $params[TranzzoApi::P_REQ_CUSTOMER_ID] = !empty($order_info['email']) ? $order_info['email'] : 'unregistered'; + + $params[TranzzoApi::P_REQ_CUSTOMER_EMAIL] = !empty($order_info['email']) ? $order_info['email'] : 'unregistered'; + + if (!empty($order_info['firstname'])) + $params[TranzzoApi::P_REQ_CUSTOMER_FNAME] = $order_info['firstname']; + + if (!empty($order_info['lastname'])) + $params[TranzzoApi::P_REQ_CUSTOMER_LNAME] = $order_info['lastname']; + + if (!empty($order_info['telephone'])) + $params[TranzzoApi::P_REQ_CUSTOMER_PHONE] = $order_info['telephone']; + + $params[TranzzoApi::P_REQ_PRODUCTS] = array(); + + $this->load->model('account/order'); + $products = $this->model_account_order->getOrderProducts($order_id); + + if (count($products) > 0) { + $items = array(); + $this->load->model('catalog/product'); + foreach ($products as $product) { + $items[] = array( + 'id' => strval($product['product_id']), + 'name' => $product['name'], + 'url' => $this->url->link('product/product&product_id=' . $product['product_id']), + 'currency' => $order_info['currency_code'], + 'amount' => TranzzoApi::amountToDouble($product['total'] * $order_info['currency_value']), +// 'price_type' => 'gross', // net | gross +// 'vat' => 0, // НДС + 'qty' => intval($product['quantity']), +// 'entity_id' => '', + ); + } + + $params[TranzzoApi::P_REQ_PRODUCTS] = $items; + } + + $response = $this->tranzzoApi->createPaymentHosted($params); + + $data['action'] = $this->url->link('checkout/checkout', '', true); + $data['error'] = !empty($response['message']) ? $response['message'] : ''; + $data['error'] .= (!empty($response['args']) && is_array($response['args'])) ? ', args: ' . implode(', ', $response['args']) : ''; + + if (!empty($response['redirect_url'])) { + $data['redirect_url'] = $response['redirect_url']; + } + + $this->cart->clear(); + + return $this->load->view('extension/payment/tranzzo', $data); + } + + public function callback() + { + //new + //serialize_precision for json_encode + if (version_compare(phpversion(), '7.1', '>=')) { + ini_set('serialize_precision', -1); + } + //new + + $this->load->library('tranzzoApi'); + + $this->tranzzoApi->writeLog('callback', ''); + + if (empty($_POST['data']) || empty($_POST['signature'])) die('LOL! Bad Request!!!'); + $data = $_POST['data']; + $signature = $_POST['signature']; + $data_response = TranzzoApi::notificationDecode($data); + + $this->tranzzoApi->writeLog(array('$data_response', $data_response)); + + $this->load->model('extension/payment/tranzzo'); + + //new + if ($data_response['method'] == 'purchase' || $data_response['method'] == 'auth') { + $order_id = (int)$data_response[TranzzoApi::P_REQ_ORDER];//[TranzzoApi::P_RES_PROV_ORDER]; + } else { + $res = $this->model_extension_payment_tranzzo->getOrderId((int)$data_response['order_id']); + $order_id = $res->row['order_id']; + } + //new + $this->tranzzoApi->writeLog(array('order_id', $order_id)); + + if ($this->tranzzoApi->validateSignature($data, $signature) && $order_id) { + $this->load->language('extension/payment/tranzzo'); + $this->load->model('checkout/order'); + $order_info = $this->model_checkout_order->getOrder($order_id); + $amount_payment = TranzzoApi::amountToDouble($data_response[TranzzoApi::P_REQ_AMOUNT]); + $amount_order = TranzzoApi::amountToDouble($order_info['total'] * $order_info['currency_value']); + + + if ($data_response[TranzzoApi::P_RES_RESP_CODE] == 1000 && $data_response[TranzzoApi::P_REQ_METHOD] == 'purchase') { + // new + $payment_data = [ + 'method' => $data_response[TranzzoApi::P_REQ_METHOD], + 'amount_payment' => $amount_payment, + 'amount_order' => $amount_order, + 'order_id' => $data_response[TranzzoApi::P_REQ_BILL_ORDER] + ]; + + $this->model_extension_payment_tranzzo->addPaymentData($order_id, $payment_data); + // new + $this->model_checkout_order->addOrderHistory( + $order_id, + $this->config->get('payment_tranzzo_order_status_complete_id'), +// "{$this->language->get('text_pay_success')}\n + sprintf($this->language->get('text_pay_success'), $amount_order) . "\n + {$this->language->get('text_payment_id')}: {$data_response[TranzzoApi::P_RES_PAYMENT_ID]}\n + {$this->language->get('text_order')}: {$data_response[TranzzoApi::P_REQ_BILL_ORDER]}" + ); + + } // new + elseif ($data_response[TranzzoApi::P_RES_RESP_CODE] == 1002) { + $payment_data = [ + 'method' => $data_response[TranzzoApi::P_REQ_METHOD], + 'amount_payment' => $amount_payment,// + 'amount_order' => $amount_order, + 'order_id' => $data_response[TranzzoApi::P_REQ_BILL_ORDER], + ]; + $this->model_extension_payment_tranzzo->addPaymentData($order_id, $payment_data); + + $status_name = $this->model_extension_payment_tranzzo->getStatusName($this->config->get('payment_tranzzo_order_status_complete_id'), $this->config->get('config_language_id')); + + $this->model_checkout_order->addOrderHistory( + $order_id, + $this->config->get('payment_tranzzo_order_status_auth_id'), + "{$this->language->get('text_pay_auth')}'" . $status_name->row['name'] . "'\n + {$this->language->get('text_payment_id')}: {$data_response[TranzzoApi::P_RES_PAYMENT_ID]}\n + {$this->language->get('text_order')}: {$data_response[TranzzoApi::P_REQ_BILL_ORDER]}" + ); + } // new + elseif ($data_response['method'] == 'refund' && $data_response['status'] == 'success') { + + //new + $payment_data = [ + 'method' => 'refund', + 'order_id' => $data_response[TranzzoApi::P_REQ_ORDER], + 'refund_amount' => $amount_payment + ]; + + $this->load->model('extension/payment/tranzzo'); + $this->model_extension_payment_tranzzo->addPaymentData($order_id, $payment_data); + //new + + $this->model_checkout_order->addOrderHistory( + $order_id, + '8', + "{$this->language->get('text_pay_refund')}\n + {$this->language->get('text_payment_id')}: {$data_response[TranzzoApi::P_RES_PAYMENT_ID]}\n + {$this->language->get('text_order')}: {$data_response[TranzzoApi::P_REQ_ORDER]}" + + ); + } //new + elseif ($data_response['method'] == 'void' && $data_response['status'] == 'success') { + + //$this->tranzzoApi->writeLog('method void', ''); + + $payment_data = [ + 'method' => 'void', + 'order_id' => $data_response[TranzzoApi::P_REQ_ORDER], + 'refund_amount' => TranzzoApi::amountToDouble($data_response['amount']) + ]; + + //$this->tranzzoApi->writeLog(array('$refund_data', $payment_data)); + + $this->load->model('extension/payment/tranzzo'); + $this->model_extension_payment_tranzzo->addPaymentData($order_id, $payment_data); + + $this->model_checkout_order->addOrderHistory( + $order_id, + 7, // Отменено !!!!!!!!!!!!!!!!! получить статус возврта + "{$this->language->get('text_pay_void')}\n + {$this->language->get('text_payment_id')}: {$data_response[TranzzoApi::P_RES_PAYMENT_ID]}\n + {$this->language->get('text_order')}: {$data_response[TranzzoApi::P_REQ_ORDER]}" + ); + } + elseif ($data_response['method'] == 'capture' && $data_response['status'] == 'success') { + + $this->tranzzoApi->writeLog('method capture', ''); + + $payment_data_old = (array)json_decode($this->model_extension_payment_tranzzo->getPaymentData($order_id)); + + $payment_data = [ + 'method' => 'capture', + 'order_id' => $data_response[TranzzoApi::P_REQ_ORDER], + 'amount_payment' => TranzzoApi::amountToDouble($data_response['amount']), + 'amount_order_new' => $amount_order, + 'amount_order' => TranzzoApi::amountToDouble($payment_data_old['amount_order']) + ]; + + $this->tranzzoApi->writeLog(array('$refund_data', $payment_data)); + + $this->load->model('extension/payment/tranzzo'); + $this->model_extension_payment_tranzzo->addPaymentData($order_id, $payment_data); + + $this->model_checkout_order->addOrderHistory( + $order_id, + $this->config->get('payment_tranzzo_order_status_complete_id'), + sprintf($this->language->get('text_pay_success'), $amount_order) . "\n + {$this->language->get('text_payment_id')}: {$data_response[TranzzoApi::P_RES_PAYMENT_ID]}\n + {$this->language->get('text_order')}: {$data_response[TranzzoApi::P_REQ_ORDER]}" + ); + }//new + else { + $msg = !empty($data_response['response_code']) ? "Response code: {$data_response['response_code']} " : ""; + $msg .= !empty($data_response['response_description']) ? "Description: {$data_response['response_description']}" : ""; + $this->model_checkout_order->addOrderHistory( + $order_id, + $this->config->get('payment_tranzzo_order_status_failure_id'), + $msg + ); + } + } + } + + public function tranzzoRefund($route, &$args) + { + //new + //serialize_precision for json_encode + if (version_compare(phpversion(), '7.1', '>=')) { + ini_set('serialize_precision', -1); + } + //new + + $this->load->library('tranzzoApi'); + $this->tranzzoApi->writeLog(array('$args', $args)); + + + $order_id = (int)$args[0]; + $order_status = $args[1]; + + $this->load->model('checkout/order'); + $order_info = $this->model_checkout_order->getOrder($order_id); + + $order_status_listen = $this->config->get('payment_tranzzo_order_status_listen'); + + if (!empty($order_info) && $order_info['payment_code']) { + + //new + $this->load->model('extension/payment/tranzzo'); + $payment_data = (array)json_decode($this->model_extension_payment_tranzzo->getPaymentData($order_id)); + $this->tranzzoApi->writeLog(array('$payment_data', $payment_data)); + //new + + if (!empty($payment_data)) { + //new capture + $order_status_for_capture = $this->config->get('payment_tranzzo_order_status_complete_id'); + + if ($order_status == $order_status_for_capture && !empty($payment_data['order_id']) && $payment_data['method'] == 'auth') { + $tranzzoOrderId = $payment_data['order_id']; + + $orderAmountNew = $order_info['total'] * $order_info['currency_value']; //сумма заказа + $orderAmountOld = $payment_data['amount_order'] * $order_info['currency_value']; //сумма платежа без комиссии + $tranzzoAmount = $payment_data['amount_payment'] * $order_info['currency_value']; //сумма платежа с комиссией + + $data = [ + 'order_id' => strval($tranzzoOrderId), + 'order_currency' => $order_info['currency_code'], + 'order_amount' => TranzzoApi::amountToDouble($tranzzoAmount), // сумма платежа + 'server_url' => $this->url->link('extension/payment/tranzzo/callback', '', true), + ]; + $this->tranzzoApi->writeLog(array('$response return', $data)); + + if ($orderAmountOld >= $orderAmountNew) + $data['change_amount'] = TranzzoApi::amountToDouble($orderAmountNew);// сумма по заказу + else { + throw new \Exception('Захват не удался! Сумма заказа превышает сумму платежа'); + return false; + } + + $this->tranzzoApi->writeLog(array('capture $data', $data)); + + if ($payment_data['method'] == 'auth') { + $response = $this->tranzzoApi->createCapture($data); + + $this->tranzzoApi->writeLog(array('$response return', $response)); + + if (!empty($response['message'])) { + throw new \Exception('Захват не удался! ' . $response['message']); + return false; + + } + } + } // refund + elseif (is_array($order_status_listen) && in_array($order_status, $order_status_listen)) { + + if (!empty($payment_data['order_id'])) { + $tranzzoOrderId = $payment_data['order_id']; + + $amount = $order_info['total'] * $order_info['currency_value']; + $this->tranzzoApi->writeLog(array('$amount$amount', $amount)); + + //new + $tranzzoAmount = $payment_data['amount_payment'] * $order_info['currency_value']; // сумма блокировки с комиссией + //new + + $data = [ + 'order_id' => strval($tranzzoOrderId), + 'order_currency' => $order_info['currency_code'], + //new + 'order_amount' => TranzzoApi::amountToDouble($tranzzoAmount), // сумма заказа + //new + 'server_url' => $this->url->link('extension/payment/tranzzo/callback', '', true), + ]; + + if ($payment_data['method'] == 'auth') {// auth method + $response = $this->tranzzoApi->createVoid($data); + } else { + if ($payment_data['amount_order'] >= $order_info['total']) { + if ($payment_data['method'] == 'capture') + $data['refund_amount'] = TranzzoApi::amountToDouble($amount); + } else { + throw new \Exception('Возврат не удался! Сумма заказа превышает сумму платежа'); + return false; + } + $response = $this->tranzzoApi->createRefund($data); + } + +// $this->tranzzoApi->writeLog(array('$response return', $response)); + + if (!empty($response['message'])) { + throw new \Exception('Возврат не удался! ' . $response['message']); + return false; + + } else { + $refund_message = sprintf(' Refunded %1$s, Tranzzo order_id: %2$s', $amount, $response['order_id']); + + if (empty($args[2])) $args[2] = ''; + $args[2] .= $refund_message; + } + } else { + $refund_message = sprintf('Refunds Tranzzo impossible, not enough data.'); + $args[2] .= $refund_message; + } + } + } + } + } +} \ No newline at end of file diff --git "a/OpenCart 3.x \342\200\224 API 2.0/upload/catalog/language/en-gb/extension/payment/tranzzo.php" "b/OpenCart 3.x \342\200\224 API 2.0/upload/catalog/language/en-gb/extension/payment/tranzzo.php" new file mode 100644 index 0000000..7cfcd97 --- /dev/null +++ "b/OpenCart 3.x \342\200\224 API 2.0/upload/catalog/language/en-gb/extension/payment/tranzzo.php" @@ -0,0 +1,17 @@ +session->data['currency'], array('USD', 'EUR', 'UAH', 'RUB'))) { + return false; + } + + $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "zone_to_geo_zone WHERE geo_zone_id = '" . (int)$this->config->get('tranzzo_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('tranzzo_total') > 0 && $this->config->get('tranzzo_total') > $total) { + $status = false; + } elseif (!$this->config->get('tranzzo_geo_zone_id')) { + $status = true; + } elseif ($query->num_rows) { + $status = true; + } else { + $status = false; + } + + $method_data = array(); + + if ($status) { + $this->load->language('extension/payment/tranzzo'); + $method_data = array( + 'code' => 'tranzzo', + 'title' => $this->language->get('text_title'), + 'terms' => '', + 'sort_order' => $this->config->get('tranzzo_sort_order') + ); + } + + return $method_data; + } + + //new + public function addPaymentData($order_id, $data) + { + $this->db->query("UPDATE " . DB_PREFIX . "order SET tracking = '" . $this->db->escape($data['order_id']) . "', tranzzo_payment = '" . $this->db->escape(json_encode($data)) . "' WHERE order_id = '" . (int)$order_id . "'"); + } + + public function getOrderId($tranzo_id) + { + $sql = "SELECT order_id FROM " . DB_PREFIX . "order WHERE tracking = '" . (int)$tranzo_id . "'"; + $query = $this->db->query($sql); + return $query; + } + + public function getStatusName($id, $lang) + { + $sql = "SELECT name FROM " . DB_PREFIX . "order_status WHERE order_status_id = '" . (int)$id . "' AND language_id = '" . (int)$lang . "'"; + $query = $this->db->query($sql); + return $query; + } + + public function getPaymentData($order_id) + { + $sql = "SELECT tranzzo_payment FROM " . DB_PREFIX . "order WHERE order_id = '" . (int)$order_id . "'"; + $query = $this->db->query($sql); + + $this->load->library('tranzzoApi'); + $this->tranzzoApi->writeLog(array('getPaymentData $sql', $sql)); + $this->tranzzoApi->writeLog(array('getPaymentData', $query)); + + return $query->row['tranzzo_payment']; + } + //new +} \ No newline at end of file diff --git "a/OpenCart 3.x \342\200\224 API 2.0/upload/catalog/view/theme/default/template/extension/payment/tranzzo.twig" "b/OpenCart 3.x \342\200\224 API 2.0/upload/catalog/view/theme/default/template/extension/payment/tranzzo.twig" new file mode 100644 index 0000000..bd77c03 --- /dev/null +++ "b/OpenCart 3.x \342\200\224 API 2.0/upload/catalog/view/theme/default/template/extension/payment/tranzzo.twig" @@ -0,0 +1,17 @@ +
+ {% if redirect_url %} + + {% else %} +
+
+ +
+
+ {% endif %} +
+

{{ error }}

+ diff --git "a/OpenCart 3.x \342\200\224 API 2.0/upload/system/library/tranzzoApi.php" "b/OpenCart 3.x \342\200\224 API 2.0/upload/system/library/tranzzoApi.php" new file mode 100644 index 0000000..7258f74 --- /dev/null +++ "b/OpenCart 3.x \342\200\224 API 2.0/upload/system/library/tranzzoApi.php" @@ -0,0 +1,369 @@ +registry = $registry; + + $this->posId = trim( $this->config->get('payment_tranzzo_pos_id')); + $this->apiKey = trim( $this->config->get('payment_tranzzo_api_key')); + $this->apiSecret = trim( $this->config->get('payment_tranzzo_api_secret')); + $this->endpointsKey = trim( $this->config->get('payment_tranzzo_endpoints_key')); + + //new + $this->type_payment = ( $this->config->get('payment_tranzzo_type_payment') == '1') ? 1 : 0; + //new + + if(empty($this->posId) || empty($this->apiKey) || empty($this->apiSecret) || empty($this->endpointsKey)){ + self::writeLog('Invalid constructor parameters'); + } + } + + public function __get($name) + { + return $this->registry->get($name); + } + + /** + * @param array $params + * @return mixed + */ + public function createCreditPayment($params = array()) + { + $params[self::P_REQ_METHOD] = 'credit'; + $params[self::P_REQ_POS_ID] = $this->posId; + + $uri = self::U_METHOD_PAYMENT; + $this->setHeader('Content-Type:application/json'); + + return $this->request($params, self::R_METHOD_POST, $uri); + } + + /** + * @param array $params + * @return mixed + */ + public function createPaymentHosted($params = array()) + { + $params[self::P_REQ_POS_ID] = $this->posId; + $params[self::P_REQ_MODE] = self::P_MODE_HOSTED; +// $params[self::P_REQ_METHOD] = 'purchase'; + $params[self::P_REQ_METHOD] = empty($this->type_payment) ? 'purchase' : 'auth'; + $params[self::P_REQ_ORDER_3DS_BYPASS] = 'supported'; + + $this->setHeader('Accept: application/json'); + $this->setHeader('Content-Type: application/json'); + + //self::writeLog(array('createPaymentHosted $params'=>(array)$params)); + + return $this->request($params, self::R_METHOD_POST, self::U_METHOD_PAYMENT); + } + + /** + * @param $params + * @return mixed + */ + public function checkPaymentStatus($params) + { + $uri = self::U_METHOD_POS. '/' . $this->posId . '/orders/' . $params[self::P_REQ_ORDER]; + + return $this->request([], self::R_METHOD_GET, $uri); + } + + /** + * @param $params + * @return mixed + */ + private function request($params, $method, $uri) + { + //new + //serialize_precision for json_encode + if (version_compare(phpversion(), '7.1', '>=')) { + ini_set('serialize_precision', -1); + } + //new + $url = $this->apiUrl . $uri; + $data = json_encode($params); + $this->setHeader('X-API-Auth: CPAY '.$this->apiKey.':'.$this->apiSecret); + $this->setHeader('X-API-KEY: ' . $this->endpointsKey); + + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + + if($method === self::R_METHOD_POST){ + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, $data); + } + + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); + curl_setopt($ch, CURLOPT_HEADER, false); + curl_setopt($ch, CURLOPT_HTTPHEADER, $this->headers); + + $server_output = curl_exec($ch); + $http_code = curl_getinfo($ch); + $errno = curl_errno($ch); + curl_close($ch); + + if(!$errno && empty($server_output)) + return $http_code; + else + return (json_decode($server_output, true))? json_decode($server_output, true) : $server_output; + } + + /** + * @param $data + * @return mixed|null + */ + public static function notificationDecode($data) + { + return json_decode(self::base64url_decode($data), true); + } + + /** + * @param $data + * @param $requestSign + * @return bool + */ + public function validateSignature($data, $requestSign) + { + $signStr = $this->apiSecret . $data . $this->apiSecret; + $sign = self::base64url_encode(sha1($signStr, true)); + + if ($requestSign !== $sign) { + self::writeLog('signature wrong!'); + return false; + } + + return true; + } + /** + * @param $params + * @return mixed + */ + public function createRefund($params = array()) + { + $params[self::P_REQ_POS_ID] = $this->posId; + + $this->setHeader('Accept: application/json'); + $this->setHeader('Content-Type: application/json'); + + return $this->request($params, self::R_METHOD_POST, self::U_METHOD_REFUND); + } + + //new + public function createVoid($params = array()) + { + $params[self::P_REQ_POS_ID] = $this->posId; + + $this->setHeader('Accept: application/json'); + $this->setHeader('Content-Type: application/json'); + + return $this->request($params, self::R_METHOD_POST, self::U_METHOD_VOID); + } + + public function createCapture($params = array()) + { + self::writeLog('createCapture'); + $params[self::P_REQ_POS_ID] = $this->posId; + + $this->setHeader('Accept: application/json'); + $this->setHeader('Content-Type: application/json'); + + return $this->request($params, self::R_METHOD_POST, self::U_METHOD_CAPTURE); + } + //new + + // + public function getTypeMethod(){ + return $this->type_payment; + } + // + + + /** + * @param $params + * @return string + */ + private function createSign($params) + { + $json = self::base64url_encode( json_encode($params) ); + $signature = $this->strToSign($this->apiSecret . $json . $this->apiSecret); + return $signature; + } + + /** + * @param $str + * @return string + */ + private function strToSign($str) + { + return self::base64url_encode(sha1($str,1)); + } + + /** + * @param $data + * @return string + */ + public static function base64url_encode($data) + { + return strtr(base64_encode($data), '+/', '-_'); + } + /** + * @param $data + * @return bool|string + */ + public static function base64url_decode($data) + { + return base64_decode(strtr($data, '-_', '+/')); + } + + /** + * @param $header + */ + private function setHeader($header) + { + $this->headers[] = $header; + } + + /** + * @param $key + * @return mixed + */ + private function getHeader($key) + { + return $this->headers[$key]; + } + + /** + * @param string $value + * @param int $round + * @return float + */ + static function amountToDouble($value = '', $round = null) + { + $val = floatval($value); + return is_null($round)? $val : round($value, (int)$round); + } + + static function writeLog($data, $flag = '', $filename = '', $append = true) + { + $filename = !empty($filename)? strval($filename) : basename(__FILE__); + file_put_contents(__DIR__ . "/{$filename}.log", "\n\n" . date('H:i:s') . " - $flag \n" . + (is_array($data)? json_encode($data, JSON_PRETTY_PRINT):$data) + , ($append? FILE_APPEND : 0) + ); + } +} + +/* + * изменения АПИ 2.0 + * транзоАпи: + * добавить const P_REQ_BILL_ORDER = 'billing_order_id'; + * изменить значение const P_RES_RESP_CODE = 'status_code'; + * + * каталог/контроллер: + * заменить константу $order_id = (int)$data_response[TranzzoApi::P_REQ_ORDER]; + * добавить для кода=1000 && $data_response[TranzzoApi::P_REQ_METHOD] == 'purchase' + * заменить константу для иф purchase в $payment_data и addOrderHistory P_REQ_ORDER на P_REQ_BILL_ORDER + * заменить константу для иф 1002 в $payment_data и addOrderHistory P_REQ_ORDER на P_REQ_BILL_ORDER + */ \ No newline at end of file