Диагностика проблемы с платежными системами в WooCommerce
В процессе оформления заказа в WooCommerce могут возникать ошибки, связанные с платежными системами: сбои API, неправильные настройки, отсутствие ответа от платежного шлюза. Если такие ошибки не обрабатываются, пользователь застревает на этапе оплаты, а администратор не получает уведомлений. Автоматическое отключение проблемных платежных методов снижает количество неудачных попыток и улучшает UX.
Как выявить проблемные платежные системы
- Включите журнал ошибок WooCommerce для платежных шлюзов: в WooCommerce > Статус > Логи выберите логи, связанные с платежами.
- Проанализируйте сообщения об ошибках, например, timeout, 500 ошибка или неверный ответ API.
- Проверьте, не появляются ли жалобы пользователей на невозможность завершить заказ.
Пошаговое решение: автоматическое отключение платежных методов при ошибках
Реализуем логику, которая при фиксировании ошибки определённого платежного шлюза сохраняет в базе статус отключения и исключает этот метод из доступных для выбора клиентов.
1. Создаём таблицу для хранения статуса платежных методов
function wpzen_create_payment_status_table() {
global $wpdb;
$table_name = $wpdb->prefix . 'payment_gateway_status';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE IF NOT EXISTS $table_name (
gateway_id VARCHAR(100) PRIMARY KEY,
is_disabled TINYINT(1) NOT NULL DEFAULT 0,
disabled_at DATETIME DEFAULT CURRENT_TIMESTAMP
) $charset_collate;";
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
dbDelta( $sql );
}
add_action('init', 'wpzen_create_payment_status_table');2. Функция для отключения платежного метода
function wpzen_disable_gateway( $gateway_id ) {
global $wpdb;
$table = $wpdb->prefix . 'payment_gateway_status';
$exists = $wpdb->get_var( $wpdb->prepare("SELECT gateway_id FROM $table WHERE gateway_id = %s", $gateway_id) );
if ( $exists ) {
$wpdb->update( $table, [ 'is_disabled' => 1, 'disabled_at' => current_time('mysql') ], [ 'gateway_id' => $gateway_id ] );
} else {
$wpdb->insert( $table, [ 'gateway_id' => $gateway_id, 'is_disabled' => 1, 'disabled_at' => current_time('mysql') ] );
}
}3. Исключаем отключённые платежные методы из списка доступных
add_filter( 'woocommerce_available_payment_gateways', 'wpzen_filter_disabled_gateways' );
function wpzen_filter_disabled_gateways( $available_gateways ) {
global $wpdb;
$table = $wpdb->prefix . 'payment_gateway_status';
$disabled = $wpdb->get_col( "SELECT gateway_id FROM $table WHERE is_disabled = 1" );
foreach ( $disabled as $gateway_id ) {
if ( isset( $available_gateways[ $gateway_id ] ) ) {
unset( $available_gateways[ $gateway_id ] );
}
}
return $available_gateways;
}4. Логирование ошибок и вызов отключения
В большинстве платёжных плагинов есть хуки или методы для обработки результата оплаты. Например, для стандартного WooCommerce Payment Gateway можно обрабатывать ошибки в функции process_payment. Если вы используете сторонний плагин, ищите аналогичные хуки или фильтры.
function wpzen_check_payment_error_and_disable( $order_id, $gateway_id, $error_message ) {
// Логируем ошибку
if ( defined('WP_DEBUG') && WP_DEBUG ) {
error_log( "Payment gateway error: $gateway_id, Order: $order_id, Error: $error_message" );
}
// Отключаем шлюз
wpzen_disable_gateway( $gateway_id );
}
// Пример вызова, заменить на реальный хук вашего платежного плагина
add_action( 'woocommerce_payment_failed', function( $order_id, $error_message ) {
$order = wc_get_order( $order_id );
if ( ! $order ) return;
$gateway_id = $order->get_payment_method();
wpzen_check_payment_error_and_disable( $order_id, $gateway_id, $error_message );
}, 10, 2 );Проверка результата после внедрения
Для проверки:
- Имитируйте ошибку в платёжном шлюзе (например, некорректные API-ключи или отключите интернет).
- Попытайтесь оформить заказ с использованием этой системы оплаты.
- Проверьте логи ошибок в
wp-content/debug.log(если включён WP_DEBUG). - Зайдите в админку, откройте страницу оформления заказа — метод должен отсутствовать в списке доступных.
- Проверьте таблицу
wp_payment_gateway_status— у отключённого метода должен быть статусis_disabled = 1.
Частые ошибки и как их исправить
- Таблица не создаётся: Проверьте, что функция
dbDeltaвызывается после подключения файлаwp-admin/includes/upgrade.php. - Платёжный метод не отключается: Убедитесь, что ID метода совпадает с ключом в массиве
$available_gateways. Используйтеerror_log(print_r($available_gateways, true));для отладки. - Ошибка в логике отключения: Проверьте, что вызов
wpzen_disable_gatewayпроисходит только при реальной ошибке оплаты, иначе метод будет отключаться без причины. - Метод остаётся в списке после отключения: Проверьте, не кэшируется ли результат фильтра
woocommerce_available_payment_gateways. Очистите кэш сайта и браузера.
Практические советы по безопасности и производительности
- Всегда валидируйте данные, получаемые из платежных систем, чтобы избежать подделки статусов.
- Добавьте возможность включать отключённые методы вручную через админку или WP CLI для восстановления работы.
- Логируйте ошибки только в режиме отладки, чтобы не загромождать логи в продакшене.
- Для производительности используйте транзиенты, если количество платежных методов большое, чтобы не делать каждый раз запрос к базе.
Сравнение способов отключения платежных методов
| Метод | Плюсы | Минусы |
|---|---|---|
Отключение через базу и фильтр woocommerce_available_payment_gateways | Гибко, работает с любыми шлюзами, сохраняет статус | Нужно самостоятельно обрабатывать ошибки, есть накладные расходы при запросах к БД |
| Отключение через настройки плагина платежной системы | Простое решение, не требует кода | Нельзя автоматизировать при ошибках, требует ручного вмешательства |
| Использование сторонних плагинов мониторинга платежей | Автоматизация, расширенные функции | Дополнительная нагрузка и зависимость от сторонних решений |