Диагностика проблемы с платежными шлюзами в WooCommerce
В крупных интернет-магазинах на WooCommerce часто возникают ситуации, когда платежный шлюз временно недоступен из-за технических сбоев или проблем с API. В таких случаях важно автоматически отключать способ оплаты, чтобы избежать ошибок при оформлении заказа и негативных отзывов пользователей. Также необходимо оперативно инициировать возврат средств для неоплаченных или зависших заказов.
Как выявить проблему с платежным шлюзом?
- Проверять логи ошибок WooCommerce и PHP, искать сообщения о таймаутах или ошибках соединения с API платежного сервиса.
- Использовать системные мониторинги и CRON-задания для регулярной проверки доступности API (например, через wp_remote_get).
- Отслеживать статусы заказов с неоплаченной меткой более 24 часов.
Пошаговое решение: автоматическое отключение способа оплаты
Реализуем проверку доступности платежного шлюза и автоматическое отключение метода оплаты через фильтр 'woocommerce_available_payment_gateways'. Ниже пример для отключения метода оплаты с ID my_gateway при недоступности API.
add_filter('woocommerce_available_payment_gateways', 'disable_gateway_if_unavailable');
function disable_gateway_if_unavailable($available_gateways) {
$gateway_id = 'my_gateway';
$api_url = 'https://api.paymentprovider.com/status';
$response = wp_remote_get($api_url, ['timeout' => 5]);
if (is_wp_error($response) || wp_remote_retrieve_response_code($response) !== 200) {
if (isset($available_gateways[$gateway_id])) {
unset($available_gateways[$gateway_id]);
}
}
return $available_gateways;
}Этот код проверяет статус API перед загрузкой страницы оформления заказа и отключает метод оплаты, если сервис не отвечает.
Автоматический возврат средств для заказов с неоплаченным статусом
Для возврата средств можно использовать CRON-задачу, которая будет регулярно обрабатывать заказы с задержкой оплаты и пытаться вернуть деньги через API платежной системы.
add_action('my_custom_refund_cron_hook', 'process_pending_refunds');
function process_pending_refunds() {
$args = [
'status' => ['pending', 'on-hold'],
'date_modified' => '<' . (time() - 86400), // старше 24 часов
];
$orders = wc_get_orders($args);
foreach ($orders as $order) {
// Проверка, не был ли уже инициирован возврат
if (!$order->get_meta('_refund_processed')) {
$refund_result = my_payment_gateway_refund($order);
if ($refund_result === true) {
$order->update_status('refunded', 'Автоматический возврат средств из-за недоступности платежного шлюза.');
$order->update_meta_data('_refund_processed', true);
$order->save();
}
}
}
}
// Регистрация CRON задачи в init
add_action('init', function() {
if (!wp_next_scheduled('my_custom_refund_cron_hook')) {
wp_schedule_event(time(), 'hourly', 'my_custom_refund_cron_hook');
}
});
// Пример функции возврата через API платежного шлюза
function my_payment_gateway_refund($order) {
$order_id = $order->get_id();
$amount = $order->get_total();
// Реальный запрос к API шлюза для возврата средств
// Здесь нужно использовать конкретный SDK или HTTP запрос
// Возвращает true при успешном возврате, false при ошибке
return true;
}Проверка результата после внедрения
- Отключите тестово API платежного шлюза (например, смените URL на несуществующий), обновите страницу оформления заказа — способ оплаты должен исчезнуть.
- Создайте заказ со статусом
pending, оставьте его без оплаты на более 24 часов, дождитесь выполнения CRON задачи, проверьте изменение статуса заказа наrefunded. - Проверьте логи ошибок и уведомления пользователей на сайте.
Частые ошибки и как их исправлять
- Не срабатывает отключение способа оплаты: Проверьте правильность ID метода оплаты, убедитесь, что фильтр
woocommerce_available_payment_gatewaysприменяется в нужном месте. - CRON задача не выполняется: Проверьте, что WordPress CRON активен, нет ли конфликтов с другими плагинами, попробуйте запускать вручную wp cron через командную строку.
- Возврат средств не происходит: Убедитесь в корректности реализации функции возврата
my_payment_gateway_refund, проверьте ключи API и права доступа платежного шлюза.
Практические советы по безопасности и производительности
- Кэширование результатов проверки API: Чтобы не нагружать API платежного шлюза на каждой загрузке страницы, кэшируйте результат проверки статуса в транзиент WordPress с коротким временем жизни (5-10 минут).
- Безопасное хранение ключей API: Используйте настройки WooCommerce или wp-config.php для хранения конфиденциальных данных, не храните их в открытом коде.
- Обработка ошибок API: Логируйте ошибки и уведомляйте админа сайта, чтобы оперативно реагировать на сбои.
Пример кэширования проверки API с транзиентом
function is_gateway_available() {
$cache_key = 'my_gateway_status';
$cached = get_transient($cache_key);
if ($cached !== false) {
return $cached;
}
$response = wp_remote_get('https://api.paymentprovider.com/status', ['timeout' => 5]);
$available = !is_wp_error($response) && wp_remote_retrieve_response_code($response) === 200;
set_transient($cache_key, $available, 300); // кэш 5 минут
return $available;
}
add_filter('woocommerce_available_payment_gateways', function($available_gateways) {
if (!is_gateway_available()) {
unset($available_gateways['my_gateway']);
}
return $available_gateways;
});