WooCommerce: автоматический возврат денег при отклонённом платеже

Диагностика проблемы с отклонёнными платежами в WooCommerce

В интернет-магазинах на WooCommerce частая ситуация — платеж не проходит, но заказ остаётся в статусе «Обработка» или «Ожидает оплаты». Это создаёт путаницу и негативно влияет на учет и взаимодействие с клиентами. Основная проблема — отсутствие автоматического возврата средств или корректного изменения статуса заказа при отклонённом платеже.

Для диагностики:
1. Проверьте статус заказов с помощью админки WooCommerce (WooCommerce > Заказы).
2. Убедитесь, что платежный шлюз корректно передаёт статусы (например, PayPal, Stripe).
3. Посмотрите логи платежного шлюза и WooCommerce (WooCommerce > Статус > Логи).
4. Проверьте, не блокирует ли кэширование или плагины безопасности обновление статусов.

Пошаговое решение: автоматический возврат денег и изменение статуса заказа

1. Отслеживаем событие отклонённого платежа

WooCommerce не всегда автоматически меняет статус заказа при отклонении платежа, особенно если используется кастомный платежный шлюз. Для автоматизации используем хук woocommerce_order_status_failed, который срабатывает при смене статуса заказа на «неудачный».

2. Добавляем код для возврата денег и уведомления

Пример функции, которая выполняет возврат средств и меняет статус заказа на «отменён»:

add_action('woocommerce_order_status_failed', 'auto_refund_on_failed_payment');
function auto_refund_on_failed_payment($order_id) {
    if (!$order_id) return;
    $order = wc_get_order($order_id);
    if (!$order) return;

    // Проверяем, был ли уже возврат
    if ($order->get_refunds()) return;

    // Пытаемся создать возврат
    try {
        $refund = wc_create_refund(array(
            'amount'         => $order->get_total(),
            'reason'         => 'Отклонённый платёж — автоматический возврат',
            'order_id'       => $order_id,
            'refund_payment' => true,
        ));
        $order->update_status('cancelled', 'Автоматический возврат средств при отклонённом платеже.');
    } catch (Exception $e) {
        error_log('Ошибка при автоматическом возврате: ' . $e->getMessage());
    }
}

Этот код создаёт возврат средствами WooCommerce, если платеж отклонён, и меняет статус заказа на «отменён».

3. Настройка уведомлений клиенту и администратору

Для информирования добавьте в functions.php или плагин следующие хуки, чтобы отправить письмо при возврате:

add_action('woocommerce_order_refunded', 'notify_on_auto_refund', 10, 2);
function notify_on_auto_refund($order_id, $refund_id) {
    $order = wc_get_order($order_id);
    $mailer = WC()->mailer();
    $mails = $mailer->get_emails();
    if (!empty($mails['WC_Email_Customer_Refunded_Order'])) {
        $mails['WC_Email_Customer_Refunded_Order']->trigger($order_id, $refund_id);
    }
}

Проверка результата после внедрения

  • Создайте тестовый заказ и искусственно переведите его в статус «неудачный» (failed). Это можно сделать вручную или с помощью тестового платежного шлюза.
  • Проверьте, что возврат средств создан (в админке в заказе вкладка «Возвраты»).
  • Убедитесь, что статус заказа изменился на «отменён».
  • Проверьте почту клиента и администратора — должны прийти уведомления о возврате.
  • В логах ошибок WordPress и WooCommerce отсутствуют сообщения об ошибках возврата.

Частые ошибки и как исправить

  • Возврат не создаётся и появляется ошибка «Refund failed». Проверьте, поддерживает ли платежный шлюз автоматические возвраты через WooCommerce. Не все шлюзы позволяют API-возвраты. В этом случае возврат придётся делать вручную.
  • Статус заказа не меняется на «отменён». Убедитесь, что код не конфликтует с другими плагинами, которые могут перезаписывать статус. Попробуйте отключить сторонние плагины для теста.
  • Письма не отправляются. Проверьте настройки SMTP и почтового сервера WordPress. Также убедитесь, что хук woocommerce_order_refunded срабатывает.
  • Кэшировка мешает обновлению статуса. Отключите кэширование страниц для страниц админки и корзины.

Практические рекомендации по безопасности и производительности

  • Не храните данные кредитных карт на сервере, используйте только проверенные платёжные шлюзы.
  • Включите логирование ошибок WooCommerce для отслеживания сбоев возвратов.
  • При большом количестве заказов с возвратами настройте асинхронную обработку через WP-Cron или сторонние очереди.
  • Используйте child-тему или собственный плагин для добавления кода, чтобы не потерять изменения при обновлениях.

Сравнение решений для автоматического возврата при отклонённых платежах

МетодПримерПлюсыМинусы
Код на хуке woocommerce_order_status_failedПример вышеПолный контроль, работает с большинством шлюзов, бесплатное решениеЗависит от поддержки возвратов платежным шлюзом, требует навыков программирования
Плагин для управления возвратами (например, WooCommerce Smart Refunder)Готовое решение из репозиторияПростая настройка, поддержка разных шлюзовПлатные версии, ограниченная кастомизация
Ручное управление возвратамиАдминка WooCommerceБезопасно, без разработкиТрудозатратно, высокая вероятность ошибок
Автоматическое удаление спама в комментариях WordPress: практические решения и примеры
18.12.2025
Как создать автоматическое сохранение поста через AJAX в WordPress
14.01.2026
WooCommerce: автоматическое отключение товаров при отсутствии на складе с возможностью возврата
07.06.2026
Как удалить или изменить URL типа записи в WordPress без пересоздания
09.01.2026
WooCommerce: автоматическое отключение товаров при отсутствии на складе с возможностью возврата
13.06.2026