From 9078dc813091e1f5d6b11bf99925852fc5d28519 Mon Sep 17 00:00:00 2001 From: Fedor50 Date: Mon, 23 Dec 2024 15:45:37 +0300 Subject: [PATCH] update names --- assets/js/payneteasy-order-page-script.js | 6 +- form_fields.php | 4 +- languages/wc-payneteasy-ru_RU.l10n.php | 2 +- languages/wc-payneteasy-ru_RU.po | 28 +- languages/wc-payneteasy.pot | 14 +- wc-payneteasy.php | 1059 +++++++++++++++++++++ 6 files changed, 1086 insertions(+), 27 deletions(-) create mode 100644 wc-payneteasy.php diff --git a/assets/js/payneteasy-order-page-script.js b/assets/js/payneteasy-order-page-script.js index 4564074..560cbf8 100644 --- a/assets/js/payneteasy-order-page-script.js +++ b/assets/js/payneteasy-order-page-script.js @@ -120,7 +120,7 @@ document.addEventListener('DOMContentLoaded', function() { }); // Запрос подтверждения у пользователя - if (confirm('Выполнить возврат в платёжной системе PAYNET?')) { + if (confirm('Выполнить возврат в платёжной системе PAYNETEASY?')) { // Отправляем AJAX-запрос с помощью fetch fetch(payneteasy_ajax_var.api_url, { method: 'POST', @@ -129,10 +129,10 @@ document.addEventListener('DOMContentLoaded', function() { .then(response => response.json()) .then(data => { if (data.success) { - alert(`Платёжная система PAYNET: ${data.message}`); + alert(`Платёжная система PAYNETEASY: ${data.message}`); originalButton.click(); } else { - if (confirm(`Платёжная система PAYNET: ${data.message}. Продолжит возврат в WordPress?`)) { + if (confirm(`Платёжная система PAYNETEASY: ${data.message}. Продолжит возврат в WordPress?`)) { originalButton.click(); } } diff --git a/form_fields.php b/form_fields.php index a311749..c1a8bfb 100644 --- a/form_fields.php +++ b/form_fields.php @@ -3,14 +3,14 @@ 'enabled' => [ 'title' => __('Enable/Disable', 'woocommerce'), 'type' => 'checkbox', - 'label' => __('Enable Payment system PAYNET', 'wc-payneteasy'), + 'label' => __('Enable Payment system PAYNETEASY', 'wc-payneteasy'), 'default' => 'yes' ], 'title' => [ 'title' => __('Title', 'woocommerce'), 'type' => 'text', 'description' => __('This controls the title which the user sees during checkout.', 'woocommerce'), - 'default' => __('Payment system PAYNET', 'wc-payneteasy'), + 'default' => __('Payment system PAYNETEASY', 'wc-payneteasy'), 'desc_tip' => true, ], 'description' => [ diff --git a/languages/wc-payneteasy-ru_RU.l10n.php b/languages/wc-payneteasy-ru_RU.l10n.php index 0eb449c..7cf61c0 100644 --- a/languages/wc-payneteasy-ru_RU.l10n.php +++ b/languages/wc-payneteasy-ru_RU.l10n.php @@ -1,2 +1,2 @@ 'Payment system PAYNET','report-msgid-bugs-to'=>'','pot-creation-date'=>'2023-05-30 14:30+0000','po-revision-date'=>'2024-07-16 13:17+0000','last-translator'=>'','language-team'=>'Русский','language'=>'ru_RU','plural-forms'=>'nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10 >= 2 && n%10<=4 &&(n%100<10||n%100 >= 20)? 1 : 2);','mime-version'=>'1.0','content-type'=>'text/plain; charset=UTF-8','content-transfer-encoding'=>'8bit','x-generator'=>'Loco https://localise.biz/','x-loco-version'=>'2.6.4; wp-6.2.2','x-domain'=>'wc-payneteasy','messages'=>['Advance'=>'Аванс','Agency fee'=>'Агентское вознаграждение','Allows you to use Payment system PAYNET with the WooCommerce plugin.'=>'Позволяет использовать Платежную систему PAYNET с плагином WooCommerce.','Applies to items that can be sold by piece or unit'=>'Применяется для предметов расчета, которые могут быть реализованы поштучно или единицами','Applies when using other units of measurement'=>'Применяется при использовании иных единиц измерения','Calculation method'=>'Способ расчета','Calculation method for delivery'=>'Способ расчета для доставки','Calculation method for the delivery service.'=>'Способ расчета для услуги доставки.','Cash issuance by bank payment agent'=>'Выдача денежных средств банковским платежным агентом','Casino payment'=>'Платеж казино','Centimeter'=>'Сантиметр','Client ID'=>'Client ID','Client Secret'=>'Client Secret','Credit payment'=>'Оплата кредита','Credit transfer'=>'Передача в кредит','Cubic meter'=>'Кубический метр','Customer Message'=>'Сообщение клиенту','Day'=>'Сутки (день)','Decimeter'=>'Дециметр','Default payment method (for goods and services that do not have a payment method specified).'=>'Способ расчета по умолчанию (для товаров и услуг, у которых не указан способ расчета).','Default settings for products and services'=>'Настройки для товаров и услуг по умолчанию','Default tax rate (for goods and services that do not have a specified tax rate).'=>'Ставка налогообложения по умолчанию (для товаров и услуг, у которых не указана ставка налогообложения).','Default units of measure (for goods and services that do not have a specified unit of measure).'=>'Единицы измерения по умолчанию (для товаров и услуг, у которых не указана единица измерения).','Deposit'=>'Залог','Email'=>'Электронная почта','Email for sending a fiscal receipt if the user\'s email is not specified.'=>'Электронная почта для отправки фискального чека, если не указана почта пользователя.','Enable logging'=>'Включить логирование','Enable Payment system PAYNET'=>'Включить платежную систему PAYNET','Enable send zip code'=>'Включить отправку почтового индекса','Enable test mode'=>'Включить тестовый режим','Enable two-stage payment'=>'Включить двустадийный платеж','Enter calculation method for delivery.'=>'Введите способ расчета для доставки.','Enter calculation method.'=>'Введите способ расчета.','Enter Client ID'=>'Введите Client ID','Enter Client Secret'=>'Введите Client Secret','Enter email.'=>'Введите адрес электронной почты.','Enter Merchant-Authorization'=>'Введите Merchant-Authorization','Enter subject of calculation.'=>'Введите предмет расчета.','Enter tax rate.'=>'Введите налоговую ставку.','Enter units of measurement.'=>'Введите единицы измерения.','Excise goods'=>'Подакцизный товар','Excise goods subject to marking with code'=>'Подакцизный товар, подлежащий маркировке средством идентификации, имеющий код маркировки','Excise goods subject to marking without code'=>'Подакцизный товар, подлежащий маркировке средством идентификации, не имеющий кода маркировки','Expense'=>'Расход','Failed ajax validation.'=>'Не удалось выполнить проверку ajax.','Fiscalization settings'=>'Настройки фискализации','Fiscalization settings (Payment system PAYNET)'=>'Настройки фискализации (Платежная система PAYNET)','Full payment'=>'Полный расчёт','Gambling bet'=>'Ставка азартной игры','Gambling win'=>'Выигрыш азартной игры','Gcal'=>'Гигакалория','Gigabyte'=>'Гигабайт','Goods'=>'Товар','Goods subject to marking with code except excise goods'=>'Товар, подлежащий маркировке средством идентификации, имеющий код маркировки, за исключением подакцизного товара','Goods subject to marking without code except excise goods'=>'Товар, подлежащий маркировке средством идентификации, не имеющий кода маркировки, за исключением подакцизного товара','Gram'=>'Грамм','Granting rights'=>'Предоставление прав','Health insurance contributions'=>'Взносы на ОМС','Health insurance contributions for IP'=>'Взносы на ОМС ИП','Hour'=>'Час','https://www.paynet.ru/'=>'https://www.paynet.ru/','In this mode, the payment for the goods is not charged.'=>'В этом режиме оплата за товар не взимается.','Insurance contributions'=>'Страховые взносы','Kilobyte'=>'Килобайт','Kilogram'=>'Килограмм','Kilowatt hour'=>'Киловатт час','Liter'=>'Литр','Logging'=>'Логирование','Logging is used to debug plugin performance by storing API request data.'=>'Логирование используется для отладки производительности плагина путем сохранения данных запросов к API.','Lottery bet'=>'Ставка лотереи','Lottery win'=>'Выигрыш лотереи','Megabyte'=>'Мегабайт','Merchant\'s client ID is required to call the API.'=>'Для вызова API требуется идентификатор клиента продавца.','Merchant\'s secret key is required to call the API.'=>'Для вызова API требуется секретный ключ продавца.','Merchant-Authorization'=>'Merchant-Authorization','Meter'=>'Метр','Milliliter'=>'Миллилитр','Minute'=>'Минута','Non-operating income'=>'Внереализационный доход','Order ID is empty.'=>'Идентификатор заказа пуст.','Order not found.'=>'Заказ не найден.','Other calculation subject'=>'Иной предмет расчёта','Partial payment and credit'=>'Частичный расчет и кредит','Partial refund of payment.'=>'Частичный возврат оплаты.','Pay with a card of any bank without commission.'=>'Оплата картой любого банка без комиссии.','Payment'=>'Платеж','Payment completed successfully.'=>'Платеж успешно завершен.','Payment in 2 stages: withholding of funds after payment, then confirmation of debit or cancelation of withholding by the merchant via personal cabinet.'=>'Платеж в 2 этапа: удержание средств после оплаты, затем подтверждение списания или отмена удержания мерчантом через личный кабинет.','Payment link generated:'=>'Создана платежная ссылка:','Payment method not "PAYNET Payment System".'=>'Способ оплаты не "Платежная система PAYNET".','Payment not paid.'=>'Оплата не произведена.','Payment not paid. Your order has been canceled.'=>'Оплата не прошла успешно. Ваш заказ был отменен.','Payment received but not confirmed.'=>'Платёж получен, но не подтверждён','Payment refunded.'=>'Оплата возвращена.','Payment system PAYNET'=>'Платёжная система PAYNET','Payout'=>'Выплата','Pension contributions'=>'Взносы ОПС','Pension contributions for IP'=>'Взносы на ОПС ИП','Plugin "PAYNET Payment System" for WooCommerce, which allows you to integrate online payments.'=>'Плагин «Платежная система PAYNET» для WooCommerce, позволяющий интегрировать онлайн-платежи.','Postal code'=>'Почтовый индекс','Prepayment'=>'Предоплата','Prepayment 100%'=>'Предоплата 100%','Property right'=>'Имущественное право','Refund amount not specified.'=>'Сумма возврата не указана.','Refund of payment.'=>'Возврат платежа.','Request header used by the merchant resource for additional authentication when accessing the payment gateway.'=>'Заголовок запроса, используемый ресурсом мерчанта для дополнительной аутентификации при доступе к платежному шлюзу.','Required action not specified.'=>'Требуемое действие не указано.','Resort fee'=>'Курортный сбор','Second'=>'Секунда','Select an option'=>'Выберите опцию','Select the order status to be displayed after successful payment.'=>'Выберите статус заказа, который будет отображаться после успешной оплаты.','Send the buyer\'s postal code to the PAYNET payment system.'=>'Отправлять почтовый индекс покупателя в платежную систему PAYNET.','Send zip code'=>'Отправлять почтовый индекс','Service'=>'Услуга','Social insurance contributions'=>'Взносы на ОСС','Square centimeter'=>'Квадратный сантиметр','Square decimeter'=>'Квадратный дециметр','Square meter'=>'Квадратный метр','Status updated.'=>'Статус обновлен.','Subject of calculation'=>'Предмет расчета','Successful transaction order status'=>'Статус заказа успешной транзакции','Tax rate'=>'Налоговая ставка','Terabyte'=>'Терабайт','Test mode'=>'Тестовый режим','The message which you want it to appear to the customer in the checkout page.'=>'Сообщение, которое будет отображалось покупателю на странице оформления заказа.','The payment was partial refunded.'=>'Оплата была частично возвращена.','The payment was refunded.'=>'Платеж был возвращен.','The required data for a refund was not transmitted.'=>'Не были переданы необходимые данные для возврата денег.','The subject of calculation by default (for goods and services that do not specify the subject of calculation).'=>'Предмет расчета по умолчанию (для товаров и услуг, у которых не указан предмет расчета).','Ton'=>'Тонна','Trade fee'=>'Торговый сбор','Two-stage payment'=>'Двустадийный платеж','Units of measurement'=>'Единицы измерения','VAT at 0%'=>'НДС по ставке 0%','VAT at 10%'=>'НДС чека по ставке 10%','VAT at 10/110 calculated rate'=>'НДС чека по расчетной ставке 10/110','VAT at 20%'=>'НДС чека по ставке 20%','VAT at 20/120 calculated rate'=>'НДС чека по расчетной ставке 20/120','PAYNET'=>'PAYNET','Without VAT'=>'Без НДС','Work'=>'Работа']]; +return ['project-id-version'=>'Payment system PAYNETEASY','report-msgid-bugs-to'=>'','pot-creation-date'=>'2023-05-30 14:30+0000','po-revision-date'=>'2024-07-16 13:17+0000','last-translator'=>'','language-team'=>'Русский','language'=>'ru_RU','plural-forms'=>'nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10 >= 2 && n%10<=4 &&(n%100<10||n%100 >= 20)? 1 : 2);','mime-version'=>'1.0','content-type'=>'text/plain; charset=UTF-8','content-transfer-encoding'=>'8bit','x-generator'=>'Loco https://localise.biz/','x-loco-version'=>'2.6.4; wp-6.2.2','x-domain'=>'wc-payneteasy','messages'=>['Advance'=>'Аванс','Agency fee'=>'Агентское вознаграждение','Allows you to use Payment system PAYNETEASY with the WooCommerce plugin.'=>'Позволяет использовать Платежную систему PAYNETEASY с плагином WooCommerce.','Applies to items that can be sold by piece or unit'=>'Применяется для предметов расчета, которые могут быть реализованы поштучно или единицами','Applies when using other units of measurement'=>'Применяется при использовании иных единиц измерения','Calculation method'=>'Способ расчета','Calculation method for delivery'=>'Способ расчета для доставки','Calculation method for the delivery service.'=>'Способ расчета для услуги доставки.','Cash issuance by bank payment agent'=>'Выдача денежных средств банковским платежным агентом','Casino payment'=>'Платеж казино','Centimeter'=>'Сантиметр','Client ID'=>'Client ID','Client Secret'=>'Client Secret','Credit payment'=>'Оплата кредита','Credit transfer'=>'Передача в кредит','Cubic meter'=>'Кубический метр','Customer Message'=>'Сообщение клиенту','Day'=>'Сутки (день)','Decimeter'=>'Дециметр','Default payment method (for goods and services that do not have a payment method specified).'=>'Способ расчета по умолчанию (для товаров и услуг, у которых не указан способ расчета).','Default settings for products and services'=>'Настройки для товаров и услуг по умолчанию','Default tax rate (for goods and services that do not have a specified tax rate).'=>'Ставка налогообложения по умолчанию (для товаров и услуг, у которых не указана ставка налогообложения).','Default units of measure (for goods and services that do not have a specified unit of measure).'=>'Единицы измерения по умолчанию (для товаров и услуг, у которых не указана единица измерения).','Deposit'=>'Залог','Email'=>'Электронная почта','Email for sending a fiscal receipt if the user\'s email is not specified.'=>'Электронная почта для отправки фискального чека, если не указана почта пользователя.','Enable logging'=>'Включить логирование','Enable Payment system PAYNETEASY'=>'Включить платежную систему PAYNETEASY','Enable send zip code'=>'Включить отправку почтового индекса','Enable test mode'=>'Включить тестовый режим','Enable two-stage payment'=>'Включить двустадийный платеж','Enter calculation method for delivery.'=>'Введите способ расчета для доставки.','Enter calculation method.'=>'Введите способ расчета.','Enter Client ID'=>'Введите Client ID','Enter Client Secret'=>'Введите Client Secret','Enter email.'=>'Введите адрес электронной почты.','Enter Merchant-Authorization'=>'Введите Merchant-Authorization','Enter subject of calculation.'=>'Введите предмет расчета.','Enter tax rate.'=>'Введите налоговую ставку.','Enter units of measurement.'=>'Введите единицы измерения.','Excise goods'=>'Подакцизный товар','Excise goods subject to marking with code'=>'Подакцизный товар, подлежащий маркировке средством идентификации, имеющий код маркировки','Excise goods subject to marking without code'=>'Подакцизный товар, подлежащий маркировке средством идентификации, не имеющий кода маркировки','Expense'=>'Расход','Failed ajax validation.'=>'Не удалось выполнить проверку ajax.','Fiscalization settings'=>'Настройки фискализации','Fiscalization settings (Payment system PAYNETEASY)'=>'Настройки фискализации (Платежная система PAYNETEASY)','Full payment'=>'Полный расчёт','Gambling bet'=>'Ставка азартной игры','Gambling win'=>'Выигрыш азартной игры','Gcal'=>'Гигакалория','Gigabyte'=>'Гигабайт','Goods'=>'Товар','Goods subject to marking with code except excise goods'=>'Товар, подлежащий маркировке средством идентификации, имеющий код маркировки, за исключением подакцизного товара','Goods subject to marking without code except excise goods'=>'Товар, подлежащий маркировке средством идентификации, не имеющий кода маркировки, за исключением подакцизного товара','Gram'=>'Грамм','Granting rights'=>'Предоставление прав','Health insurance contributions'=>'Взносы на ОМС','Health insurance contributions for IP'=>'Взносы на ОМС ИП','Hour'=>'Час','https://www.payneteasy.com/'=>'https://www.payneteasy.com/','In this mode, the payment for the goods is not charged.'=>'В этом режиме оплата за товар не взимается.','Insurance contributions'=>'Страховые взносы','Kilobyte'=>'Килобайт','Kilogram'=>'Килограмм','Kilowatt hour'=>'Киловатт час','Liter'=>'Литр','Logging'=>'Логирование','Logging is used to debug plugin performance by storing API request data.'=>'Логирование используется для отладки производительности плагина путем сохранения данных запросов к API.','Lottery bet'=>'Ставка лотереи','Lottery win'=>'Выигрыш лотереи','Megabyte'=>'Мегабайт','Merchant\'s client ID is required to call the API.'=>'Для вызова API требуется идентификатор клиента продавца.','Merchant\'s secret key is required to call the API.'=>'Для вызова API требуется секретный ключ продавца.','Merchant-Authorization'=>'Merchant-Authorization','Meter'=>'Метр','Milliliter'=>'Миллилитр','Minute'=>'Минута','Non-operating income'=>'Внереализационный доход','Order ID is empty.'=>'Идентификатор заказа пуст.','Order not found.'=>'Заказ не найден.','Other calculation subject'=>'Иной предмет расчёта','Partial payment and credit'=>'Частичный расчет и кредит','Partial refund of payment.'=>'Частичный возврат оплаты.','Pay with a card of any bank without commission.'=>'Оплата картой любого банка без комиссии.','Payment'=>'Платеж','Payment completed successfully.'=>'Платеж успешно завершен.','Payment in 2 stages: withholding of funds after payment, then confirmation of debit or cancelation of withholding by the merchant via personal cabinet.'=>'Платеж в 2 этапа: удержание средств после оплаты, затем подтверждение списания или отмена удержания мерчантом через личный кабинет.','Payment link generated:'=>'Создана платежная ссылка:','Payment method not "PAYNETEASY Payment System".'=>'Способ оплаты не "Платежная система PAYNETEASY".','Payment not paid.'=>'Оплата не произведена.','Payment not paid. Your order has been canceled.'=>'Оплата не прошла успешно. Ваш заказ был отменен.','Payment received but not confirmed.'=>'Платёж получен, но не подтверждён','Payment refunded.'=>'Оплата возвращена.','Payment system PAYNETEASY'=>'Платёжная система PAYNETEASY','Payout'=>'Выплата','Pension contributions'=>'Взносы ОПС','Pension contributions for IP'=>'Взносы на ОПС ИП','Plugin "PAYNET Payment System" for WooCommerce, which allows you to integrate online payments.'=>'Плагин «Платежная система PAYNETEASY» для WooCommerce, позволяющий интегрировать онлайн-платежи.','Postal code'=>'Почтовый индекс','Prepayment'=>'Предоплата','Prepayment 100%'=>'Предоплата 100%','Property right'=>'Имущественное право','Refund amount not specified.'=>'Сумма возврата не указана.','Refund of payment.'=>'Возврат платежа.','Request header used by the merchant resource for additional authentication when accessing the payment gateway.'=>'Заголовок запроса, используемый ресурсом мерчанта для дополнительной аутентификации при доступе к платежному шлюзу.','Required action not specified.'=>'Требуемое действие не указано.','Resort fee'=>'Курортный сбор','Second'=>'Секунда','Select an option'=>'Выберите опцию','Select the order status to be displayed after successful payment.'=>'Выберите статус заказа, который будет отображаться после успешной оплаты.','Send the buyer\'s postal code to the PAYNET payment system.'=>'Отправлять почтовый индекс покупателя в платежную систему PAYNETEASY.','Send zip code'=>'Отправлять почтовый индекс','Service'=>'Услуга','Social insurance contributions'=>'Взносы на ОСС','Square centimeter'=>'Квадратный сантиметр','Square decimeter'=>'Квадратный дециметр','Square meter'=>'Квадратный метр','Status updated.'=>'Статус обновлен.','Subject of calculation'=>'Предмет расчета','Successful transaction order status'=>'Статус заказа успешной транзакции','Tax rate'=>'Налоговая ставка','Terabyte'=>'Терабайт','Test mode'=>'Тестовый режим','The message which you want it to appear to the customer in the checkout page.'=>'Сообщение, которое будет отображалось покупателю на странице оформления заказа.','The payment was partial refunded.'=>'Оплата была частично возвращена.','The payment was refunded.'=>'Платеж был возвращен.','The required data for a refund was not transmitted.'=>'Не были переданы необходимые данные для возврата денег.','The subject of calculation by default (for goods and services that do not specify the subject of calculation).'=>'Предмет расчета по умолчанию (для товаров и услуг, у которых не указан предмет расчета).','Ton'=>'Тонна','Trade fee'=>'Торговый сбор','Two-stage payment'=>'Двустадийный платеж','Units of measurement'=>'Единицы измерения','VAT at 0%'=>'НДС по ставке 0%','VAT at 10%'=>'НДС чека по ставке 10%','VAT at 10/110 calculated rate'=>'НДС чека по расчетной ставке 10/110','VAT at 20%'=>'НДС чека по ставке 20%','VAT at 20/120 calculated rate'=>'НДС чека по расчетной ставке 20/120','PAYNET'=>'PAYNET','Without VAT'=>'Без НДС','Work'=>'Работа']]; diff --git a/languages/wc-payneteasy-ru_RU.po b/languages/wc-payneteasy-ru_RU.po index 8ffe4ac..f73090a 100644 --- a/languages/wc-payneteasy-ru_RU.po +++ b/languages/wc-payneteasy-ru_RU.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"Project-Id-Version: Payment system PAYNET\n" +"Project-Id-Version: Payment system PAYNETEASY\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-05-30 14:30+0000\n" "PO-Revision-Date: 2024-07-30 21:35+0300\n" @@ -25,8 +25,8 @@ msgid "Agency fee" msgstr "Агентское вознаграждение" #. Description of the plugin -msgid "Allows you to use Payment system PAYNET with the WooCommerce plugin." -msgstr "Позволяет использовать Платежную систему PAYNET с плагином WooCommerce." +msgid "Allows you to use Payment system PAYNETEASY with the WooCommerce plugin." +msgstr "Позволяет использовать Платежную систему PAYNETEASY с плагином WooCommerce." #: form_fields.php:119 hooks.php:107 msgid "Applies to items that can be sold by piece or unit" @@ -144,8 +144,8 @@ msgid "Enable logging" msgstr "Включить логирование" #: form_fields.php:6 -msgid "Enable Payment system PAYNET" -msgstr "Включить платежную систему PAYNET" +msgid "Enable Payment system PAYNETEASY" +msgstr "Включить платежную систему PAYNETEASY" #: form_fields.php:70 msgid "Enable send zip code" @@ -225,8 +225,8 @@ msgid "Fiscalization settings" msgstr "Настройки фискализации" #: hooks.php:45 -msgid "Fiscalization settings (Payment system PAYNET)" -msgstr "Настройки фискализации (Платежная система PAYNET)" +msgid "Fiscalization settings (Payment system PAYNETEASY)" +msgstr "Настройки фискализации (Платежная система PAYNETEASY)" #: form_fields.php:101 form_fields.php:172 hooks.php:150 msgid "Full payment" @@ -285,8 +285,8 @@ msgid "Hour" msgstr "Час" #. Author URI of the plugin -msgid "https://www.paynet.ru/" -msgstr "https://www.paynet.ru/" +msgid "https://www.payneteasy.com/" +msgstr "https://www.payneteasy.com/" #: form_fields.php:50 msgid "In this mode, the payment for the goods is not charged." @@ -417,7 +417,7 @@ msgstr "Создана платежная ссылка:" #: wc-payneteasy.php:204 #| msgid "Payment method not \"PAYNET Payment System\"" msgid "Payment method not \"PAYNET Payment System\"." -msgstr "Способ оплаты не \"Платежная система PAYNET\"." +msgstr "Способ оплаты не \"Платежная система PAYNETEASY\"." #: wc-payneteasy.php:752 wc-payneteasy.php:758 #| msgid "Payment not paid" @@ -438,8 +438,8 @@ msgstr "Оплата возвращена." #. Name of the plugin #: form_fields.php:13 wc-payneteasy.php:73 -msgid "Payment system PAYNET" -msgstr "Платёжная система PAYNET" +msgid "Payment system PAYNETEASY" +msgstr "Платёжная система PAYNETEASY" #: form_fields.php:197 hooks.php:171 msgid "Payout" @@ -458,7 +458,7 @@ msgid "" "Plugin \"PAYNET Payment System\" for WooCommerce, which allows you to integrate " "online payments." msgstr "" -"Плагин «Платежная система PAYNET» для WooCommerce, позволяющий интегрировать " +"Плагин «Платежная система PAYNETEASY» для WooCommerce, позволяющий интегрировать " "онлайн-платежи." #: wc-payneteasy.php:255 @@ -517,7 +517,7 @@ msgstr "Выберите статус заказа, который будет о #: form_fields.php:71 msgid "Send the buyer's postal code to the PAYNET payment system." -msgstr "Отправлять почтовый индекс покупателя в платежную систему PAYNET." +msgstr "Отправлять почтовый индекс покупателя в платежную систему PAYNETEASY." #: form_fields.php:68 msgid "Send zip code" diff --git a/languages/wc-payneteasy.pot b/languages/wc-payneteasy.pot index 622494f..f38572a 100644 --- a/languages/wc-payneteasy.pot +++ b/languages/wc-payneteasy.pot @@ -1,7 +1,7 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: Payment system PAYNET\n" +"Project-Id-Version: Payment system PAYNETEASY\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-07-30 21:35+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" @@ -13,7 +13,7 @@ msgstr "" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" "X-Generator: Poedit 3.4.4\n" "X-Loco-Version: 2.6.4; wp-6.2.2\n" -"X-Domain: wc-payneteasy\n" +"X-Domain: mail-domain-com\n" #: form_fields.php:100 form_fields.php:171 hooks.php:149 msgid "Advance" @@ -24,7 +24,7 @@ msgid "Agency fee" msgstr "" #. Description of the plugin -msgid "Allows you to use Payment system PAYNET with the WooCommerce plugin." +msgid "Allows you to use Payment system PAYNETEASY with the WooCommerce plugin." msgstr "" #: form_fields.php:119 hooks.php:107 @@ -129,7 +129,7 @@ msgid "Enable logging" msgstr "" #: form_fields.php:6 -msgid "Enable Payment system PAYNET" +msgid "Enable Payment system PAYNETEASY" msgstr "" #: form_fields.php:70 @@ -205,7 +205,7 @@ msgid "Fiscalization settings" msgstr "" #: hooks.php:45 -msgid "Fiscalization settings (Payment system PAYNET)" +msgid "Fiscalization settings (Payment system PAYNETEASY)" msgstr "" #: form_fields.php:101 form_fields.php:172 hooks.php:150 @@ -261,7 +261,7 @@ msgid "Hour" msgstr "" #. Author URI of the plugin -msgid "https://www.paynet.ru/" +msgid "https://www.payneteasy.com/" msgstr "" #: form_fields.php:50 @@ -400,7 +400,7 @@ msgstr "" #. Name of the plugin #: form_fields.php:13 wc-payneteasy.php:73 -msgid "Payment system PAYNET" +msgid "Payment system PAYNETEASY" msgstr "" #: form_fields.php:197 hooks.php:171 diff --git a/wc-payneteasy.php b/wc-payneteasy.php new file mode 100644 index 0000000..980005d --- /dev/null +++ b/wc-payneteasy.php @@ -0,0 +1,1059 @@ +id = 'wc_payneteasy'; + $this->icon = apply_filters('woocommerce_payneteasy_icon', $plugin_dir . 'payneteasy.png'); + $this->method_title = __('Payment system PAYNETEASY', 'wc-payneteasy'); + $this->method_description = __('Plugin "PAYNET Payment System" for WooCommerce, which allows you to integrate online payments.', 'wc-payneteasy'); + $this->has_fields = false; + + // Load the settings + $this->init_form_fields(); + $this->init_settings(); + + // Define user set variables. + $this->title = $this->get_option('title'); + $this->description = $this->get_option('description'); + $this->instructions = $this->get_option('instructions'); + $this->enabled = $this->get_option('enabled'); + + // Initialize settings + $this->init_payment_settings(); + + $this->set_payneteasy_logger(); + + //process settings with parent method + add_action('woocommerce_update_options_payment_gateways_' . $this->id, [$this, 'process_admin_options']); + add_action('woocommerce_api_wc_payneteasy_return', [$this, 'return_handler']); + add_action('woocommerce_api_wc_payneteasy_webhook', [$this, 'webhook_handler']); + // handler for checking and editing order status. + add_action('woocommerce_api_' . $this->id . '_ajax', [$this, 'ajax_handler']); + + + } + + /** + * Инициализация настроек + * + * @return void + */ + private function init_payment_settings(): void + { + // Settings + $settings = [ + 'login', + 'control_key', + 'endpoint_id', + 'payment_method', + 'three_d_secure', + 'live_url', + 'sandbox_url', + 'transaction_end', + ]; + + + foreach ($settings as $setting) { + $this->$setting = $this->get_option($setting); + } + + // Booleans + $booleanSettings = [ + 'sandbox', + 'logging', + + 'three_d_secure' + ]; + + foreach ($booleanSettings as $setting) { + $this->$setting = $this->get_option($setting) === 'yes'; + } + } + + + /** + * Инициализируйте поля формы настроейк платежной системы PAYNET. + * + * @return void + */ + public function init_form_fields(): void + { + $this->form_fields = include 'form_fields.php'; + } + + + /** + * Инициализируем свойство order объектом класса WC_Order, + * полученным с помощью идентификатора и возвращаем объект текущего класса. + * + * @param int $order_id Идентификатор заказа. + * + * @return self|Exception Объект заказа, если он существует, или Exception в противном случае. + */ + private function set_order(int $order_id): self + { + if ($order = wc_get_order($order_id)) { + $this->order = $order; + return $this; + } + else { + throw new \Exception(__('Order not found.', 'wc-payneteasy')); + } + } + + /** + * Обработка оплаты заказа в WooCommerce с помощью платежной системы PAYNET. + * должно быть совместимо с WC_Payment_Gateway::process_payment($order_id) + * + * @param int $order_id Идентификатор заказа. + * + * @return array|null Массив, содержащий результат и URL перенаправления, или null, если произошла ошибка. + */ +// public function process_payment($order_id): ?array +// { +// $this->logger->setOption('additionalCommonText', 'payment-' . rand(1111, 9999)); +// +// try { +// $this->set_order($order_id); +// +// if ($this->order->get_payment_method() != $this->id) { +// throw new \Exception(__('Payment method not "PAYNET Payment System".', 'wc-payneteasy')); +// } +// +// $response = $this->get_pay_url(); +// $status = $this->get_payment_status(); +// $reset_cart = false; +// if (trim($status['status']) == 'processing') { +// $reset_cart = true; + //Set order status pending payment +// $this->order->update_status('pending', __('Payment link generated:', 'wc-payneteasy') . $response); +// WC()->cart->empty_cart(); +// if ($this->payment_method == 'form') { +// return [ +// 'result' => 'success', +// 'redirect' => $response +// ]; +// } elseif ($this->payment_method == 'direct') { +// if ($this->three_d_secure) { +// print $status['html']; +// } +// } +// } elseif (trim($status['status']) == 'approved') { +// $reset_cart = true; +// return [ +// 'result' => 'success', +// 'redirect' => home_url(sprintf('/wc-api/%s_return', $this->id)) +// ]; +// } elseif (trim($status['status']) == 'error') { +// $reset_cart = true; +// } elseif (trim($status['status']) == 'declined') { +// $reset_cart = true; +// } + + //once the order is updated clear the cart and reduce the stock +// if ($reset_cart) +// WC()->cart->empty_cart(); + +// } catch (\Exception | PayneteasyException $e) { +// // Handle exception and log error +// $context = [ +// 'file_exception' => $e->getFile(), +// 'line_exception' => $e->getLine(), +// ]; +// if (method_exists($e, 'getContext')) $context = array_merge($e->getContext(), $context); +// +// $this->logger->error(sprintf( +// __FUNCTION__ . ' > Payneteasy exception : %s; Order id: %s;', +// $e->getMessage(), +// $order_id ?: '' +// ), $context); +// +// wc_add_notice($e->getMessage(), 'error'); +// return null; +// } +// } + + public function process_payment($order_id): ?array + { + $this->logger->setOption('additionalCommonText', 'payment-' . rand(1111, 9999)); + + try { + $this->set_order($order_id); + + if ($this->order->get_payment_method() != $this->id) { + throw new \Exception(__('Payment method not "VTB Payment System".', 'wc-vtbpay')); + } + + $pay_url = $this->get_pay_url(); + + //Set order status pending payment + $this->order->update_status('pending', __('Payment link generated:', 'wc-vtbpay') . $pay_url['redirect-url']?:''); + + //once the order is updated clear the cart and reduce the stock + WC()->cart->empty_cart(); + + if ($this->payment_method == 'form') { + return [ + 'result' => 'success', + 'redirect' => $pay_url['redirect-url'] + ]; + } elseif ($this->payment_method == 'direct') { + return [ + 'result' => 'success', + 'redirect' => get_site_url() . sprintf('?wc-api=%s_return', $this->id) . '&orderId=' . $order_id + ]; + } + } catch (\Exception | VtbPayException $e) { + // Handle exception and log error + $context = [ + 'file_exception' => $e->getFile(), + 'line_exception' => $e->getLine(), + ]; + if (method_exists($e, 'getContext')) $context = array_merge($e->getContext(), $context); + + $this->logger->error(sprintf( + __FUNCTION__ . ' > VtbPay exception : %s; Order id: %s;', + $e->getMessage(), + $order_id ?: '' + ), $context); + + wc_add_notice($e->getMessage(), 'error'); + return null; + } + } + + private function get_pay_url() + { + $order_id = $this->order->get_id(); + $email = $this->order->get_billing_email(); + $total = $this->order->get_total(); + $return_url = home_url(sprintf('/wc-api/%s_return', $this->id)); // Get return URL + + $payneteasy_card_number = $_POST[ 'credit_card_number' ]?:''; + $payneteasy_card_expiry_month = $_POST[ 'expire_month' ]?:''; + $payneteasy_card_expiry_year = $_POST[ 'expire_year' ]?:''; + $payneteasy_card_name = $_POST[ 'card_printed_name' ]?:''; + $payneteasy_card_cvv = $_POST[ 'cvv2' ]?:''; + + $card_data = [ + 'credit_card_number' => $payneteasy_card_number?:'', + 'card_printed_name' => $payneteasy_card_name?:'', + 'expire_month' => $payneteasy_card_expiry_month?:'', + 'expire_year' => $payneteasy_card_expiry_year?:'', + 'cvv2' => $payneteasy_card_cvv?:'', + ]; + + if (get_option('permalink_structure') == '') { + $wc_api_return_url = get_site_url() . sprintf('?wc-api=%s_return', $this->id) . '&orderId=' . $order_id; + } else { + $wc_api_return_url = get_site_url() . sprintf('/wc-api/%s_return', $this->id) . '&orderId=' . $order_id; + } + + + $data = [ + 'client_orderid' => (string)$order_id, + 'order_desc' => 'Order # ' . $order_id, + 'amount' => $total, + 'currency' => $this->order->get_currency(), + 'address1' => $this->order->get_shipping_address_1()?:$this->order->get_billing_address_1(), + 'city' => $this->order->get_shipping_city()?:$this->order->get_billing_city(), + 'zip_code' => $this->order->get_shipping_postcode()?:$this->order->get_billing_postcode(), + 'country' => $this->order->get_shipping_country()?:$this->order->get_billing_country(), + 'phone' => $this->order->get_shipping_phone()?:$this->order->get_billing_phone(), + 'email' => $email, + 'ipaddress' => $_SERVER['REMOTE_ADDR'], + 'cvv2' => $card_data['cvv2'], + 'credit_card_number' => $card_data['credit_card_number'], + 'card_printed_name' => $card_data['card_printed_name'], + 'expire_month' => $card_data['expire_month'], + 'expire_year' => $card_data['expire_year'], + 'first_name' => $this->order->get_shipping_first_name()?:$this->order->get_billing_first_name(), + 'last_name' => $this->order->get_shipping_last_name()?:$this->order->get_billing_last_name(), +// 'redirect_success_url' => $this->get_return_url($this->order), +// 'redirect_fail_url' => wc_get_cart_url(), + 'redirect_success_url' => $wc_api_return_url, + 'redirect_fail_url' => $wc_api_return_url, + 'redirect_url' => $wc_api_return_url, + 'server_callback_url' => $wc_api_return_url, + ]; + $data['control'] = $this->signPaymentRequest($data, $this->endpoint_id, $this->control_key); + + // Logging input + $this->logger->debug( + __FUNCTION__ . ' > getOrderLink - INPUT: ', [ + 'arguments' => [ + 'order_id' => $order_id, + 'email' => $email, + 'time' => time(), + 'total' => $total, + 'return_url' => $return_url, + ] + ]); + + $action_url = $this->live_url; + if ($this->sandbox) + $action_url = $this->sandbox_url; + + + if ($this->payment_method == 'form') { + $response = $this->get_paynet_api()->saleForm( + $data, + $this->payment_method, + $this->sandbox, + $action_url, + $this->endpoint_id + ); + } elseif ($this->payment_method == 'direct') { + $response = $this->get_paynet_api()->saleDirect( + $data, + $this->payment_method, + $this->sandbox, + $action_url, + $this->endpoint_id + ); + } + + global $wpdb; + $wpdb->insert( + $wpdb->prefix.'payneteasy_payments', + array( + 'paynet_order_id' => $response['paynet-order-id'], + 'merchant_order_id' => $response['merchant-order-id'], + ) + ); + + // Logging output + $this->logger->debug( + __FUNCTION__ . ' > getOrderLink - OUTPUT: ', [ + 'response' => $response + ]); + + return $response; + } + + + /** + * Отображение описания платежной системы PAYNET при оформлении заказа. + * + * @return void + */ + public function payment_fields(): void + { + if ($this->payment_method == 'direct') { + if (!empty($this->description)) { + echo wpautop(wptexturize($this->description)); + } + echo '
'; + do_action( 'woocommerce_credit_card_form_start', $this->id ); + echo '
+ +
+
+ +
+
+ + +
+
+ + +
+
+ + +
+
'; + + do_action( 'woocommerce_credit_card_form_end', $this->id ); + + echo '
'; + } elseif ($this->payment_method == 'form') { + if (!empty($this->description)) { + echo wpautop(wptexturize($this->description)); + } + } + } + + + public function validate_fields(){ + if ($this->payment_method == 'direct') { + if( empty( $_POST[ 'cvv2' ] ) ) { + wc_add_notice( 'cvv2 is required!', 'error' ); + return false; + } + if( empty( $_POST[ 'expire_year' ] ) ) { + wc_add_notice( 'Expiry year is required!', 'error' ); + return false; + } + if( empty( $_POST[ 'expire_month' ] ) ) { + wc_add_notice( 'Expiry month is required!', 'error' ); + return false; + } + if( empty( $_POST[ 'card_printed_name' ] ) ) { + wc_add_notice( 'Printed name is required!', 'error' ); + return false; + } + if( empty( $_POST[ 'credit_card_number' ] ) ) { + wc_add_notice( 'Card Number is required!', 'error' ); + return false; + } + } + return true; + } + + + /** + * Обработчик return, вызываемый при переходе на страницу return_url, после попытки оплаты. + * + * @return void + */ + public function return_handler(): void + { + $this->logger->setOption('additionalCommonText', 'return-' . rand(1111, 9999)); + $order_id = $_GET['orderId'] ?? null; + + try { + if (empty($order_id)) { + throw new \Exception(__('Order ID is empty.', 'wc-payneteasy')); + } + + // Logging $_REQUEST + $this->logger->debug( + __FUNCTION__ . ' > return: ', [ + 'request_data' => $_GET + ]); + + $this->set_order($order_id); + + $payment_status = $this->get_payment_status(); + + $this->change_payment_status(trim($payment_status['status'])); + + if ($this->payment_method == 'form') { + if (trim($payment_status['status']) == 'approved') { +// $redirect_url = $this->get_return_url($this->order); +// $redirect_url = $this->order->get_checkout_order_received_url(); +// wp_redirect($redirect_url); + echo '

