В мире разработки WordPress плагинов очень важно обеспечить защиту своего продукта от нелегального использования. Один из эффективных способов — интегрировать систему проверки лицензий. В этой статье мы рассмотрим, как добавить проверку лицензии в WordPress плагин с нуля, используя собственный сервер лицензирования и простой пример кода.
Зачем нужна проверка лицензии в плагинах WordPress
Защита плагина лицензией позволяет контролировать количество активных установок, обновления и предотвращать распространение нелегальных копий. Это особенно важно для коммерческих плагинов, но и для бесплатных с ограниченным функционалом проверка лицензий помогает управлять доступом к дополнительным возможностям.
Проверка лицензии обычно происходит путем запроса к серверу лицензирования, который возвращает статус лицензии и разрешает или запрещает дальнейшую работу плагина.
Без встроенной проверки лицензии разработчик рискует потерять доход и контроль над распространением продукта.
Основные методы проверки лицензий в WordPress плагинах
Существует несколько подходов к внедрению проверки лицензий:
- Локальная проверка ключа — сравнение ключа с шаблоном или хэшом, не требующая подключения к серверу. Недостаток — низкая безопасность.
- Удаленная проверка через API — плагин отправляет запрос на сервер, который валидирует ключ и возвращает результат. Самый популярный и надежный метод.
- Интеграция с сервисами лицензирования — например, Easy Digital Downloads, WooCommerce Software Add-ons, которые предоставляют готовые решения для лицензирования и обновлений.
В этой статье мы рассмотрим реализацию удаленной проверки через собственный API.
Создаем простой сервер лицензий для проверки ключей
Для начала нам понадобится простой API на PHP, который будет принимать ключ и возвращать статус лицензии.
Пример кода для сервера лицензий:
<?php
// license-server.php
header('Content-Type: application/json');
$licenses = [
'ABC123-XYZ789' => 'valid',
'FREE-KEY-0000' => 'expired',
];
$key = $_GET['license_key'] ?? '';
if (array_key_exists($key, $licenses)) {
echo json_encode(['status' => $licenses[$key]]);
} else {
echo json_encode(['status' => 'invalid']);
}
?>Этот скрипт принимает параметр license_key через GET и возвращает JSON с полем status, указывающим состояние лицензии: valid, expired или invalid.
Интеграция проверки лицензии в плагин WordPress
Теперь добавим в плагин функцию для отправки запроса на сервер и обработки ответа.
В файле основного плагина добавим следующий код:
function wplicense_check_license_status($license_key) {
$api_url = 'https://wplicense.ru/license-server.php';
$response = wp_remote_get(add_query_arg('license_key', $license_key, $api_url), ['timeout' => 15]);
if (is_wp_error($response)) {
return 'error';
}
$body = wp_remote_retrieve_body($response);
$data = json_decode($body, true);
if (empty($data['status'])) {
return 'invalid';
}
return $data['status'];
}Эта функция отправляет GET-запрос с ключом лицензии на сервер и возвращает статус лицензии.
Автоматическая проверка при активации плагина
Чтобы проверять лицензию при активации плагина, добавим хук:
register_activation_hook(__FILE__, 'wplicense_activate_plugin');
function wplicense_activate_plugin() {
$license_key = get_option('wplicense_license_key');
if (!$license_key) {
deactivate_plugins(plugin_basename(__FILE__));
wp_die('Пожалуйста, введите лицензионный ключ перед активацией.');
}
$status = wplicense_check_license_status($license_key);
if ($status !== 'valid') {
deactivate_plugins(plugin_basename(__FILE__));
wp_die('Лицензионный ключ недействителен или просрочен.');
}
}Таким образом, плагин не активируется без корректного ключа.
Добавляем форму для ввода лицензии в админке
Для удобства пользователя добавим страницу настроек, где он сможет ввести лицензионный ключ.
add_action('admin_menu', 'wplicense_add_license_menu');
function wplicense_add_license_menu() {
add_options_page('Лицензия плагина', 'Лицензия плагина', 'manage_options', 'wplicense-license', 'wplicense_license_page');
}
function wplicense_license_page() {
if (isset($_POST['wplicense_license_key'])) {
check_admin_referer('wplicense_license_save', 'wplicense_license_nonce');
$license_key = sanitize_text_field($_POST['wplicense_license_key']);
update_option('wplicense_license_key', $license_key);
echo '<div class="updated">Ключ лицензии сохранен.</div>';
}
$license_key = get_option('wplicense_license_key', '');
echo '<form method="post" action="">';
wp_nonce_field('wplicense_license_save', 'wplicense_license_nonce');
echo '<label for="wplicense_license_key">Введите лицензионный ключ:</label><br>';
echo '<input type="text" name="wplicense_license_key" id="wplicense_license_key" value="' . esc_attr($license_key) . '" size="40" /><br>';
echo '<input type="submit" value="Сохранить" class="button button-primary" />';
echo '</form>';
}Эта страница в меню настроек позволяет пользователю легко управлять своим ключом.
Рекомендации по безопасности и производительности
При реализации проверки лицензий нужно учитывать несколько важных аспектов:
- Кэширование результата. Чтобы не делать запрос на сервер при каждом действии, стоит кэшировать статус лицензии, например, в
transientна 12 часов. - Обработка ошибок. В случае недоступности сервера лицензирования плагин может временно разрешать работу или уведомлять пользователя.
- Шифрование и проверка целостности. Для защиты ключей и данных можно использовать хэширование и SSL.
- Регулярные обновления. Следите за обновлениями безопасности и меняйте алгоритмы, чтобы предотвратить взлом.
Пример кеширования статуса лицензии
Улучшенная версия функции проверки с кешем:
function wplicense_check_license_status_cached($license_key) {
$cache_key = 'wplicense_license_status_' . md5($license_key);
$status = get_transient($cache_key);
if ($status !== false) {
return $status;
}
$status = wplicense_check_license_status($license_key);
if ($status !== 'error') {
set_transient($cache_key, $status, 12 * HOUR_IN_SECONDS);
}
return $status;
}Так мы уменьшаем нагрузку на сервер и ускоряем работу плагина.
Выводы и советы
Добавление проверки лицензии в WordPress плагин — обязательный этап для любого коммерческого или защищаемого продукта. Это помогает контролировать распространение, поддерживать обновления и получать обратную связь от пользователей.
Реализуя собственный сервер лицензирования, вы получаете полный контроль, но при этом берете на себя ответственность за безопасность и стабильность. Для простых плагинов подойдет базовая проверка с удаленным API, как показано в статье.
Если же вы хотите готовое решение с интеграцией обновлений, рассмотрите использование популярных сервисов лицензирования, таких как Easy Digital Downloads или Freemius.
Помните, что безопасность — это комплекс мер, включающий как технические, так и организационные подходы. Регулярно проверяйте работу системы, обновляйте и улучшайте алгоритмы.