Для разработчиков WordPress плагинов, которые хотят полностью контролировать процесс лицензирования и активации своих продуктов, создание собственного лицензионного сервера — оптимальное решение. Это позволяет гибко управлять лицензиями, ограничениями, обновлениями и защитой от пиратства без зависимости от сторонних сервисов.
Основные задачи лицензионного сервера WordPress плагинов
Лицензионный сервер отвечает за несколько ключевых функций:
- Регистрацию новых лицензий и их активацию на сайтах клиентов;
- Проверку валидности лицензий при каждом запуске плагина;
- Ограничение количества активаций лицензии (по доменам, IP или пользователям);
- Обеспечение возможности отзыва лицензии или приостановки;
- Интеграцию с механизмом обновления плагина (обновления доступны только по активной лицензии).
Реализовать все это можно с помощью REST API на стороне сервера, а в плагине реализовать клиентскую часть для взаимодействия с API.
Создание REST API для лицензионного сервера на PHP
Ниже пример простой реализации REST API с базовыми методами регистрации, проверки и отзыва лицензии. В реальной системе стоит использовать базу данных для хранения лицензий и токенов.
<?php
// Простая реализация лицензионного сервера для WordPress плагинов
// Файл license-server.php
// Функция генерации уникальной лицензии
function wplicense_generate_license_key() {
return strtoupper(bin2hex(random_bytes(10)));
}
// Заглушка для базы лицензий
$licenses = [];
// Обработка запросов
$request = $_SERVER['REQUEST_METHOD'];
$action = $_GET['action'] ?? '';
header('Content-Type: application/json');
if ($request === 'POST' && $action === 'register') {
$data = json_decode(file_get_contents('php://input'), true);
$email = $data['email'] ?? '';
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
echo json_encode(['success' => false, 'message' => 'Неверный email']);
exit;
}
$license_key = wplicense_generate_license_key();
$licenses[$license_key] = ['email' => $email, 'active' => true, 'activations' => 0];
echo json_encode(['success' => true, 'license_key' => $license_key]);
} elseif ($request === 'POST' && $action === 'check') {
$data = json_decode(file_get_contents('php://input'), true);
$license_key = $data['license_key'] ?? '';
if (isset($licenses[$license_key]) && $licenses[$license_key]['active']) {
echo json_encode(['success' => true, 'valid' => true]);
} else {
echo json_encode(['success' => false, 'valid' => false]);
}
} elseif ($request === 'POST' && $action === 'revoke') {
$data = json_decode(file_get_contents('php://input'), true);
$license_key = $data['license_key'] ?? '';
if (isset($licenses[$license_key])) {
$licenses[$license_key]['active'] = false;
echo json_encode(['success' => true, 'message' => 'Лицензия отозвана']);
} else {
echo json_encode(['success' => false, 'message' => 'Лицензия не найдена']);
}
} else {
echo json_encode(['success' => false, 'message' => 'Неверный запрос']);
}
?>Это минимальный каркас, который можно расширять, добавляя проверку ограничений, хранение в базе MySQL, логирование и другие функции.
Встраивание проверки лицензии в WordPress плагин
Теперь реализуем функции для клиента плагина, которые будут обращаться к нашему лицензионному серверу. Ниже пример функции проверки лицензии с кэшированием результата для уменьшения количества запросов:
function wplicense_check_license_key($license_key) {
$cache_key = 'wplicense_license_check_' . md5($license_key);
$cached = get_transient($cache_key);
if ($cached !== false) {
return $cached;
}
$response = wp_remote_post('https://your-license-server.ru/license-server.php?action=check', [
'body' => json_encode(['license_key' => $license_key]),
'headers' => [
'Content-Type' => 'application/json'
]
]);
if (is_wp_error($response)) {
return false;
}
$body = json_decode(wp_remote_retrieve_body($response), true);
if (!empty($body['valid'])) {
set_transient($cache_key, true, 12 * HOUR_IN_SECONDS);
return true;
}
set_transient($cache_key, false, 12 * HOUR_IN_SECONDS);
return false;
}Используйте эту функцию в ключевых местах плагина — например, при инициализации, чтобы ограничить функциональность при невалидной лицензии.
Ограничение количества активаций и привязка к домену
Для предотвращения распространения лицензии на множество сайтов, можно добавить в лицензионный сервер привязку к домену при активации. Примерно так:
- При активации плагина клиент отправляет доменное имя;
- На сервере проверяется, что количество активаций не превышено;
- Если всё в порядке, домен сохраняется в базе для этой лицензии;
- При последующих проверках лицензии сверяется текущий домен с разрешённым.
Вот пример запроса на регистрацию активации с доменом:
$response = wp_remote_post('https://your-license-server.ru/license-server.php?action=activate', [
'body' => json_encode([
'license_key' => $license_key,
'domain' => $_SERVER['SERVER_NAME']
]),
'headers' => [
'Content-Type' => 'application/json'
]
]);На стороне сервера нужно реализовать логику проверки и сохранения доменов, а также ограничение по количеству активаций.
Пример хранения ограничений в базе данных
Для полноценного решения используйте MySQL таблицу с полями:
- license_key (varchar)
- email (varchar)
- active (bool)
- max_activations (int)
- domains (json или отдельная таблица)
- created_at, updated_at (timestamp)
Так можно гибко управлять лицензиями через административную панель или API.
Рекомендуемые плагины для управления лицензиями и безопасности
Если не хотите писать всё с нуля, можно использовать готовые решения и расширять их:
- Clearfy Pro — для оптимизации и защиты сайта, в том числе от нежелательных запросов;
- Expert Review — для управления отзывами и обратной связью, можно интегрировать с системой лицензий;
- WP REST API — встроенный в WordPress механизм для создания собственных REST API маршрутов, который можно использовать для создания серверной части лицензий, если лицензионный сервер тоже на WordPress.
Заключение
Создание собственного лицензионного сервера — сложный, но очень полезный шаг для разработчиков WordPress плагинов, которые хотят контролировать продажу и использование своих продуктов. В статье приведён базовый пример реализации сервера и клиентских функций, который можно развивать и масштабировать под свои задачи.