Проблема: неактивные методы оплаты в WooCommerce мешают покупателям
В интернет-магазине на WooCommerce иногда остаются включёнными методы оплаты, которые по каким-то причинам перестали работать: например, устарели ключи API, изменились условия работы платежного шлюза или временно недоступен сервис. Это приводит к тому, что покупатели видят нерабочие варианты оплаты, пытаются выбрать их и получают ошибку на этапе оформления заказа.
Ручное выключение таких методов оплаты — временное решение, а регулярная проверка вручную требует времени и может быть забыта.
Диагностика проблемы: как выявить неактивные методы оплаты
Первый шаг — понять, какие методы оплаты «висят» и являются неактивными. Обычно проблемы проявляются так:
- При выборе метода оплаты появляется ошибка при попытке оплаты.
- В админке WooCommerce в списке методов оплаты вы видите активные методы, но их API-ключи устарели или сервис не отвечает.
- Покупатели жалуются на невозможность оплатить заказ.
Для диагностики можно включить режим отладки WooCommerce и проверить логи ошибок платежных шлюзов в меню WooCommerce > Статус > Логи.
Пример обнаружения ошибки в логах:
[2024-06-10 14:22:33] Gateway error: API key invalid or expiredПошаговое решение: автоматическое отключение неактивных методов оплаты через проверку API
Реализуем автоматическую проверку доступности методов оплаты и отключение тех, которые не проходят проверку. Рассмотрим пример на основе двух популярных шлюзов: payment_gateway_1 и payment_gateway_2. Для каждого реализуем функцию проверки состояния, которая вызывается при загрузке админки и на фронтенде.
Шаг 1. Добавьте проверочные функции в functions.php вашей темы или в отдельный плагин
function is_payment_gateway_1_active() {
// Пример проверки API ключа шлюза 1
$api_key = get_option('payment_gateway_1_api_key');
if (empty($api_key)) {
return false;
}
$response = wp_remote_get('https://api.gateway1.com/status?key=' . $api_key);
if (is_wp_error($response)) {
return false;
}
$body = wp_remote_retrieve_body($response);
$data = json_decode($body, true);
return !empty($data['active']) && $data['active'] === true;
}
function is_payment_gateway_2_active() {
// Пример проверки соединения с платежным шлюзом 2
$api_token = get_option('payment_gateway_2_token');
if (!$api_token) {
return false;
}
$response = wp_remote_post('https://api.gateway2.com/check', [
'body' => json_encode(['token' => $api_token]),
'headers' => ['Content-Type' => 'application/json'],
'timeout' => 5,
]);
if (is_wp_error($response)) {
return false;
}
$data = json_decode(wp_remote_retrieve_body($response), true);
return isset($data['status']) && $data['status'] === 'ok';
}Шаг 2. Автоматическое отключение методов оплаты на основе проверки
Добавим фильтр woocommerce_available_payment_gateways для отключения неподдерживаемых методов при загрузке страницы оформления заказа.
add_filter('woocommerce_available_payment_gateways', 'disable_inactive_payment_gateways');
function disable_inactive_payment_gateways($available_gateways) {
if (isset($available_gateways['payment_gateway_1']) && !is_payment_gateway_1_active()) {
unset($available_gateways['payment_gateway_1']);
}
if (isset($available_gateways['payment_gateway_2']) && !is_payment_gateway_2_active()) {
unset($available_gateways['payment_gateway_2']);
}
return $available_gateways;
}Шаг 3. Отключение методов и в админке WooCommerce
Чтобы не путаться, лучше и в настройках отключать неактивные методы. Для этого можно добавить проверку при загрузке админки и автоматически выключать их:
add_action('admin_init', 'auto_disable_inactive_payment_gateways');
function auto_disable_inactive_payment_gateways() {
$gateways = WC()->payment_gateways()->payment_gateways();
$updated = false;
if (isset($gateways['payment_gateway_1']) && !is_payment_gateway_1_active()) {
update_option('woocommerce_payment_gateway_1_enabled', 'no');
$updated = true;
}
if (isset($gateways['payment_gateway_2']) && !is_payment_gateway_2_active()) {
update_option('woocommerce_payment_gateway_2_enabled', 'no');
$updated = true;
}
if ($updated) {
// Очистка кэша методов оплаты
WC()->payment_gateways()->init_gateway_settings();
}
}Проверка результата после внедрения
- Перейдите на страницу оформления заказа. Неактивные методы оплаты должны отсутствовать в списке.
- В админке WooCommerce в разделе
Настройки > Платежинеактивные методы должны быть отключены (статус «выключено»). - Протестируйте на тестовом заказе, что только активные методы доступны для выбора и оплаты проходит без ошибок.
- Проверьте логи WooCommerce, чтобы убедиться, что ошибки по этим методам больше не появляются.
Частые ошибки и как их исправить
- Проверочные функции вызывают ошибки или долго выполняются: используйте таймауты в
wp_remote_getиwp_remote_post, добавьте кеширование результатов с помощьюset_transient, чтобы не нагружать сервер. - Отключение не применяется в админке: убедитесь, что используете правильные опции в
update_option, их имена можно проверить в базе данных или в исходниках плагина шлюза. - Методы оплаты не отображаются даже если они активны: проверьте, чтобы функции проверки возвращали
trueдля рабочих методов, а фильтрwoocommerce_available_payment_gatewaysкорректно их не удалял.
Практические советы по безопасности и производительности
- Кэшируйте результаты проверки с помощью
set_transient('payment_gateway_1_status', $status, 300), чтобы запросы к внешним API выполнялись не чаще 1 раза в 5 минут. - Обрабатывайте ошибки сетевых запросов через
is_wp_error()и корректно реагируйте, чтобы не отключать методы из-за временных сбоев. - Используйте HTTPS и безопасные токены для взаимодействия с API платежных систем.
- Ограничьте частоту проверок, например, запускайте проверку только при загрузке страницы оформления заказа и в админке, а не на каждом запросе.
Сравнение вариантов реализации автоматического отключения методов оплаты
| Вариант | Плюсы | Минусы |
|---|---|---|
| Кодовое решение с проверками API (как в статье) | Полный контроль, адаптация под любые шлюзы, без лишних плагинов | Требует поддержки, возможны сложности с API разных платежных систем |
| Плагины для управления платежами и мониторинга | Простота установки, поддержка и обновления разработчиками | Могут быть платными, не всегда гибкие, нагрузка на сайт |
| Ручное отключение в админке | Простое и быстрое решение | Зависит от человека, риск забыть выключить проблемный метод |