-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
45 changed files
with
4,615 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1 @@ | ||
# php-plugin-woocommerce | ||
# php-plugin-woocommerce wordpress |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
h2, #woocommerce_wc_payneteasy_section_separator { | ||
font-size: 1.5em; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,156 @@ | ||
document.addEventListener('DOMContentLoaded', function() { | ||
// Проверяем, находимся ли мы на странице редактирования заказа | ||
if (document.querySelector('body.post-type-shop_order')) { | ||
|
||
/* | ||
* *** Добавление функционала актуализации статуса оплаты | ||
*/ | ||
// Находим блоки с классом order_data_column | ||
const orderDataColumns = document.querySelectorAll('.order_data_column'); | ||
|
||
/* | ||
Выбираем второй блок с классом order_data_column, если он существует. | ||
Если второго блока нет, используем первый блок. | ||
*/ | ||
let targetColumn = orderDataColumns[1]; // Индекс 1 соответствует второму блоку | ||
if (!targetColumn) { | ||
targetColumn = orderDataColumns[0]; // Индекс 0 соответствует первому блоку | ||
} | ||
|
||
// Создаем HTML-код для кнопки | ||
const buttonHtml = ` | ||
<p class="form-field form-field-wide"> | ||
<label for="payneteasy-button-check-status">Для проверки состояния заказа в платежной системе PAYNET, пожалуйста, нажмите кнопку:</label> | ||
<button class="button custom-action" id="payneteasy-button-check-status">Проверить статус</button> | ||
</p> | ||
`; | ||
|
||
// Проверяем условие добавления кнопки | ||
if (targetColumn) { | ||
// Добавляем кнопку в выбранный блок | ||
targetColumn.insertAdjacentHTML('beforeend', buttonHtml); | ||
|
||
const button = document.getElementById('payneteasy-button-check-status'); | ||
|
||
if (button) { | ||
button.addEventListener('click', function(event) { | ||
event.preventDefault(); | ||
|
||
const orderID = window.location.href.match(/post=([0-9]+)/)[1]; | ||
|
||
// Создаем объект FormData для сбора данных формы | ||
const formData = new FormData(); | ||
formData.append('action', 'check_status'); | ||
formData.append('nonce', payneteasy_ajax_var.nonce); | ||
formData.append('order_id', orderID); | ||
|
||
// Выполняем AJAX-запрос к веб-хуку плагина wc-payneteasy | ||
fetch(payneteasy_ajax_var.api_url, { | ||
method: 'POST', | ||
body: formData | ||
}) | ||
.then(response => response.json()) | ||
.then(data => { | ||
if (data.success && confirm(data.message)) { | ||
location.reload(); | ||
} else { | ||
alert(data.message); | ||
} | ||
}) | ||
.catch(error => { | ||
console.error('Ошибка запроса:', error); | ||
alert('Произошла ошибка при выполнении запроса.'); | ||
}); | ||
}); | ||
} | ||
} | ||
|
||
|
||
/** | ||
* *** Добавление функционала возрата | ||
*/ | ||
const originalButton = document.querySelector('.refund-actions button.do-manual-refund'); // Находим оригинальную кнопку | ||
|
||
if (originalButton) { | ||
// Создаем копию кнопки | ||
const copyButton = originalButton.cloneNode(true); | ||
copyButton.id = 'do-manual-refund-copy'; | ||
copyButton.classList.remove('do-manual-refund'); // Удаляем класс do-manual-refund у копии | ||
|
||
// Скрываем оригинальную кнопку | ||
originalButton.style.display = 'none'; | ||
|
||
// Вставляем копию кнопки после оригинальной кнопки | ||
originalButton.parentNode.insertBefore(copyButton, originalButton.nextSibling); | ||
|
||
// Функция для синхронизации атрибутов и текста копии с оригиналом | ||
function synchronizeButtons() { | ||
copyButton.innerHTML = originalButton.innerHTML; | ||
copyButton.disabled = originalButton.disabled; | ||
// При необходимости синхронизировать другие атрибуты | ||
} | ||
|
||
// Синхронизация при изменении атрибутов и текста оригинала | ||
const observer = new MutationObserver(synchronizeButtons); | ||
observer.observe(originalButton, { childList: true, attributes: true, subtree: true }); | ||
|
||
// Добавление функционала возврата на копию кнопки | ||
copyButton.addEventListener('click', function(event) { | ||
event.preventDefault(); // Предотвращаем выполнение остальных действий | ||
|
||
// Получаем таблицу с классом woocommerce_order_items | ||
const table = document.querySelector('#woocommerce-order-items'); | ||
|
||
if (table) { | ||
// Идентификатор текущего заказа | ||
const orderID = window.location.href.match(/post=([0-9]+)/)[1]; | ||
|
||
// Создаем объект FormData для сбора данных формы | ||
const formData = new FormData(); | ||
formData.append('action', 'refund'); | ||
formData.append('nonce', payneteasy_ajax_var.nonce); | ||
formData.append('order_id', orderID); | ||
|
||
// Получаем все инпуты с именами, начинающимися с "refund_" | ||
const refundInputs = table.querySelectorAll('input[name^="refund_"]'); | ||
|
||
// Добавляем данные в FormData | ||
refundInputs.forEach(input => { | ||
formData.append(input.name, input.value); | ||
}); | ||
|
||
// Запрос подтверждения у пользователя | ||
if (confirm('Выполнить возврат в платёжной системе PAYNET?')) { | ||
// Отправляем AJAX-запрос с помощью fetch | ||
fetch(payneteasy_ajax_var.api_url, { | ||
method: 'POST', | ||
body: formData | ||
}) | ||
.then(response => response.json()) | ||
.then(data => { | ||
if (data.success) { | ||
alert(`Платёжная система PAYNET: ${data.message}`); | ||
originalButton.click(); | ||
} else { | ||
if (confirm(`Платёжная система PAYNET: ${data.message}. Продолжит возврат в WordPress?`)) { | ||
originalButton.click(); | ||
} | ||
} | ||
}) | ||
.catch(error => { | ||
console.error('Ошибка запроса:', error); | ||
if (confirm('Произошла ошибка при возврате в платёжной системе PAYNET. Продолжит возврат в WordPress?')) { | ||
originalButton.click(); | ||
} | ||
}); | ||
} else { | ||
originalButton.click(); | ||
} | ||
|
||
} else { | ||
console.error('Таблица с классом woocommerce_order_items не найдена.'); | ||
} | ||
}); | ||
} | ||
} | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,96 @@ | ||
<?php | ||
return [ | ||
'enabled' => [ | ||
'title' => __('Enable/Disable', 'woocommerce'), | ||
'type' => 'checkbox', | ||
'label' => __('Enable Payment system PAYNET', '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'), | ||
'desc_tip' => true, | ||
], | ||
'description' => [ | ||
'title' => __('Customer Message', 'wc-payneteasy'), | ||
'type' => 'textarea', | ||
'css' => 'width:500px;', | ||
'default' => __('Pay with PaynetEasy payment', 'wc-payneteasy'), | ||
'description' => __('The message which you want it to appear to the customer in the checkout page.', 'wc-payneteasy'), | ||
], | ||
'endpoint_id' => [ | ||
'title' => __('Endpoint id', 'wc-payneteasy') . ' <span style="color:red;">*<span/>', | ||
'type' => 'text', | ||
'description' => __('Merchant\'s Endpoint id is required to call the API.', 'wc-payneteasy'), | ||
'placeholder' => __('Enter Endpoint id', 'wc-payneteasy'), | ||
'custom_attributes' => ['required' => 'required'], | ||
], | ||
'login' => [ | ||
'title' => __('Login', 'wc-payneteasy') . ' <span style="color:red;">*<span/>', | ||
'type' => 'text', | ||
'description' => __('Merchant\'s Login is required to call the API.', 'wc-payneteasy'), | ||
'placeholder' => __('Enter Login', 'wc-payneteasy'), | ||
'custom_attributes' => ['required' => 'required'], | ||
], | ||
'control_key' => [ | ||
'title' => __('Control key', 'wc-payneteasy') . ' <span style="color:red;">*<span/>', | ||
'type' => 'text', | ||
'description' => __('Merchant\'s Control key is required to call the API.', 'wc-payneteasy'), | ||
'placeholder' => __('Enter Control key', 'wc-payneteasy'), | ||
'custom_attributes' => ['required' => 'required'], | ||
], | ||
'payment_method' => [ | ||
'title' => __('Payment method', 'wc-payneteasy'), | ||
'type' => 'select', | ||
'description' => __('', 'wc-payneteasy'), | ||
'placeholder' => __('Enter Payment method', 'wc-payneteasy'), | ||
'options' => [ | ||
'form' => __('Form', 'wc-payneteasy'), | ||
'direct' => __('Direct', 'wc-payneteasy') | ||
], | ||
'desc_tip' => true, | ||
'default' => 'form' | ||
], | ||
'sandbox' => [ | ||
'title' => __('Sandbox mode', 'wc-payneteasy'), | ||
'type' => 'checkbox', | ||
'label' => __('Enable sandbox mode', 'wc-payneteasy'), | ||
'description' => __('In this mode, the payment for the goods is not charged.', 'wc-payneteasy'), | ||
'default' => 'no' | ||
], | ||
'logging' => [ | ||
'title' => __('Logging', 'wc-payneteasy'), | ||
'type' => 'checkbox', | ||
'label' => __('Enable logging', 'wc-payneteasy'), | ||
'description' => __('Logging is used to debug plugin performance by storing API request data.', 'wc-payneteasy'), | ||
'default' => 'no' | ||
], | ||
'three_d_secure' => [ | ||
'title' => __('3D Secure', 'wc-payneteasy'), | ||
'type' => 'checkbox', | ||
'label' => __('Enable 3D Secure', 'wc-payneteasy'), | ||
'description' => __('3D Secure or Non 3D Secure (WORK ONLY WITH DIRECT INTEGRATION METHOD)', 'wc-payneteasy'), | ||
'default' => 'no' | ||
], | ||
'live_url' => [ | ||
'title' => __('Gateway url (LIVE)', 'wc-payneteasy'), | ||
'type' => 'text', | ||
'description' => __("https://gate.payneteasy.com/ etc.", 'wc-payneteasy'), | ||
'placeholder' => __('Enter live url.', 'wc-payneteasy'), | ||
], | ||
'sandbox_url' => [ | ||
'title' => __('Gateway url (SANDBOX)', 'wc-payneteasy'), | ||
'type' => 'text', | ||
'description' => __("https://sandbox.payneteasy.com/ etc.", 'wc-payneteasy'), | ||
'placeholder' => __('Enter sandbox url.', 'wc-payneteasy'), | ||
], | ||
'transaction_end' => [ | ||
'title' => __('Successful transaction order status', 'wc-payneteasy'), | ||
'type' => 'select', | ||
'options' => wc_get_order_statuses(), | ||
'description' => __('Select the order status to be displayed after successful payment.', 'wc-payneteasy'), | ||
'default' => 'wc-processing' | ||
] | ||
]; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,108 @@ | ||
<?php | ||
/** | ||
* Функция add_payneteasy_gateway | ||
* | ||
* Добавляет платёжный метод "WC_Payneteasy" в список доступных платёжных методов WooCommerce. | ||
* | ||
* @param array $methods - Список доступных платёжных методов | ||
* @return array - Модифицированный список платёжных методов с добавлением WC_Payneteasy | ||
*/ | ||
function add_payneteasy_gateway(array $methods): array | ||
{ | ||
$methods[] = 'WC_Payneteasy'; | ||
global $wpdb; | ||
|
||
$charset_collate = $wpdb->get_charset_collate(); | ||
|
||
$sql = "CREATE TABLE IF NOT EXISTS {$wpdb->prefix}payneteasy_payments ( | ||
`id` int(11) NOT NULL AUTO_INCREMENT, | ||
`paynet_order_id` int(11) NOT NULL, | ||
`merchant_order_id` int(11) NOT NULL, | ||
PRIMARY KEY (id) | ||
) $charset_collate;"; | ||
|
||
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' ); | ||
dbDelta( $sql ); | ||
|
||
return $methods; | ||
} | ||
add_filter('woocommerce_payment_gateways', 'add_payneteasy_gateway'); | ||
|
||
|
||
/** | ||
* Функция load_payneteasy_textdomain | ||
* | ||
* Загружает локализацию (текстовый перевод) для плагина WC_Payneteasy. | ||
*/ | ||
function load_payneteasy_textdomain(): void | ||
{ | ||
load_plugin_textdomain('wc-payneteasy', false, dirname(plugin_basename(__FILE__)) . '/languages'); | ||
} | ||
add_action('plugins_loaded', 'load_payneteasy_textdomain'); | ||
|
||
/** | ||
* Функция get_payneteasy_field_options | ||
* | ||
* Возвращает список доступных опций для полей настроек WC_Payneteasy на основе идентификатора поля. | ||
* | ||
* @param string $field_id - Идентификатор поля настроек | ||
* @return array - Список опций для поля | ||
*/ | ||
function get_payneteasy_field_options($field_id): array | ||
{ | ||
$options = [ | ||
'-' => __('Select an option', 'wc-payneteasy') | ||
]; | ||
// Определяет опции для конкретного поля | ||
switch ($field_id) { | ||
case 'payneteasy_payment_method': | ||
$options = array_merge($options, [ | ||
'form' => __('Form', 'wc-payneteasy'), | ||
'direct' => __('Direct', 'wc-payneteasy') | ||
]); | ||
break; | ||
} | ||
|
||
return $options; | ||
} | ||
|
||
/** | ||
* Функция adding_payneteasy_button_to_orders_page | ||
* | ||
* Добавляет скрипты и стили к странице заказов и настройкам WC_Payneteasy в административной части. | ||
* | ||
* @param string $hook - Идентификатор страницы в административной части WordPress | ||
*/ | ||
function adding_payneteasy_button_to_orders_page($hook): void | ||
{ | ||
// Проверяет наличие настроек WC_Payneteasy и условия для добавления скриптов и стилей | ||
$payneteasy_settings = get_option('woocommerce_wc_payneteasy_settings'); | ||
global $post; | ||
|
||
if ( | ||
($hook == 'post-new.php' || $hook == 'post.php') && | ||
!empty($post) && $post->post_type === 'shop_order' | ||
) { | ||
$order_id = $post->ID; | ||
$order = wc_get_order($order_id); | ||
$order_status = $order->get_status(); | ||
$payment_method = $order->get_payment_method(); | ||
|
||
if ( | ||
$order_status !== 'failed' && | ||
$order_status !== 'refunded' && | ||
$order_status !== 'cancelled' && | ||
$payment_method === 'wc_payneteasy' | ||
) { | ||
// Подключает скрипт для работы с заказами WC_Payneteasy | ||
wp_enqueue_script('payneteasy-order-page-script', plugins_url('/assets/js/payneteasy-order-page-script.js', __FILE__), ['jquery'], '1.0', true); | ||
wp_localize_script( | ||
'payneteasy-order-page-script', | ||
'payneteasy_ajax_var', [ | ||
'nonce' => wp_create_nonce('payneteasy-ajax-nonce'), | ||
'api_url' => home_url('/wc-api/wc_payneteasy_ajax') | ||
]); | ||
} | ||
} | ||
} | ||
add_action('admin_enqueue_scripts', 'adding_payneteasy_button_to_orders_page'); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
<?php | ||
// Silence is golden |
Oops, something went wrong.