WooCommerce: автоматическое возврат средств при отмене заказа через хуки

Проблема: как автоматически вернуть деньги клиенту при отмене заказа в WooCommerce

В стандартном WooCommerce возврат средств при отмене заказа обычно выполняется вручную через админку. При большом количестве заказов или частых отменах это неудобно и неэффективно. Автоматизация возврата позволит экономить время и снизить риск ошибок.

Диагностика текущего процесса возврата

Перед автоматизацией убедитесь, что возврат средств возможен для вашего способа оплаты и настроек WooCommerce:

  • Проверьте, поддерживает ли платежный шлюз автоматические возвраты через API.
  • Убедитесь, что статус заказов корректно меняется на отменённый (cancelled) или возврат (refunded).
  • Проверьте, что функция возврата средств работает вручную без ошибок в WooCommerce.

Для отладки используйте логи WooCommerce (WooCommerce > Статус > Логи) и включите WP_DEBUG в wp-config.php.

Пошаговое решение: автоматизация возврата средств при отмене заказа

Для автоматизации воспользуемся хуком woocommerce_order_status_cancelled, который срабатывает при смене статуса заказа на «Отменён». В функции обработчике попробуем выполнить возврат средств через встроенный метод refund объекта заказа.

add_action('woocommerce_order_status_cancelled', 'auto_refund_on_cancelled_order', 10, 1);  
function auto_refund_on_cancelled_order($order_id) {
    if (!$order_id) return;
    $order = wc_get_order($order_id);
    if (!$order) return;

    // Проверяем, есть ли оплата и можно ли вернуть
    if ($order->get_total_refunded() >= $order->get_total()) {
        // Уже полностью возвращено
        return;
    }

    // Создаём возврат
    $refund = wc_create_refund(array(
        'amount'     => $order->get_total() - $order->get_total_refunded(),
        'reason'     => 'Автоматический возврат при отмене заказа',
        'order_id'   => $order_id,
        'refund_payment' => true,
    ));

    if (is_wp_error($refund)) {
        error_log('Ошибка автоматического возврата для заказа ' . $order_id . ': ' . $refund->get_error_message());
    }
}

Обратите внимание, что параметр refund_payment => true инициирует возврат через платежный шлюз, если он поддерживает эту функцию.

Альтернативный хук для возврата средств

Если вам нужно запускать возврат при смене другого статуса, например, при переходе в статус refunded, используйте woocommerce_order_status_changed:

add_action('woocommerce_order_status_changed', 'refund_on_status_refunded', 10, 4);
function refund_on_status_refunded($order_id, $old_status, $new_status, $order) {
    if ($new_status !== 'refunded') return;
    // Аналогичный код возврата средств
}

Как проверить, что автоматический возврат сработал

  • Создайте тестовый заказ с тестовой оплатой (например, платежный шлюз Sandbox).
  • Измените статус заказа на отменённый вручную или через код.
  • Проверьте в админке WooCommerce вкладку возвратов (Refunds) — должен появиться новый возврат.
  • Посмотрите логи WooCommerce и error_log на наличие ошибок.
  • Проверьте состояние платежа в платежном шлюзе (если поддерживается).

Частые ошибки и их исправление

  • Возврат не создаётся, нет ошибок: возможно, платежный шлюз не поддерживает автоматические возвраты. Проверьте документацию или используйте другой способ.
  • Возврат создаётся, но деньги не возвращаются: возврат через API платежной системы не прошёл. Проверьте настройки платежного шлюза и логи.
  • Дублирование возвратов: функция срабатывает несколько раз. Добавьте проверку, что сумма возврата не превышает сумму заказа ($order->get_total_refunded() < $order->get_total()).
  • Ошибка прав доступа: убедитесь, что код выполняется в правильном контексте, и пользователь имеет права для выполнения возврата.

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

  • Всегда тестируйте автоматические возвраты на тестовой среде с тестовыми платежными данными.
  • Логи ошибок должны быть включены и доступны для анализа, но не выводиться пользователям.
  • Не используйте автоматический возврат для заказов, которые требуют ручной проверки (например, при подозрении на мошенничество).
  • Добавьте ограничение по времени — например, автоматический возврат только для заказов отменённых в течение 24 часов.

Сравнение вариантов реализации автоматического возврата

МетодПреимуществаНедостаткиКомпромисс
Автоматический возврат через хук woocommerce_order_status_cancelledПростота реализации, автоматизация без плагиновЗависит от поддержки платежного шлюза, риск ошибокТестировать на каждом шлюзе, добавить проверку ошибок
Ручной возврат через админкуМаксимальный контроль, подходит для сложных случаевТрудозатратно, не подходит для массовых отменИспользовать для исключительных случаев
Плагины автоматизации возвратовМогут поддерживать разные шлюзы и сценарииЗависимость от сторонних разработчиков, возможные конфликтыИспользовать проверенные плагины с поддержкой вашего шлюза
WooCommerce: автоматическое добавление товара в корзину при открытии страницы
26.07.2026
Как создать отзывы с оценкой в WordPress: подробный пример и код
20.02.2026
Как скрыть пустые категории WooCommerce в магазине без поломки меню и SEO
12.08.2026
Как удалить или изменить параметры URL в WordPress без редиректа
03.02.2026
Как создать список задач с отметкой выполнено в WordPress с примером кода
04.04.2026