Диагностика проблем с лицензиями при комплексных подписках WooCommerce
При использовании WooCommerce Subscriptions для продажи лицензий часто возникают сложности с управлением активациями и обновлением лицензий при смене статуса подписки или при продлении. Основные симптомы:
- Лицензии не активируются автоматически после оплаты подписки.
- Отсутствие корректного отзыва лицензии при отмене подписки.
- Проблемы с обновлением срока действия лицензии при продлении подписки.
- Несовпадение данных лицензии и статуса подписки в базе.
Чтобы точно определить проблему, проверьте следующие моменты:
- Настроена ли интеграция между WooCommerce Subscriptions и системой лицензий (например, через хуки или API).
- Обрабатываются ли события смены статуса подписки (activated, cancelled, expired и т.д.).
- Лицензионный ключ генерируется и сохраняется корректно в метаданных заказа или пользователя.
Пошаговое решение: автоматизация активации и отзыва лицензий
1. Отслеживание смены статуса подписки
Для корректного управления лицензиями важно реагировать на события смены статуса подписки. WooCommerce Subscriptions предоставляет хук woocommerce_subscription_status_updated, который принимает параметры: объект подписки, новый статус, старый статус.
add_action('woocommerce_subscription_status_updated', 'sync_license_with_subscription', 10, 3);function sync_license_with_subscription($subscription, $new_status, $old_status) { $user_id = $subscription->get_user_id(); $license_key = get_user_meta($user_id, '_license_key', true); if (!$license_key) { // Генерируем лицензию при первом активации }2. Генерация лицензионного ключа при оформлении подписки
Рекомендуется создавать лицензию сразу при первом успешном заказе подписки и сохранять ключ в мета пользователя или заказа. Пример генерации ключа:
function generate_license_key($length = 16) { return strtoupper(substr(bin2hex(random_bytes($length)), 0, $length));}add_action('woocommerce_checkout_order_processed', 'create_license_on_checkout', 20, 1);function create_license_on_checkout($order_id) { $order = wc_get_order($order_id); foreach ($order->get_items() as $item) { $product = $item->get_product(); if ($product && wcs_is_subscription($product)) { $user_id = $order->get_user_id(); $license_key = generate_license_key(); update_user_meta($user_id, '_license_key', $license_key); // Можно сохранить и в мета заказа для контроля $order->update_meta_data('_license_key', $license_key); $order->save(); } }}3. Активация и отзыв лицензии в зависимости от статуса подписки
На изменение статуса подписки автоматически вызываем функции активации или деактивации лицензии. Пример:
function sync_license_with_subscription($subscription, $new_status, $old_status) { $user_id = $subscription->get_user_id(); $license_key = get_user_meta($user_id, '_license_key', true); if (!$license_key) { return; // Лицензия не найдена, ничего не делаем } switch ($new_status) { case 'active': activate_license($license_key, $user_id); break; case 'cancelled': case 'expired': case 'on-hold': deactivate_license($license_key, $user_id); break; }}function activate_license($key, $user_id) { // Логика активации, например запрос к лицензионному серверу update_user_meta($user_id, '_license_status', 'active');}function deactivate_license($key, $user_id) { // Логика отзыва лицензии update_user_meta($user_id, '_license_status', 'inactive');}Проверка результата после внедрения
Для контроля корректности работы лицензий:
- Создайте тестовую подписку и оплатите ее.
- Проверьте, что для пользователя сгенерирован и сохранен лицензионный ключ в мета.
- Убедитесь, что статус лицензии отображается как
activeпосле активации подписки. - Отмените подписку и проверьте, что лицензия автоматически деактивируется.
- Продлите подписку и убедитесь, что лицензия остается активной и обновляется по срокам.
Частые ошибки и способы их исправления
- Лицензия не генерируется при первом заказе подписки. Проверьте, что хук
woocommerce_checkout_order_processedподключен корректно и условиеwcs_is_subscription()правильно определяет подписочные продукты. - Статус лицензии не меняется при смене статуса подписки. Проверьте, что хук
woocommerce_subscription_status_updatedвызывается и в функцииsync_license_with_subscriptionнет фатальных ошибок. - Лицензионный ключ не сохраняется или теряется между сессиями. Используйте надежное сохранение в
user_metaилиorder_meta, избегайте временных данных. - Автоматическое продление не обновляет срок лицензии. Добавьте обработку статуса
renewalи обновление даты окончания лицензии в функции активации.
Практические советы по безопасности и производительности
- Не храните лицензионные ключи в открытом виде в базе без шифрования. Используйте wp_hash или другие методы шифрования.
- Ограничьте число одновременных активаций лицензии по пользователям для предотвращения пиратства.
- Используйте WP-Cron для периодической проверки статусов подписок и лицензий, чтобы автоматически синхронизировать данные.
- Кэшируйте результаты запросов к лицензионному серверу, чтобы снизить нагрузку.
Сравнение подходов к управлению лицензиями в WooCommerce Subscriptions
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Ручная активация ключей | Пользователь получает лицензию после оплаты, активация вручную | Простой в реализации | Риск ошибок, неавтоматичность |
| Автоматическая активация через хуки | Использование хуков WooCommerce Subscriptions для автоматизации | Гибкость, автоматизация | Сложнее в настройке, требует тестирования |
| Плагин лицензирования с интеграцией | Использование специализированных плагинов для управления лицензиями | Много функций «из коробки» | Зависимость от стороннего кода, меньшая гибкость |