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Простота реализации, автоматизация без плагиновЗависит от поддержки платежного шлюза, риск ошибокТестировать на каждом шлюзе, добавить проверку ошибок
Ручной возврат через админкуМаксимальный контроль, подходит для сложных случаевТрудозатратно, не подходит для массовых отменИспользовать для исключительных случаев
Плагины автоматизации возвратовМогут поддерживать разные шлюзы и сценарииЗависимость от сторонних разработчиков, возможные конфликтыИспользовать проверенные плагины с поддержкой вашего шлюза
Как создать отзывы с оценкой в WordPress: подробный пример и код
20.02.2026
WooCommerce: как настроить отложенный возврат и отмену заказа через хуки
21.04.2026
Как создать автообновляемые KPI отчеты в WordPress с примерами и плагинами
28.02.2026
Автоматическое удаление старых записей в WordPress по дате
28.03.2026
Как добавить вывод данных из метаполя в WordPress теме
16.01.2026