Диагностика проблемы с продлением подписок и SSL
Если в вашем WooCommerce установлен плагин WooCommerce Subscriptions, и вы сталкиваетесь с проблемами автоматического продления подписок, причиной могут быть ошибки SSL в API-запросах к серверу платежей или внутренним сервисам. Чаще всего это проявляется в логах как ошибка соединения SSL, таймауты или отказ в соединении.
Проверьте логи WooCommerce Subscriptions и серверные логи для ошибок по ключевым словам: SSL_connect, curl error, timeout, certificate verify failed.
Как проверить ошибки SSL в WooCommerce Subscriptions
- Перейдите в WooCommerce → Статус → Логи.
- Выберите логи с именем, содержащим "subscriptions" или "payment_gateway".
- Ищите строки с ошибками, связанными с SSL, например:
cURL error 60: SSL certificate problem: unable to get local issuer certificate.
Пошаговое решение проблемы SSL для автоматического продления
1. Проверка и обновление корневых сертификатов на сервере
Часто проблема связана с устаревшими корневыми сертификатами, из-за чего cURL не может проверить доверенность SSL-сертификата сервера платежей. Обновите пакет с корневыми сертификатами (ca-certificates) на сервере:
sudo apt update && sudo apt install --only-upgrade ca-certificatesДля CentOS/RHEL:
sudo yum update ca-certificates2. Принудительное указание пути к сертификатам в PHP cURL
Если обновление не помогает, в файле wp-config.php можно явно указать путь к файлу сертификатов:
define('CURLOPT_CAINFO', '/etc/ssl/certs/ca-bundle.crt');Или в коде, вызывающем cURL, добавить опцию:
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_CAINFO, '/etc/ssl/certs/ca-bundle.crt');3. Проверка URL-ов платежных шлюзов на HTTPS и отсутствие смешанного контента
В настройках WooCommerce Subscriptions убедитесь, что все URL-адреса API указаны с https://, а не с http://. Смешанный контент вызывает ошибки SSL.
4. Принудительное использование TLS 1.2+ в cURL для WooCommerce
Некоторые старые версии PHP/cURL могут использовать TLS 1.0, который не поддерживается современными шлюзами. Добавьте фильтр в functions.php для установки версии TLS:
add_action('http_api_curl', function($handle, $r, $url) {
curl_setopt($handle, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2);
}, 10, 3);Проверка результата после внедрения
- Повторите попытку продления подписки вручную в WooCommerce Subscriptions → Подписки → Выберите и нажмите "Продлить".
- Проверьте логи WooCommerce Subscriptions: ошибок SSL и таймаутов быть не должно.
- Выполните тестовый платеж через платежный шлюз, убедитесь, что он проходит без ошибок SSL.
Частые ошибки и как их исправить
- Ошибка "SSL certificate problem: unable to get local issuer certificate" — значит, на сервере устаревший пакет сертификатов. Обновите ca-certificates и перезапустите веб-сервер.
- Использование устаревшего PHP или cURL — обновите PHP до версии 7.4+ и cURL до последней стабильной, поддерживающей TLS 1.2+.
- URL платежного шлюза с http:// вместо https:// — исправьте адреса в настройках WooCommerce.
- Проблемы с прокси или файрволлом — убедитесь, что сервер может свободно соединяться с внешними API по HTTPS.
Практические советы по безопасности и производительности
- Используйте постоянное обновление сертификатов в системе и планируйте регулярное обновление PHP и cURL.
- При возможности используйте HTTP/2 с TLS для ускорения SSL-соединений.
- Отключайте в cURL проверки SSL только для тестирования, в продакшене это критично для безопасности.
- Мониторьте логи WooCommerce и сервера на предмет SSL-ошибок, автоматизируйте уведомления.
Сравнение подходов к решению SSL-проблем в WooCommerce Subscriptions
| Метод | Плюсы | Минусы | Рекомендуем для |
|---|---|---|---|
| Обновление ca-certificates | Простое, системное решение | Зависит от прав доступа к серверу | Большинство случаев |
| Фиксация пути к сертификатам в PHP | Гарантирует правильный путь для cURL | Требует ручной настройки | Если обновление не помогает |
| Принудительная TLS 1.2+ настройка | Обеспечивает совместимость с современными шлюзами | Может не работать на старых версиях PHP | Старые сервера, проблемы с TLS |
| Исправление URL шлюзов | Устраняет смешанный контент | Зависит от правильности настроек | Ошибки с http:// вместо https:// |