Your payment was approved. Thank you.

Return homepage
'; + die(); + } elseif (trim($payment_status['status']) == 'error') { +// $redirect_url = str_replace('&', '&', $this->order->get_cancel_order_url()); +// wp_redirect($redirect_url); + echo '

Your payment was not completed because of an error. Could you try again.

Return homepage
'; + die(); + } elseif (trim($payment_status['status']) == 'declined') { +// $redirect_url = str_replace('&', '&', $this->order->get_cancel_order_url()); +// wp_redirect($redirect_url); + echo '

Your payment was declined. Could you try again.

Return homepage
'; + die(); + } + } elseif ($this->payment_method == 'direct') { + if (trim($payment_status['status']) == 'processing') { + if ($this->three_d_secure) { + echo $payment_status['html']; + die(); + } + } elseif (trim($payment_status['status']) == 'approved') { +// $redirect_url = $this->get_return_url($this->order); +// $redirect_url = $this->order->get_checkout_order_received_url(); +// wp_redirect($redirect_url); + echo '

Your payment was approved. Thank you.

Return homepage
'; + die(); + } elseif (trim($payment_status['status']) == 'error') { +// $redirect_url = str_replace('&', '&', $this->order->get_cancel_order_url()); +// wp_redirect($redirect_url); + echo '

