PHP 怎么在线激活

wen PHP项目 2

本文目录导读:

PHP 怎么在线激活

  1. 基于密钥验证(最基础)
  2. 远程服务器激活(推荐)
  3. 离线激活(无需服务器)
  4. 加密授权文件(更安全)
  5. 完整示例:带登录验证的激活系统
  6. 注意事项:

在 PHP 中实现“在线激活”通常指的是软件授权验证功能,常见的实现方式有以下几种:

基于密钥验证(最基础)

<?php
// 生成有效许可证(服务器端)
function generateLicense($productKey, $username, $expireDays) {
    $secret = "YOUR_SECRET_KEY";
    $data = $productKey . $username . date('Y-m-d', strtotime("+$expireDays days"));
    return hash_hmac('sha256', $data, $secret);
}
// 验证许可证
function verifyLicense($license, $productKey, $username) {
    $secret = "YOUR_SECRET_KEY";
    $data = $productKey . $username . date('Y-m-d');
    $expected = hash_hmac('sha256', $data, $secret);
    // 清理过期许可证
    return hash_equals($expected, $license);
}

远程服务器激活(推荐)

客户端激活代码:

<?php
class LicenseActivator {
    private $serverUrl = 'https://your-server.com/api/activate.php';
    public function activate($serialKey, $domain) {
        $data = [
            'serial_key' => $serialKey,
            'domain' => $domain,
            'server_ip' => $_SERVER['SERVER_ADDR']
        ];
        $ch = curl_init();
        curl_setopt_array($ch, [
            CURLOPT_URL => $this->serverUrl,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_POST => true,
            CURLOPT_POSTFIELDS => http_build_query($data),
            CURLOPT_SSL_VERIFYPEER => false
        ]);
        $response = curl_exec($ch);
        curl_close($ch);
        $result = json_decode($response, true);
        if ($result['status'] === 'success') {
            // 存储激活信息
            $this->saveActivation($result['license']);
            return true;
        }
        return false;
    }
    private function saveActivation($license) {
        $config = "<?php return " . var_export([
            'license_key' => $license,
            'activation_date' => date('Y-m-d H:i:s'),
            'expire_date' => date('Y-m-d H:i:s', strtotime('+365 days'))
        ], true) . ";";
        file_put_contents('../config/license.php', $config);
    }
}

服务器端验证代码:

<?php
// /api/activate.php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $serialKey = $_POST['serial_key'];
    $domain = $_POST['domain'];
    $serverIp = $_SERVER['REMOTE_ADDR'];
    // 检查数据库中的序列号
    $db = new PDO('mysql:host=localhost;dbname=license_db', 'user', 'pass');
    $stmt = $db->prepare("SELECT * FROM licenses WHERE serial_key = ?");
    $stmt->execute([$serialKey]);
    $license = $stmt->fetch(PDO::FETCH_ASSOC);
    if ($license && $license['status'] == 'available') {
        // 生成激活码
        $activationCode = md5($serialKey . $serverIp . time());
        // 更新许可证状态
        $update = $db->prepare("UPDATE licenses SET 
            activation_code = ?, 
            domain = ?, 
            activated_ip = ?, 
            activated_at = NOW(),
            expire_at = DATE_ADD(NOW(), INTERVAL 365 DAY),
            status = 'activated' 
            WHERE id = ?");
        $update->execute([$activationCode, $domain, $serverIp, $license['id']]);
        echo json_encode([
            'status' => 'success',
            'license' => $activationCode,
            'expire_date' => date('Y-m-d', strtotime('+365 days'))
        ]);
    } else {
        echo json_encode(['status' => 'error', 'message' => 'Invalid or used license']);
    }
}

离线激活(无需服务器)

<?php
// 获取系统信息生成机器码
function getMachineCode() {
    $systemInfo = php_uname() . '/' . 
                  (isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '') . '/' .
                  gethostname();
    return md5($systemInfo);
}
// 激活验证(离线)
function verifyOfflineLicense($licenseFile) {
    if (!file_exists($licenseFile)) {
        return false;
    }
    $license = file_get_contents($licenseFile);
    $data = json_decode($license, true);
    // 验证机器码
    if ($data['machine_code'] !== getMachineCode()) {
        return false;
    }
    // 验证有效期
    if (strtotime($data['expire_date']) < time()) {
        return false;
    }
    return true;
}

加密授权文件(更安全)

<?php
// 生成激活文件
function generateLicenseFile($data) {
    $publicKey = file_get_contents('public.pem');
    // 使用公钥加密
    $encryptedData = null;
    openssl_public_encrypt($data, $encryptedData, $publicKey);
    return base64_encode($encryptedData);
}
// 验证激活文件(客户端)
function verifyEncryptedLicense($encryptedContent) {
    $privateKey = file_get_contents('private.pem');
    // 解密内容
    $decryptedData = null;
    openssl_private_decrypt(base64_decode($encryptedContent), $decryptedData, $privateKey);
    return unserialize($decryptedData);
}

完整示例:带登录验证的激活系统

<?php
class ActivationSystem {
    private $db;
    public function __construct() {
        // 数据库连接
        $this->db = new mysqli('host', 'user', 'pass', 'software_license');
    }
    // 注册并激活
    public function registerUser($username, $email, $password, $serialKey) {
        // 先注册用户
        $hashedPassword = password_hash($password, PASSWORD_BCRYPT);
        $this->db->query("INSERT INTO users (username, email, password, license_key) 
                         VALUES ('$username', '$email', '$hashedPassword', '$serialKey')");
        // 生成激活码
        $activationCode = bin2hex(random_bytes(16));
        $this->db->query("INSERT INTO activations 
                         (user_id, activation_code, created_at, is_active) 
                         VALUES (LAST_INSERT_ID(), '$activationCode', NOW(), 1)");
        // 发送激活邮件
        $this->sendActivationEmail($email, $activationCode);
        return true;
    }
    // 邮件发送函数
    private function sendActivationEmail($email, $code) {
        $subject = "软件激活";
        $message = "您的激活码:$code,请点击链接激活:https://yourdomain.com/activate.php?code=$code";
        mail($email, $subject, $message);
    }
    // 激活检测
    public function checkActivation() {
        session_start();
        if (isset($_SESSION['user_id'])) {
            $userId = $_SESSION['user_id'];
            $result = $this->db->query("SELECT * FROM activations WHERE user_id = $userId AND is_active = 1");
            return $result->num_rows > 0;
        }
        return false;
    }
}

注意事项:

  1. 安全性:永远不要在前端暴露密钥,使用HTTPS
  2. 防破解:结合混淆、加密、签名等多种技术
  3. 用户体验:提供离线激活选项
  4. 错误处理:清晰的错误提示
  5. 日志记录:记录所有激活操作

选择哪种方案取决于你的需求:

  • 简单授权:适合小项目,使用方案1或2
  • 商业软件:建议使用方案2+4,配合用户注册系统
  • 企业级:需要完整的授权服务器

我建议使用远程激活(方案2),因为它灵活、可维护性高,且易于控制授权数量。

抱歉,评论功能暂时关闭!