Диагностика проблемы: почему нужно отключать способы оплаты при сбоях сети
В интернет-магазинах на WooCommerce нестабильное интернет-соединение может привести к ошибкам при оплате: заказы могут зависать на этапе транзакции, платежи не подтверждаются, а пользователи сталкиваются с неудачными попытками оплаты. Это ухудшает пользовательский опыт и увеличивает нагрузку на службу поддержки.
Чтобы минимизировать подобные ситуации, полезно автоматически отключать определённые способы оплаты, если клиент испытывает проблемы с интернет-соединением или если сервер, отвечающий за оплату, недоступен.
Как определить проблему с интернет-соединением до совершения оплаты
Для начала нужно определить, как отследить проблемы подключения. С точки зрения frontend это можно сделать с помощью JavaScript API navigator.onLine и событий online/offline. Но эти методы не всегда надёжны — например, если соединение есть, но сервер платежного шлюза недоступен.
Более устойчивый вариант — проверить доступность сервера платежного метода на стороне сервера через HTTP-запросы, например, с помощью функции wp_remote_get() с таймаутом.
Пример проверки доступности API платежного шлюза
function check_payment_gateway_availability( $url ) {
$response = wp_remote_get( $url, array( 'timeout' => 5 ) );
if ( is_wp_error( $response ) ) {
return false;
}
$code = wp_remote_retrieve_response_code( $response );
return ( $code >= 200 && $code < 300 );
}Эту функцию можно использовать для проверки, доступен ли API, например, PayPal или другого шлюза.
Пошаговое решение: как автоматически отключать способы оплаты
1. Определите URL API платежного шлюза, который хотите мониторить.
2. Используйте хук woocommerce_available_payment_gateways для динамического исключения способов оплаты в зависимости от результата проверки.
3. Кэшируйте результаты проверки на несколько минут, чтобы не перегружать сервер частыми запросами.
Пример кода для functions.php или плагина
add_filter( 'woocommerce_available_payment_gateways', 'disable_payment_gateways_on_connection_issues' );
function disable_payment_gateways_on_connection_issues( $gateways ) {
if ( is_admin() ) return $gateways; // не отключаем в админке
$cache_key = 'payment_gateway_status';
$status = get_transient( $cache_key );
if ( false === $status ) {
// Пример: проверяем API PayPal
$paypal_api_url = 'https://api.paypal.com/v1/oauth2/token';
$status = check_payment_gateway_availability( $paypal_api_url );
// Кэшируем результат на 5 минут
set_transient( $cache_key, $status, 5 * MINUTE_IN_SECONDS );
}
if ( ! $status ) {
// Отключаем PayPal, если проверка неуспешна
if ( isset( $gateways['paypal'] ) ) {
unset( $gateways['paypal'] );
}
// Можно добавить отключение других способов по аналогии
}
return $gateways;
}
// Функция проверки из предыдущего примера
function check_payment_gateway_availability( $url ) {
$response = wp_remote_get( $url, array( 'timeout' => 5 ) );
if ( is_wp_error( $response ) ) {
return false;
}
$code = wp_remote_retrieve_response_code( $response );
return ( $code >= 200 && $code < 300 );
}Проверка результата после внедрения
- Проверьте, что при нормальном доступе к API способы оплаты отображаются на странице оформления заказа.
- Имитируйте недоступность сервера (например, измените URL API на неправильный) и убедитесь, что указанные способы оплаты исчезают из списка.
- Проверьте, что кэш работает: повторные проверки не делают лишних HTTP-запросов в течение 5 минут.
Частые ошибки и как их исправить
- Отсутствие проверки is_admin() — отключение способов оплаты в административной части может привести к проблемам с редактированием заказов. Добавляйте эту проверку.
- Слишком частые HTTP-запросы — без кэширования проверка API может замедлить сайт. Используйте
set_transientиget_transientдля кэширования. - Неверный URL API — используйте URL, который реально отражает состояние сервера, лучше всего endpoint, который отвечает даже при минимальном запросе.
- Игнорирование разных способов оплаты — для каждого способа оплаты может потребоваться своя проверка или URL.
Практические советы по безопасности и производительности
- Всегда задавайте таймауты в
wp_remote_get()(не более 5 секунд), чтобы избежать зависания сайта. - Не показывайте пользователям сообщения с внутренними ошибками проверки — просто отключайте способы оплаты.
- Если у вас несколько способов оплаты с разными API, реализуйте отдельные проверки и кэш для каждого.
- При масштабных магазинах можно вынести проверки в отдельный CRON-задачу и сохранять результаты в опциях, чтобы не делать их на каждом запросе.
Сравнение способов отключения способов оплаты
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Фронтенд проверка (JS) | Использование navigator.onLine | Быстро, не нагружает сервер | Ненадёжна, не учитывает доступность API |
| Серверная проверка с wp_remote_get() | Проверка доступности API платежного шлюза | Надёжно, учитывает реальную доступность | Нагрузка на сервер, требует кэширования |
| Отключение вручную через админку | Вручную отключать через настройки WooCommerce | Просто | Не автоматизировано, требует внимания |