Your payment was not completed because of an error. Could you try again.

Return homepage
'; + die(); + } elseif (trim($payment_status['status']) == 'declined') { +// $redirect_url = str_replace('&', '&', $this->order->get_cancel_order_url()); +// wp_redirect($redirect_url); + echo '

Your payment was declined. Could you try again.

Return homepage
'; + die(); + } + } + + + } catch (\Exception | PayneteasyException $e) { + // Handle exception and log error + $context = [ + 'file_exception' => $e->getFile(), + 'line_exception' => $e->getLine(), + ]; + if (method_exists($e, 'getContext')) $context = array_merge($e->getContext(), $context); + + $this->logger->error(sprintf( + __FUNCTION__ . ' > Payneteasy exception : %s; Order id: %s;', + $e->getMessage(), + $order_id ?: '' + ), $context); + + wp_die($e->getMessage()); + } + } + + + /** + * Обработчик return, вызываемый при переходе на страницу return_url, после попытки оплаты. + * + * @return void + */ + public function webhook_handler(): void + { + $this->logger->setOption('additionalCommonText', 'webhook-' . rand(1111, 9999)); + $php_input = json_decode(file_get_contents('php://input'), true) ?: null; + $order_id = $php_input['object']['orderId'] ?? ''; + + try { + if (empty($order_id)) { + throw new \Exception(__('Order ID is empty.', 'wc-payneteasy')); + } + + // Logging php input + $this->logger->debug( + __FUNCTION__ . ' > callback: ', [ + 'php_input' => $php_input + ]); + + $this->set_order($order_id); + + if ($this->order->get_status() === $php_input['object']['status']['value']) die('OK'); + + $payment_status = $this->get_payment_status(); + + $this->change_payment_status(trim($payment_status['status'])); + + die('OK'); + + } catch (\Exception | PayneteasyException $e) { + // Handle exception and log error + $context = [ + 'file_exception' => $e->getFile(), + 'line_exception' => $e->getLine(), + ]; + if (method_exists($e, 'getContext')) $context = array_merge($e->getContext(), $context); + + $this->logger->error(sprintf( + __FUNCTION__ . ' > Payneteasy exception : %s; Order id: %s;', + $e->getMessage(), + $order_id ?: '' + ), $context); + + wp_die($e->getMessage()); + } + } + + + /** + * Устанавливаем статус заказа + * + * @param string $payment_status Статус платежа + * + * @return bool + */ + private function change_payment_status(string $payment_status): bool + { + $available_statuses = [ + 'approved' => fn() => $this->actions_for_paid_order(), + 'processing' => fn() => $this->actions_for_hold_order() + ]; + + $order_status_fnc = $available_statuses[$payment_status] ?? false; + + if (!empty($order_status_fnc)) $order_status_fnc(); + else $this->actions_for_unpaid_order(); // Payment not completed + + return !empty($order_status_fnc); + } + + + /** + * Проверяем статус платежа, и если он approved, то устанавливаем заказ в CMS как оплаченный. + * + * @return void + */ + public function ajax_handler(): void + { + $this->logger->setOption('additionalCommonText', 'ajax-' . rand(1111, 9999)); + // Получает данные из AJAX-запроса через $_POST + $order_id = $_POST['order_id'] ?? ''; + $action = $_POST['action'] ?? ''; + + // Logging php input + $this->logger->debug( + __FUNCTION__ . ' > ajax: ', [ + 'post' => $_POST + ]); + + try { + if (!wp_verify_nonce($_POST['nonce'] ?? '', 'payneteasy-ajax-nonce')) { + throw new \Exception(__('Failed ajax validation.', 'wc-payneteasy')); + } + + if (empty($order_id)) { + throw new \Exception(__('Order ID is empty.', 'wc-payneteasy')); + } + + if (empty($action)) { + throw new \Exception(__('Required action not specified.', 'wc-payneteasy')); + } + + // Logging php input + $this->logger->debug( + __FUNCTION__ . ' > ajax: ', [ + 'post' => $_POST + ]); + + $this->set_order($order_id); + + $payment_status = $this->get_payment_status(); + + if ($action == 'refund') { + $this->make_chargeback(); + + $message = __('Payment refunded.', 'wc-payneteasy'); + } + elseif ($action == 'check_status') { + $this->change_payment_status(trim($payment_status['status'])); + + $message = __('Status updated.', 'wc-payneteasy'); + } + + // Отправьте JSON-ответ и завершите выполнение скрипта + wp_send_json([ + 'success' => true, + 'message' => $message + ]); + + } catch (\Exception | PayneteasyException $e) { + // Handle exception and log error + $context = [ + 'file_exception' => $e->getFile(), + 'line_exception' => $e->getLine(), + ]; + if (method_exists($e, 'getContext')) $context = array_merge($e->getContext(), $context); + + $this->logger->error(sprintf( + __FUNCTION__ . ' > Payneteasy exception : %s; Order id: %s;', + $e->getMessage(), + $order_id ?: '' + ), $context); + + wp_send_json([ + 'success' => false, + 'message' => $e->getMessage() + ]); + } + } + + + /** + * Отправляем запрос на возврат в PAYNET, возвращвем результат запроса и логируем входящие и выходящие данные. + * Если запрос прошёл успешно, то и в CMS отображаем информацию о возврате. + * + * @return array + */ + private function make_chargeback(): array + { + $order_id = $this->order->get_id(); + + $amount = $_POST['refund_amount'] ?? 0; + + if (empty($amount)) throw new \Exception(__('Refund amount not specified.', 'wc-payneteasy')); + + $amount = self::parse_amount($amount); + + $email = $this->order->get_billing_email(); + + + // Logging input + $this->logger->debug( + __FUNCTION__ . ' > setRefunds - INPUT: ', [ + 'arguments' => [ + 'order_id' => $order_id, + 'amount' => $amount, + 'email' => $email, + ] + ]); + + global $wpdb; + $paynet_order_id = $wpdb->get_var("SELECT paynet_order_id FROM {$wpdb->prefix}payneteasy_payments WHERE (merchant_order_id = '" . $order_id . "')"); + + $data = [ + 'login' => $this->login, + 'client_orderid' => $order_id, + 'orderid' => $paynet_order_id, + 'comment' => 'Order cancel ' + ]; + + $data['control'] = $this->signPaymentRequest($data, $this->endpoint_id, $this->control_key); + + $action_url = $this->live_url; + if ($this->sandbox) + $action_url = $this->sandbox_url; + + $response = $this->get_paynet_api()->return( + $data, + $this->payment_method, + $this->sandbox, + $action_url, + $this->endpoint_id + ); + + // Logging output + $this->logger->debug( + __FUNCTION__ . ' > setRefunds - OUTPUT: ', [ + 'response' => $response + ]); + + return $response; + } + + + /** + * Подготавливает элементы для возврата. + * + * @param array $items Элементы для подготовки. + * @return array Массив подготовленных элементов. + * @throws \Exception Если отсутствуют необходимые данные для возврата. + */ + private function preparing_items_for_refunds(array $items): array + { + $refund_order_item_qty = $_POST['refund_order_item_qty'] ?? []; + $refund_line_total = $_POST['refund_line_total'] ?? []; + + if (empty($refund_order_item_qty) || empty($refund_line_total)) { + throw new \Exception(__('The required data for a refund was not transmitted.', 'wc-payneteasy')); + } + + $prepared_items = []; + + foreach ($items as $item) { + $item_id = explode('-', $item['code'])[0] ?? ''; + $quantity = $refund_order_item_qty[$item_id] ?? 0; + $amount = $refund_line_total[$item_id] ?? 0; + + if (empty($quantity) && empty($amount)) continue; + + if (!empty($amount)) $item['amount'] = self::parse_amount($amount); + else $item['amount'] = (int) $quantity * $item['price']; + + if (!empty($quantity)) $item['quantity'] = (int) $quantity; + + $item['price'] = $item['amount'] / $item['quantity']; + + // Добавляем элемент в новый массив + $prepared_items[] = $item; + } + + return $prepared_items; + } + + + /** + * Преобразует строку в число с плавающей запятой. + * + * @param mixed $amount Сумма для преобразования. + * @return float Преобразованное значение суммы. + */ + private static function parse_amount($amount): float + { + if (is_string($amount)) { + $amount = str_replace([' ', ','], ['', '.'], $amount); + } + + return floatval($amount); + } + + + /** + * Обработка действий для оплаченного заказа. + * + * @return void + */ + private function actions_for_paid_order(): void + { + $completed_status = str_replace('wc-', '', $this->transaction_end); + if ($this->order->get_status() !== $completed_status) { + $this->order->update_status( + $completed_status, + __('Payment completed successfully.', 'wc-payneteasy') + ); + $this->order->payment_complete(); + wc_reduce_stock_levels($this->order->get_id()); + } + } + + + /** + * Обработка действий для удержанного заказа. + * + * @return void + */ + private function actions_for_hold_order(): void + { + if ($this->order->get_status() !== 'on-hold') $this->order->update_status( + 'on-hold', + __('Payment received but not confirmed.', 'wc-payneteasy') + ); + } + + + /** + * Обработка действий в случае неоплаченного заказа. + * + * @return void + */ + private function actions_for_unpaid_order(): void + { + // Logging an unpaid order + $this->logger->debug(sprintf( + __FUNCTION__ . '. ' . __('Payment not paid.', 'wc-payneteasy') . '; Order ID: %s', + $this->order->get_id() + )); + + if ($this->order->get_status() !== 'failed') $this->order->update_status( + 'failed', + __('Payment not paid.', 'wc-payneteasy') + ); + wc_add_notice(__('Payment not paid. Your order has been canceled.', 'wc-payneteasy'), 'error'); + } + + + /** + * Обработка действий в случае возвращённого заказа. + * + * @return void + */ + private function actions_for_refunded_order(): void + { + // Logging an unpaid order + $this->logger->debug(sprintf( + __FUNCTION__ . '. ' . __('Refund of payment.', 'wc-payneteasy') . '; Order ID: %s', + $this->order->get_id() + )); + + if ($this->order->get_status() !== 'refunded') { + $this->order->update_status( + 'refunded', + __('Refund of payment.', 'wc-payneteasy') + ); + } + wc_add_notice( + __('The payment was refunded.', 'wc-payneteasy'), + 'notice' + ); + } + + + /** + * Обработка действий в случае частично возвращённого заказа. + * + * @return void + */ + private function actions_for_partially_refunded_order(): void + { + // Logging an unpaid order + $this->logger->debug(sprintf( + __FUNCTION__ . '. ' . __('Partial refund of payment.', 'wc-payneteasy') . '; Order ID: %s', + $this->order->get_id() + )); + + $completed_status = str_replace('wc-', '', $this->transaction_end); + if ($this->order->get_status() !== $completed_status) { + $this->order->update_status( + $completed_status, + __('Partial refund of payment.', 'wc-payneteasy') + ); + } + wc_add_notice( + __('The payment was partial refunded.', 'wc-payneteasy'), + 'notice' + ); + } + + + /** + * Получение статуса заказа WooCommerce из PAYNET API. + * + * @return string Значение статуса заказа, если оно существует, или пустая строка в противном случае. + */ + private function get_payment_status(): array + { + global $wpdb; + $paynet_order_id = $wpdb->get_var("SELECT paynet_order_id FROM {$wpdb->prefix}payneteasy_payments WHERE (merchant_order_id = '" . $this->order->get_id() . "')"); + + $data = [ + 'login' => $this->login, + 'client_orderid' => (string)$this->order->get_id(), + 'orderid' => $paynet_order_id, + ]; + $data['control'] = $this->signStatusRequest($data, $this->login, $this->control_key); + + $action_url = $this->live_url; + if ($this->sandbox) + $action_url = $this->sandbox_url; + + // Logging input + $this->logger->debug( + __FUNCTION__ . ' > getOrderInfo - INPUT: ', [ + 'arguments' => [ + 'order_id' => $this->order->get_id(), + 'paynet_order_id' => $paynet_order_id + ] + ]); + + $response = $this->get_paynet_api()->status($data, $this->payment_method, $this->sandbox, $action_url, $this->endpoint_id); + + // Logging output + $this->logger->debug( + __FUNCTION__ . ' > getOrderInfo - OUTPUT: ', [ + 'response' => $response + ]); + + if ( + !isset($response['status']) + ) { +// throw new Exception('No information about payment status.'); + } + + return $response; + } + + + /** + * Инициализация и настройка объекта класса PayneteasyLogger. + * + * Эта функция инициализирует и настраивает логгер, используемый плагином Payneteasy для ведения журнала. + * + * @return void + */ + private function set_payneteasy_logger(): void + { + if (version_compare(WOOCOMMERCE_VERSION, '2.1', '<')) { + global $woocommerce; + $wc_log = $woocommerce->logger(); + } + else { + $wc_log = new WC_Logger(); + } + $logging = $this->logging; + + $this->logger = PayneteasyLogger::getInstance() + ->setOption('showCurrentDate', false) + ->setOption('showLogLevel', false) + ->setCustomRecording(function($message) use ($wc_log){ + $wc_log->error($message); + }, PayneteasyLogger::LOG_LEVEL_ERROR) + ->setCustomRecording(function($message) use ($wc_log, $logging){ + if ($logging) $wc_log->debug($message); + }, PayneteasyLogger::LOG_LEVEL_DEBUG); + } + + + private function signStatusRequest($requestFields, $login, $merchantControl) + { + $base = ''; + $base .= $login; + $base .= $requestFields['client_orderid']; + $base .= $requestFields['orderid']; + + return $this->signString($base, $merchantControl); + } + + + private function signPaymentRequest($data, $endpointId, $merchantControl) + { + $base = ''; + $base .= $endpointId; + $base .= $data['client_orderid']; + $base .= $data['amount'] * 100; + $base .= $data['email']; + + return $this->signString($base, $merchantControl); + } + + + private function signString($s, $merchantControl) + { + return sha1($s . $merchantControl); + } + + + /** + * Создаем новый экземпляр класса PaynetApi с заданными конфигурациями платёжной системы. + * + * @return PaynetApi The new PaynetApi instance. + */ + protected function get_paynet_api(): PaynetApi + { + return new PaynetApi( + $this->login, + $this->control_key, + $this->endpoint_id, + $this->payment_method, + (bool) $this->sandbox + ); + } + } +}