赞片CMSAPI开发

chinaz
chinaz 正式会员超兽战士
发布于 2026-10-07 05:46 ·1 浏览 ·0 回复

照着这篇做完,你能给赞片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&timestamp=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,跨域用白名单不用星号
版权声明:本文来自 GJ论坛《赞片CMSAPI开发》
原文链接:https://www.gj0.com/thread-103.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。

全部回复 0

还没有回复,来抢沙发~