Диагностика проблемы с автопродлением подписок в WooCommerce
Многие магазины на WooCommerce используют подписки, но сталкиваются с проблемой некорректного автопродления: платежи не списываются автоматически, подписка отключается, а клиент теряет доступ. Причины бывают разные:
- Проблемы с обработкой вебхуков платежного шлюза;
- Неправильная настройка CRON-задач WordPress, отвечающих за продление;
- Ошибки в логике плагина WooCommerce Subscriptions или конфликт с другими плагинами;
- Сбои связи с API платежной системы.
Для начала нужно проверить логи вебхуков и CRON, а также убедиться, что платежные данные и токены пользователя актуальны.
Как проверить работу автопродления через вебхуки
Проверка включает 3 шага:
- Логи вебхуков платежного шлюза. В админке платежного плагина или на стороне платежной системы найдите раздел с вебхуками и смотрите последние вызовы. Статус 200 говорит о корректной доставке.
- WordPress CRON. Используйте плагин
WP Crontrolдля просмотра и запуска задач. Важно, чтобы задачи, связанные с подписками, выполнялись регулярно и без ошибок. - Логи WooCommerce Subscriptions. Проверьте, не выдает ли плагин ошибки в
wp-content/debug.logили в системных логах хостинга.
Пошаговое решение: настройка автопродления по вебхукам
1. Настройка приема вебхуков в WooCommerce
Добавьте в functions.php дочерней темы или в собственный плагин обработчик вебхуков:
add_action('woocommerce_api_subscription_webhook', 'handle_subscription_webhook');
function handle_subscription_webhook() {
$payload = file_get_contents('php://input');
$data = json_decode($payload, true);
if (empty($data['subscription_id']) || empty($data['status'])) {
status_header(400);
exit('Invalid payload');
}
$subscription_id = intval($data['subscription_id']);
$status = sanitize_text_field($data['status']);
$subscription = wcs_get_subscription($subscription_id);
if (!$subscription) {
status_header(404);
exit('Subscription not found');
}
if ($status === 'payment_success') {
$subscription->payment_complete();
status_header(200);
exit('Payment processed');
} elseif ($status === 'payment_failed') {
$subscription->update_status('on-hold');
status_header(200);
exit('Payment failed, subscription on hold');
}
status_header(400);
exit('Unhandled status');
}Этот код слушает POST-запросы по адресу https://example.com/wc-api/subscription_webhook. Поменяйте URL в настройках платежной системы на этот.
2. Проверка и настройка CRON для автопродления
WooCommerce Subscriptions использует CRON-задачи для проверки подписок и запуска платежей. Проверьте их с помощью WP Crontrol:
- Поищите задачи с хуками
woocommerce_scheduled_subscription_payment. - Запустите их вручную и посмотрите результат.
Если CRON не работает, настройте системный CRON хостинга для вызова wp-cron.php с периодичностью не реже 5 минут:
wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&13. Обновление и проверка платежных данных
Убедитесь, что токены платежей не просрочены. Для некоторых шлюзов (Stripe, PayPal) требуется периодическое обновление токенов. Если плагин WooCommerce Subscriptions не обновляет токены автоматически, настройте это вручную или через API платежной системы.
Проверка результата после внедрения
Чтобы убедиться, что автопродление работает корректно:
- Имитируйте оплату через тестовый платежный шлюз, чтобы вызвать вебхук с
payment_success. - Проверьте статус подписки в админке WooCommerce — он должен измениться на «Активна».
- Проверьте логи вебхуков и CRON — ошибок быть не должно.
- Попросите пользователя подтвердить, что доступ к сервису сохранён.
Частые ошибки и способы их исправления
- Вебхук не вызывается или возвращает 404. Проверьте правильность URL, отсутствие блокировок в .htaccess и на уровне сервера.
- CRON-задачи не выполняются. Убедитесь, что системный CRON настроен или используйте плагин WP Crontrol для ручного запуска.
- Токены платежных систем устарели. Проверьте актуальность токенов в настройках платежного плагина и обновите вручную.
- Конфликты плагинов. Отключите другие платежные и подписочные плагины, оставьте только WooCommerce и WooCommerce Subscriptions.
Практические советы по безопасности и производительности
- Проверяйте подпись вебхуков платежной системы, чтобы исключить подделку запросов.
- Используйте отдельный секретный URL для вебхуков, не совпадающий с другими REST-эндпоинтами.
- Минимизируйте время обработки вебхуков — асинхронно ставьте задачи на обновление подписок, чтобы не блокировать ответ.
- Регулярно проверяйте логи и настраивайте мониторинг ошибок CRON и вебхуков.
Сравнение вариантов реализации автопродления подписок
| Метод | Плюсы | Минусы | Пример использования |
|---|---|---|---|
| Вебхуки платежной системы | Мгновенное обновление статуса, высокая надежность | Сложность настройки, требуется проверка безопасности | Обработчик в functions.php, пример выше |
| Периодический CRON-процесс | Простота реализации, не зависит от внешних событий | Задержки в обновлении, нагрузка на сервер | WP Crontrol и системный CRON для запуска wp-cron.php |
| Комбинированный подход | Оптимальный баланс между скоростью и надежностью | Требует более сложной логики | Вебхук для моментального обновления + CRON для проверки отложенных платежей |