Реалізація ліцензування програмного забезпечення через сайт

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.
Розробка та обслуговування будь-яких видів сайтів:
Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Пропоновані послуги
Показано 1 з 1 послугУсі 2065 послуг
Реалізація ліцензування програмного забезпечення через сайт
Складна
~1-2 тижні
Часті питання
Наші компетенції:
Етапи розробки
Останні роботи
  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    874
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851

Реалізація лицензування програмного забезпечення через сайт

Продаж ліцензій на ПО через сайт включає: генерацію лицензійних ключів після оплати, активацію й привязку до пристрою, перевірку ліцензії в застосунку, управління підписками й оновлення версій.

Моделі лицензування

Модель Опис Технічно
Perpetual Одноразова покупка версії Ключ без терміну, без онлайн-перевірки
Subscription Щомісячна/щорічна оплата JWT-токен з expiry, онлайн-валідація
Per-seat По кількості користувачів Лічильник активацій на ключ
Node-locked Привязка до конкретного пристрою HWID fingerprint

Генерація лицензійних ключів

class LicenseKeyGenerator
{
    private const CHARSET = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789';

    public function generate(int $segments = 5, int $segmentLength = 5): string
    {
        $key = '';
        for ($s = 0; $s < $segments; $s++) {
            for ($c = 0; $c < $segmentLength; $c++) {
                $key .= self::CHARSET[random_int(0, strlen(self::CHARSET) - 1)];
            }
            if ($s < $segments - 1) $key .= '-';
        }
        return $key;  // Приклад: A3K7M-XQ2WP-N8VLR-5HZTB-J4YCS
    }

    public function generateSigned(array $metadata): string
    {
        $base  = $this->generate();
        $hash  = substr(hash_hmac('sha256', $base . json_encode($metadata), config('app.key')), 0, 8);
        return $base . '-' . strtoupper($hash);
    }
}

API активації ліцензії

class LicenseController extends Controller
{
    public function activate(Request $request): JsonResponse
    {
        $key    = $request->input('license_key');
        $hwid   = $request->input('hardware_id');
        $appVersion = $request->input('app_version');

        $license = License::where('key', $key)->firstOrFail();

        if ($license->status !== 'active') {
            return response()->json(['error' => 'License is not active'], 403);
        }

        if ($license->expires_at && now()->isAfter($license->expires_at)) {
            return response()->json(['error' => 'License expired'], 403);
        }

        // Перевірка кількості активацій
        $activationCount = $license->activations()->where('revoked', false)->count();
        if ($activationCount >= $license->max_activations) {
            return response()->json(['error' => "Maximum activations ({$license->max_activations}) reached"], 403);
        }

        // Створюємо активацію
        $activation = $license->activations()->create([
            'hardware_id' => $hwid,
            'ip_address'  => $request->ip(),
            'app_version' => $appVersion,
            'activated_at'=> now(),
        ]);

        // Повертаємо JWT-токен ліцензії
        $token = JWT::encode([
            'iss'     => 'example.com',
            'sub'     => $license->id,
            'exp'     => $license->expires_at?->timestamp ?? PHP_INT_MAX,
            'hwid'    => $hwid,
            'product' => $license->product_code,
            'plan'    => $license->plan,
        ], config('app.license_secret'), 'HS256');

        return response()->json(['token' => $token, 'expires_at' => $license->expires_at]);
    }
}

Онлайн-валідація ліцензії в приложенні

# У Python-приложенні при кожному запуску
import jwt
import requests
from datetime import datetime

class LicenseValidator:
    def __init__(self, license_key: str, hw_id: str):
        self.license_key = license_key
        self.hw_id       = hw_id
        self.token_cache_file = '.license_cache'

    def validate(self) -> bool:
        # Спочатку перевіряємо кешований токен
        cached = self._load_cached_token()
        if cached and self._verify_token(cached):
            return True

        # Онлайн-активація
        try:
            resp = requests.post('https://api.example.com/v1/licenses/activate', {
                'license_key': self.license_key,
                'hardware_id': self.hw_id,
            }, timeout=5)

            if resp.status_code == 200:
                token = resp.json()['token']
                self._cache_token(token)
                return self._verify_token(token)
        except requests.exceptions.RequestException:
            # Офлайн-режим: використовуємо кеш
            return cached is not None

        return False

    def _verify_token(self, token: str) -> bool:
        try:
            payload = jwt.decode(token, LICENSE_PUBLIC_KEY, algorithms=['RS256'])
            return payload.get('hwid') == self.hw_id
        except jwt.ExpiredSignatureError:
            return False
        except jwt.InvalidTokenError:
            return False

Інтеграція з платіжною системою

// Webhook при успішній оплаті
class HandleSuccessfulPayment
{
    public function handle(PaymentSucceeded $event): void
    {
        $order   = $event->order;
        $product = $order->product;

        for ($i = 0; $i < $order->quantity; $i++) {
            License::create([
                'order_id'        => $order->id,
                'product_code'    => $product->code,
                'key'             => app(LicenseKeyGenerator::class)->generateSigned(['product' => $product->code]),
                'plan'            => $order->plan,
                'max_activations' => $product->max_activations,
                'expires_at'      => $product->subscription_period
                    ? now()->add($product->subscription_period)
                    : null,
                'status'          => 'active',
            ]);
        }

        Mail::to($order->customer_email)->send(new LicenseKeysMail($order));
    }
}

Сроки

Система лицензування з генерацією ключів, активацією та API-валідацією: 12–16 робочих днів.