赞片CMSAPI开发
照着这篇做完,你能给赞片CMS挂上一个自己的 API 接口:外部程序用带签名的请求就能拿到影片列表和详情数据,并且知道出错了去哪儿看日志。
第一步:确认版本、目录结构和 PHP 版本
这一步的目标是搞清楚你的赞片CMS放在哪、跑在什么环境上,后面所有路径都以此为准。
登录宝塔面板(7.7 或 8.0 版),左侧点「网站」,找到你的站点,点右侧「根目录」进入文件管理。赞片CMS的典型目录长这样:
/api/或/api.php—— 对外接口入口,我们要在这里加东西/application/或/app/—— 框架业务代码/config/或/application/database.php—— 数据库配置/template/—— 模板目录,跟接口无关
再确认 PHP 版本:宝塔左侧「软件商店」→ 已安装 → 找到 PHP,点「设置」看版本。赞片CMS主流版本跑在 PHP 7.2–7.4 上,如果你装的是 PHP 8.x,先切回 7.4,否则老代码里的 each()、动态属性这些会直接报错。
注意:不要动
/api.php这类入口文件的原有代码,新建独立文件最安全。升级CMS时不会被覆盖。
第二步:写一个最小可用的接口文件
这一步要得到一个能返回 JSON 的接口,先不接数据库。
在站点根目录的 /api/ 下新建目录 v1,再新建文件 test.php,内容:
<?php
header('Content-Type: application/json; charset=utf-8');
echo json_encode(['code' => 0, 'msg' => 'ok'], JSON_UNESCAPED_UNICODE);
浏览器访问 https://你的域名/api/v1/test.php,看到 {"code":0,"msg":"ok"} 就通了。
注意:如果访问是 404,先检查宝塔「网站」→「配置文件」里有没有把
/api目录排除在伪静态规则之外。伪静态把请求全转发给 index.php 时,真实存在的 .php 文件也可能被拦截。
第三步:连接数据库读取影片数据
这一步让接口真的能吐出影片列表。
打开 /config/database.php(ThinkPHP 结构的在 /application/database.php),记下四个值:hostname、database、username、password,以及 prefix(表前缀,赞片CMS常见为 zanpian_)。影片主表一般是 vod,完整表名就是 zanpian_vod。
在 test.php 里改成:
<?php
header('Content-Type: application/json; charset=utf-8');
$pdo = new PDO('mysql:host=127.0.0.1;dbname=你的库名;charset=utf8mb4', '用户名', '密码');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$rows = $pdo->query('SELECT vod_id, vod_name, vod_pic FROM zanpian_vod WHERE vod_status=1 ORDER BY vod_id DESC LIMIT 20')->fetchAll(PDO::FETCH_ASSOC);
echo json_encode(['code' => 0, 'data' => $rows], JSON_UNESCAPED_UNICODE);
刷新浏览器,应该能看到 20 条影片。
注意:字段名各版本可能不同,先执行
DESCRIBE zanpian_vod;看清真实字段,别照抄。生产环境建议单独建一个只读数据库账号,别用 root。
第四步:加参数分发和输入校验
这一步让接口支持翻页、按分类筛选,并挡住非法输入。
$ac = $_GET['ac'] ?? 'list';
$pg = max(1, intval($_GET['pg'] ?? 1));
$limit = min(50, max(1, intval($_GET['limit'] ?? 20)));
$offset = ($pg - 1) * $limit;
if ($ac === 'list') {
$stmt = $pdo->prepare('SELECT vod_id, vod_name FROM zanpian_vod WHERE vod_status=1 ORDER BY vod_id DESC LIMIT :l OFFSET :o');
$stmt->bindValue(':l', $limit, PDO::PARAM_INT);
$stmt->bindValue(':o', $offset, PDO::PARAM_INT);
$stmt->execute();
echo json_encode(['code'=>0,'data'=>$stmt->fetchAll(PDO::FETCH_ASSOC)], JSON_UNESCAPED_UNICODE);
} elseif ($ac === 'detail') {
// 按 vod_id 查详情
$id = intval($_GET['id'] ?? 0);
$stmt = $pdo->prepare('SELECT * FROM zanpian_vod WHERE vod_id = ?');
$stmt->execute([$id]);
echo json_encode(['code'=>0,'data'=>$stmt->fetch(PDO::FETCH_ASSOC)], JSON_UNESCAPED_UNICODE);
} else {
echo json_encode(['code'=>400,'msg'=>'不支持的 ac 参数'], JSON_UNESCAPED_UNICODE);
}
关键点是用 prepare + 占位符,别把 $_GET 直接拼进 SQL,否则一个 ?id=1 OR 1=1 就能把全库拖走。
第五步:加签名鉴权
这一步防止接口被随意盗刷。
约定:请求方带上 appkey、timestamp、sign 三个参数,sign = md5(appkey + timestamp + secret),secret 只有服务端和调用方知道。
$secret = '换成一段32位随机串';
$appkey = $_GET['appkey'] ?? '';
$ts = intval($_GET['timestamp'] ?? 0);
$sign = $_GET['sign'] ?? '';
if (abs(time() - $ts) > 300) { exit(json_encode(['code'=>401,'msg'=>'时间戳过期'])); }
if (md5($appkey . $ts . $secret) !== $sign) { exit(json_encode(['code'=>403,'msg'=>'签名错误'])); }
时间戳容差设 5 分钟,能挡掉大部分重放攻击。
第六步:联调与排错
用 curl 在服务器上测:
curl "https://你的域名/api/v1/test.php?ac=list&pg=1&limit=5&appkey=test×tamp=1700000000&sign=xxx"
接口返回 500 时别看浏览器,去宝塔「网站」→「日志」看错误日志,路径一般是 /www/wwwlogs/你的域名.error.log。最常见的三个原因:PHP 版本不对、数据库账号密码写错、PDO 扩展没装(宝塔「软件商店」→ PHP 设置 → 安装扩展 → 勾选 pdo_mysql)。
前端跨域调用时,在文件最上方加:
header('Access-Control-Allow-Origin: https://你的前端域名');
不要图省事写 *,配合签名鉴权一起用才安全。
小结
- 先确认 CMS 版本、PHP 版本(7.2–7.4)、表前缀,再动手写代码
- 接口文件放
/api/v1/独立目录,不动 CMS 原有入口文件 - 数据库操作一律用 PDO 预处理,参数做 intval 和范围限制
- 鉴权用 appkey + timestamp + md5 签名,时间戳容差 5 分钟
- 报错查
/www/wwwlogs/域名.error.log,跨域用白名单不用星号
原文链接:https://www.gj0.com/thread-103.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。