接入文档
适用于 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 | 含义 | 怎么处理 |
|---|---|---|
| 0 | valid=true | 放行 |
| 2001 | 缺少参数 | 检查 license_key 与 domain 是否都传了 |
| 2009 | 校验服务不可达 | 用本地缓存兜底,3 天内继续放行 |
| 2103 | 授权码不存在 | 核对是否复制完整,或联系售后 |
| 2104 | 授权已过期 | 续费后重新校验 |
| 2105 | 域名不匹配 | 控制台里换绑域名,24 小时限一次 |
| 2106 | 授权被撤销 | 联系售后,通常是退款或违规 |
| 2107 | 尚未绑定域名 | 登录控制台绑定 |
常见问题
授权服务器挂了,我的站会挂吗?不会。缓存 6 小时 + 3 天宽限,足够撑到恢复。
能换域名吗?能,控制台里操作,24 小时内限一次,防止一个授权满世界跑。
能改源码吗?能。你买的是源码,改是你的权利。但改坏了我们只能按原版排查。
数据在哪?你的服务器上。我们看不到,也不想要。