WooCommerce: автоматическое отключение подписок при неуплаченных платежах

Диагностика проблемы: почему подписки не отключаются при неуплате

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

  • Отсутствие корректного отслеживания статуса платежа от платежного шлюза.
  • Не настроены хуки для обработки событий неудачных платежей.
  • Кэширование или задержки в обновлении статуса подписки.
  • Конфликты с другими плагинами, влияющими на статус заказа или подписки.

Для начала нужно выяснить, как именно ваша платежная система сообщает о неудачном платеже, и как WooCommerce Subscriptions получает и обрабатывает эту информацию.

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

1. Проверяем подключение и обработку статусов заказов

WooCommerce Subscriptions меняет статус подписки в зависимости от статуса заказа. При неудачной оплате заказ получает статус failed или cancelled. Убедитесь, что эти статусы корректно устанавливаются.

2. Добавляем обработчик для автоматического отключения подписок

Добавьте следующий код в файл functions.php вашей темы или в собственный плагин:

add_action('woocommerce_order_status_failed', 'wc_disable_subscription_on_failed_payment', 10, 1);

function wc_disable_subscription_on_failed_payment($order_id) {
    if (!$order_id) return;
    $order = wc_get_order($order_id);
    if (!$order) return;

    // Получаем все подписки, связанные с этим заказом
    $subscriptions = wcs_get_subscriptions_for_order($order_id);

    foreach ($subscriptions as $subscription) {
        // Проверяем, что подписка активна
        if ($subscription->has_status('active')) {
            // Отменяем подписку
            $subscription->update_status('cancelled', 'Автоматическое отключение из-за неуплаты');
        }
    }
}

Этот код слушает событие смены статуса заказа на failed и отменяет соответствующие активные подписки.

3. Настройте webhook/уведомления платежного шлюза

Убедитесь, что ваш платежный шлюз отправляет уведомления о неудачных платежах и WooCommerce корректно меняет статус заказа. Например, для PayPal IPN или Stripe Webhook нужно проверить, что они настроены правильно и обрабатываются системой.

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

  • Создайте тестовый заказ с подпиской и оплатите.
  • Имитируйте неудачный платеж (например, отмените платеж на стороне шлюза или используйте тестовый режим).
  • Убедитесь, что заказ меняет статус на failed.
  • Проверьте в админке WooCommerce Subscriptions, что подписка автоматически перешла в статус cancelled.
  • При необходимости посмотрите логи WooCommerce и платежного шлюза для подтверждения последовательности событий.

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

  • Заказы не получают статус failed — проверьте настройки webhook платежного шлюза и убедитесь, что WooCommerce правильно обрабатывает уведомления.
  • Функция wcs_get_subscriptions_for_order() не доступна — убедитесь, что плагин WooCommerce Subscriptions активен и загружен до выполнения вашего кода.
  • Подписка не меняет статус — проверьте, что подписка была действительно связана с заказом, и что статус был active. Можно добавить логирование внутри функции для отладки.
  • Конфликты с другими плагинами — временно отключите сторонние плагины, влияющие на обработку заказов и подписок, и проверьте работу скрипта.

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

  • Используйте безопасное хранение webhook-ключей и проверяйте подписи уведомлений, чтобы избежать подделки статусов платежей.
  • Минимизируйте обработку в хуках, если требуется сложная логика — лучше использовать очереди или CRON для отложенной обработки.
  • Логируйте события в отдельный файл для мониторинга проблем с платежами и отработкой подписок.
  • Проводите нагрузочное тестирование при большом количестве подписок, чтобы убедиться, что автоматизация не замедляет работу сайта.

Таблица сравнения вариантов решения

МетодПлюсыМинусыКогда использовать
Обработка статуса заказа на failed с отменой подпискиПростая реализация, нативные хуки WooCommerceЗависит от корректной работы webhook платежного шлюзаДля большинства стандартных платежных систем
Использование CRON для периодической проверки неоплаченных подписокНезависимость от статусов webhook, можно обработать отложенные платежиЗадержка в обработке, усложнение кодаЕсли webhook ненадежны или платежи обрабатываются с задержкой
Внедрение сторонних плагинов для управления подпискамиГотовые решения с расширенными настройкамиДополнительная нагрузка, зависимость от плагинаЕсли нужны расширенные функции и вы не хотите писать код
WooCommerce: как настроить обязательную 3D Secure авторизацию платежей
04.05.2026
Как оптимизировать базы данных в WordPress для ускорения сайта
21.11.2025
Как создать проверку и валидацию платежей в WordPress
17.03.2026
WooCommerce: изменение статуса заказа после подтверждения платежа
01.06.2026
WooCommerce: автоматическая отмена незавершённых платежей
05.06.2026