LinkPilotv0.1

接入文档

适用于 v0.1。部署前请确认 Node 版本不低于 22.5。

安装

解压到任意目录,复制配置文件,改三个值:站点地址、管理员密码、授权码。

cd /www/wwwroot/lp
cp .env.example .env
vim .env

SITE_URL=https://lp.example.com
ADMIN_PASSWORD=<一个够长的密码>
LICENSE_KEY=XXXXX-XXXXX-XXXXX-XXXXX

首次启动会自动建库、建表、写入初始套餐。不需要手动跑 SQL。

Nginx 反代

短链域名建议和主站分开,否则 :slug 路由会跟主站冲突。

server {
    listen 443 ssl http2;
    server_name lp.example.com;
    ssl_certificate     /path/fullchain.pem;
    ssl_certificate_key /path/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:3100;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

授权校验

每个请求都会经过一次校验的话,你的站会被拖慢,我们的接口也会被打爆。 正确做法是缓存 recheck_after,到期再查。下面是 PHP 版本,Node 版本在压缩包里。

<?php
// 放进项目里最早执行的地方,比如 index.php 第 3 行
define('LP_KEY', '7K3MQ-PX9RT-2WFHD-K8NVB');
define('LP_CACHE', __DIR__ . '/runtime/license.json');

function lp_check() {
    $cache = is_file(LP_CACHE) ? json_decode(file_get_contents(LP_CACHE), true) : null;
    $now = time();
    // 缓存还没到期就直接放行,不用每次都请求
    if ($cache && isset($cache['recheck_after']) && $now < strtotime($cache['recheck_after']) && $cache['valid']) {
        return $cache;
    }

    $url = 'https://' . LP_HOST . '/api/license/verify?' . http_build_query([
        'license_key' => LP_KEY,
        'domain'      => $_SERVER['HTTP_HOST'] ?? '',
    ]);
    $ctx = stream_context_create(['http' => ['timeout' => 5, 'ignore_errors' => true]]);
    $raw = @file_get_contents($url, false, $ctx);
    $res = $raw ? json_decode($raw, true) : null;

    if ($res && !empty($res['valid'])) {
        @mkdir(dirname(LP_CACHE), 0755, true);
        file_put_contents(LP_CACHE, json_encode($res));
        return $res;
    }

    // 网络抖动:旧缓存 3 天内继续用,别为了查授权把站搞挂
    if (!$res && $cache && $now - filemtime(LP_CACHE) < 259200) {
        return $cache;
    }
    return $res ?: ['valid' => false, 'code' => 2009, 'message' => '授权校验服务不可达'];
}

注意最后那个兜底分支:网络不通时用 3 天内的旧缓存继续放行。宁可短暂超期,也不要因为授权服务抖动把自己的站搞挂。

API

GET /api/license/verify

参数必填说明
license_key是授权码,控制台里复制
domain是当前站点域名,不带协议和路径
curl -s "https://lp.fulkteam.cn/api/license/verify?license_key=7K3MQ-PX9RT-2WFHD-K8NVB&domain=shop.example.com"

# 正常返回
{
  "valid": true,
  "code": 0,
  "plan": "pro",
  "domain": "shop.example.com",
  "expires_at": "2027-11-07T00:00:00.000Z",
  "recheck_after": "2026-11-07T09:00:00.000Z",
  "sig": "9f2c1a0b7e4d..."
}

sig 是对 license_key|domain|expires_at|checked_at 的 HMAC-SHA256 前 32 位。 如果你的场景对中间人攻击敏感,可以在客户端再验一次。

错误码

code含义怎么处理
0valid=true放行
2001缺少参数检查 license_key 与 domain 是否都传了
2009校验服务不可达用本地缓存兜底,3 天内继续放行
2103授权码不存在核对是否复制完整,或联系售后
2104授权已过期续费后重新校验
2105域名不匹配控制台里换绑域名,24 小时限一次
2106授权被撤销联系售后,通常是退款或违规
2107尚未绑定域名登录控制台绑定

常见问题

授权服务器挂了,我的站会挂吗?不会。缓存 6 小时 + 3 天宽限,足够撑到恢复。

能换域名吗?能,控制台里操作,24 小时内限一次,防止一个授权满世界跑。

能改源码吗?能。你买的是源码,改是你的权利。但改坏了我们只能按原版排查。

数据在哪?你的服务器上。我们看不到,也不想要。