Зачем ограничивать количество активаций лицензий в WordPress плагинах
При продаже WordPress плагинов с лицензиями часто возникает необходимость ограничить количество сайтов, на которых пользователь может активировать лицензию. Это защита от распространения одного ключа на множество проектов без оплаты, что помогает сохранить доход и контролировать распространение продукта.
Ограничение активаций — это важный инструмент монетизации и защиты авторских прав разработчика.
В этой статье разберём, как реализовать такое ограничение самостоятельно и какие готовые решения можно использовать.
Основные подходы к ограничению количества активаций
Ограничение количества активаций лицензии обычно реализуется на серверной стороне, где хранится база данных с информацией о лицензиях и связанных с ними активированных доменах или сайтах.
При попытке активации плагина на новом сайте происходит запрос на сервер лицензирования. Сервер проверяет, сколько активаций уже использовано, и разрешает или запрещает активацию.
Основные варианты хранения информации:
- В собственной базе данных (MySQL, SQLite и др.)
- В облачных сервисах или API лицензирования
- Через сторонние сервисы лицензирования
Для WP плагинов часто используют REST API или AJAX запросы для проверки активации.
Пример реализации ограничения количества активаций: серверная часть
Представим, что у нас есть таблица wp_wplicense_activations, где хранятся записи с ключом лицензии и доменом активации.
Создадим функцию wplicense_check_activation_limit(), которая проверяет, не превышено ли максимальное количество активаций:
function wplicense_check_activation_limit($license_key, $max_activations = 3) {
global $wpdb;
$table = $wpdb->prefix . 'wplicense_activations';
// Получаем количество уникальных активаций для ключа
$count = $wpdb->get_var($wpdb->prepare(
"SELECT COUNT(DISTINCT domain) FROM $table WHERE license_key = %s",
$license_key
));
if ($count >= $max_activations) {
return false; // Превышен лимит
}
return true; // Можно активировать
}Эта функция возвращает true, если активацию можно разрешить, и false при превышении лимита.
Пример обработки запроса активации лицензии в REST API WordPress
Для взаимодействия с плагином удобно использовать REST API. Создадим эндпоинт, который будет принимать ключ лицензии и домен сайта, и возвращать статус активации.
add_action('rest_api_init', function () {
register_rest_route('wplicense/v1', '/activate', [
'methods' => 'POST',
'callback' => 'wplicense_activate_license',
'permission_callback' => '__return_true',
]);
});
function wplicense_activate_license(WP_REST_Request $request) {
$license_key = $request->get_param('license_key');
$domain = $request->get_param('domain');
if (empty($license_key) || empty($domain)) {
return new WP_REST_Response(['error' => 'missing_parameters'], 400);
}
if (!wplicense_check_activation_limit($license_key)) {
return new WP_REST_Response(['error' => 'activation_limit_reached'], 403);
}
// Добавляем новую активацию
global $wpdb;
$table = $wpdb->prefix . 'wplicense_activations';
// Проверяем, есть ли уже активация с этим доменом
$exists = $wpdb->get_var($wpdb->prepare(
"SELECT COUNT(*) FROM $table WHERE license_key = %s AND domain = %s",
$license_key, $domain
));
if (!$exists) {
$wpdb->insert($table, [
'license_key' => $license_key,
'domain' => $domain,
'activated_at' => current_time('mysql'),
]);
}
return new WP_REST_Response(['success' => true], 200);
}Такой подход позволяет централизованно контролировать активации, а клиентская часть плагина может отправлять запросы на данный API.
Пример клиентской части: запрос активации с плагина
Для отправки запроса на активацию можно использовать PHP-функцию wp_remote_post():
function wplicense_activate_remote($license_key) {
$domain = $_SERVER['SERVER_NAME'];
$response = wp_remote_post('https://wplicense.ru/wp-json/wplicense/v1/activate', [
'body' => [
'license_key' => $license_key,
'domain' => $domain,
]
]);
if (is_wp_error($response)) {
return false;
}
$data = json_decode(wp_remote_retrieve_body($response), true);
if (!empty($data['success'])) {
return true;
}
return false;
}Эту функцию можно вызвать при активации плагина, чтобы проверить и зарегистрировать активацию.
Готовые решения и плагины для управления лицензиями с ограничениями
Если хочется не строить систему с нуля, есть проверенные плагины и сервисы:
- Clearfy Pro — оптимизация и безопасность, включает модули для управления лицензиями и активациями;
- WPRemark — позволяет создавать сложные формы и интеграции, подходит для реализации системы активации;
- Сторонние сервисы лицензирования, например, Easy Digital Downloads с лицензиями, хотя они требуют интеграции с вашим сайтом.
Эти инструменты помогут сэкономить время и получить расширенный функционал — например, отчёты по активациям, автоматический отзыв, интеграция с WooCommerce.
Как учитывать отзыв лицензии и изменение домена активации
Одна из сложностей — что пользователь может сменить домен, удалить сайт или переносить лицензию. Нужно предусмотреть возможность отзыва лицензии с одного домена и повторной активации на другом.
Для этого реализуйте API-метод отзыва лицензии, который удалит запись с доменом из базы:
add_action('rest_api_init', function () {
register_rest_route('wplicense/v1', '/deactivate', [
'methods' => 'POST',
'callback' => 'wplicense_deactivate_license',
'permission_callback' => '__return_true',
]);
});
function wplicense_deactivate_license(WP_REST_Request $request) {
$license_key = $request->get_param('license_key');
$domain = $request->get_param('domain');
if (empty($license_key) || empty($domain)) {
return new WP_REST_Response(['error' => 'missing_parameters'], 400);
}
global $wpdb;
$table = $wpdb->prefix . 'wplicense_activations';
$deleted = $wpdb->delete($table, [
'license_key' => $license_key,
'domain' => $domain
]);
if ($deleted) {
return new WP_REST_Response(['success' => true], 200);
} else {
return new WP_REST_Response(['error' => 'not_found'], 404);
}
}Так пользователь сможет деактивировать лицензию на старом сайте и активировать на новом, не превышая лимит.
Рекомендации по безопасности и производительности
При реализации системы лицензирования важно обеспечить безопасность данных и устойчивость к взлому:
- Используйте проверку nonce и авторизацию для REST API, если возможно.
- Шифруйте и валидируйте все входящие данные.
- Минимизируйте количество запросов к базе данных.
- Реализуйте логирование попыток активации и ошибок для анализа.
Это поможет защитить вашу систему от злоумышленников и повысить стабильность работы.
Выводы и практические советы
Ограничение количества активаций лицензий — важный элемент системы защиты и монетизации WordPress плагинов. Его можно реализовать самостоятельно с помощью REST API и базы данных или использовать готовые решения.
Реализация должна учитывать возможность отзыва лицензий, смены доменов и обеспечивать безопасность.
Для ускорения разработки и удобства можно использовать плагины от WPSHOP, которые помогут в управлении лицензиями и активациями.