全网去水印系统
一套开箱即用的短视频 / 图集去水印解析站点,支持 20+个主流平台的无水印视频与图集解析,内置会员套餐、在线支付、余额系统、后台管理与数据库备份恢复,前后台界面完善,可直接上线运营。
- 技术栈:纯 PHP 8.0–8.5(零 Composer 依赖)+ MySQL 5.7+/8.0 + Layui 2.13.9 + wangEditor v5 / UEditorPlus
- 部署形态:单站点,运行目录即项目根(不是
public子目录) - 授权方式:自用/二开随意,请遵守目标平台的服务条款,勿用于违法用途
目录
功能特性
解析能力
- 20+ 个平台的无水印视频 / 图集解析(见下方平台清单)
- 自研解析优先 + 三方接口回落:平台改版时自动走备用通道,无需停服
- 多级备用解析地址:每个解析器可配置多条 fallback API(一行一个,依次尝试)
- 解析结果含:无水印视频直链、图集原图、封面、标题、作者、背景音乐
会员与支付
- 套餐体系:体验 / 周卡 / 月卡 / 季卡 / 年卡 / 永久 / 次数包(10000 次)
- 套餐展示三页同源,样式永远一致:三处(首页 / 会员套餐页 / 用户中心升级页)规则统一 —— 所有套餐一律以轮播展示(左右翻页 + 圆点指示 + 4.5 秒自动播放,鼠标悬停 / 触摸时暂停,不足一屏自动隐藏控件);存在多个会员类型时用选项卡分组(会员时长 / 次数包 / 组合套餐,数量角标实时统计),每组一个独立轮播;只有一个类型时不显示选项卡
- 三处共用同一份数据(
app/common/library/PlanService.php)与同一套模板(themes/default/public/plan_section.html展示区 +plan_card.html卡片),改样式只需改这两处 - 收银台渠道图标:内置品牌 SVG(
static/img/pay/),插件也可给图片地址;未提供图标时回落到名称首字,不会再出现「图标位置显示一串类名文字」 - 用户余额系统:充值、消费、流水记录,扣款与发权益同事务(行锁保护)
- 支付网关插件化:易支付(epay)、码支付(mpay)、余额支付(balance),一个网关可展开多个收银台渠道(微信 / 支付宝 / QQ 钱包)
- 支付回调全量校验:签名 + 金额一致性 + 订单状态幂等
后台管理
- 仪表盘、用户管理、会员套餐、订单管理、解析记录、插件管理、系统配置
- 数据库管理:一键备份 / 恢复 / 下载 / 删除 SQL 备份文件(存于
data/backup/) - 插件管理按类型分选项卡:解析器插件 / 支付插件 / 通用插件
- 基于角色的权限(
admin_group.rules,*= 超级管理员),按钮级接口校验 - 短信三渠道(阿里云 / 腾讯云 / 通用网关),设置页按渠道选项卡切换,各渠道参数相互独立
- 账号头像:个人资料页可上传头像(≤5MB),顶栏实时展示,留空回落昵称首字
- 会员新增/编辑:按「基本信息 / 会员权益 / 状态与备注」分组卡片呈现,含头像上传、余额-积分-次数指标网格
- 富文本编辑器:wangEditor v5 / UEditorPlus 工具栏均为吸顶固定,长表单滚动时不随页面移动
- 邮件系统:SMTP 发信(SSL 465 / STARTTLS 587 / 明文 25),后台一键测试发送(发送后 60 秒防轰炸倒计时);前台验证码发送后自动进入 60 秒重发倒计时
- 邮箱模版三场景(登录 / 注册 / 找回密码):三套内置样式可选(卡片风格 / 简约清爽 / 品牌渐变,默认卡片)+ 实时预览;占位符支持站点名称、用户名、邮箱、验证码、有效期、发送时间,可一键应用所选样式默认正文
- 安全设置:自定义后台登录入口(设置后登录页仅可通过
/admin/login/index?entry=入口名访问,验证通过后同一浏览器 7 天内免带参数,其余访问一律 404)
前台
- 响应式界面,支持批量解析、解析历史(登录用户)
- 顶部公告滚动条:后台「站点公告」里多条类型为「顶部滚动条」的记录会全部进入滚动区(也支持回落「站点配置 → 首页公告」文本、置顶普通公告标题,最多 3 条);滚动方向可在「站点配置 → 基础设置 → 公告滚动方向」选择左右横向跑马灯或上下逐条滚动。是否滚动按内容实际宽度判定:左右模式看「两份内容总宽是否超出一屏」,上下模式看「条数是否大于 1」;不滚动时只展示一份(不会把同一条公告并排显示两遍),鼠标悬停暂停
- 登录/注册页可扩展第三方登录:插件通过
user_login_extra/user_register_extra/user_profile_extra钩子注入入口,当前已内置微信公众号扫码登录与账号绑定(见「微信公众号登录」小节) - 会员头像:个人中心「资料设置」可直接上传/更换头像(jpg/png/gif/webp,≤2MB),侧栏与前台同步展示,留空回落昵称首字
- API 密钥:月度会员及以上可在「会员中心 → API 密钥」一键生成 / 重置(
sy_+ 随机串,等同会员身份),调用频率随等级为 30 / 60 / 120 次每分钟 - 会员中心时间展示:我的订单「下单时间」、会员中心「近期订单 / 近期解析」、解析详情的时间统一按时间戳格式化为
Y-m-d H:i展示;解析详情的媒体信息(分辨率 / 清晰度等)字段缺失时按空值兜底,不会出现空白单元格或把 PHP 警告打到页面上 - 移动端适配:表格窄屏横向滚动、长内容断行、无页面级横向滚动条
- 移动端弹窗菜单:≤720px 时顶部导航与登录状态统一收进右上角汉堡唤起的右侧抽屉(含全部导航项、用户中心入口、登录/注册或退出登录);点遮罩 / Esc / 任意链接即关闭,打开时锁定页面滚动
- 富文本编辑器可切换:wangEditor v5 / UEditorPlus
- 平台图标自动识别(图片 / 字体图标 / 首字兜底)
支持的环境
| 项目 | 要求 | 说明 |
|---|---|---|
| PHP | 8.0.0 – 8.5.x | 最低 8.0;≥ 8.6 安装向导会警告(未充分测试) |
| MySQL | 5.7+ / 8.0(字符集 utf8mb4) | 数据库不存在时安装向导会自动创建 |
| Web 服务器 | Nginx / Apache / PHP 内置服务器 | 伪静态规则见下文 |
| 操作系统 | Linux / Windows / macOS 均可 | 生产环境建议 Linux + 宝塔或 Docker |
必需 PHP 扩展(安装向导第一步会逐项检测):
| 扩展 | 用途 |
|---|---|
| pdo / pdo_mysql | 数据库 |
| curl | 远程请求(解析必需) |
| json | JSON 处理 |
| mbstring | 多字节字符串 |
| openssl | 加密与 HTTPS |
建议开启的可选扩展:
| 扩展 | 用途 |
|---|---|
| gd | 图片处理(缩略图、二维码) |
| fileinfo | 上传文件类型嗅探 |
| zip | 后台插件上传安装 |
目录权限:以下目录需要 Web 运行用户可写:
data/(缓存、备份、运行数据)uploads/(用户上传)config/(安装向导写入数据库配置)
安装步骤
方式一:网页向导安装(推荐)
-
上传代码
把整个项目上传到站点目录(如/www/wwwroot/shuiyin),确认:- 网站运行目录 = 项目根目录(
index.php所在处,不要指向public/) - 已配置伪静态(见下文)
- 网站运行目录 = 项目根目录(
-
访问安装向导
浏览器打开http://你的域名/install/,向导共 4 步:- 环境检测 —— 自动检查 PHP 版本、必需扩展、目录可写性,全部通过后才能下一步
- 配置信息 —— 填写数据库地址 / 端口 / 用户名 / 密码 / 库名 / 表前缀,以及管理员账号密码(请勿使用默认弱口令)
- 执行安装 —— 自动建库(utf8mb4)、导入
install/install.sql与初始数据、创建管理员、注册并启用插件 - 安装完成 —— 展示后台入口
-
登录后台
访问http://你的域名/admin/login/index,用第 2 步设置的管理员账号登录。
(本地调试默认库连接参考:host127.0.0.1,库名随意,表前缀sy_)
方式二:命令行安装
适合无浏览器环境或批量部署:
php install/cli-install.php # 交互式引导,自动完成建库 + 导数据 + 管理员
php install/cli-plugins.php # 安装收尾后补注册插件
php install/cli-plugins.php --force # 强制重装(重置插件配置)
安装向导收尾会自动执行插件注册(
install/plugin-setup.php),正常流程无需手动跑cli-plugins.php。
版本升级(覆盖代码后)
用新版本覆盖了旧代码、但数据库还是老结构时,跑一次升级脚本即可:
php install/cli-upgrade.php # 应用缺失的结构变更
php install/cli-upgrade.php --dry # 只预览将要执行什么,不落库
脚本是幂等的:按 INFORMATION_SCHEMA 判断现状,只补差量,重复执行安全,也不会重建表或丢数据。升级完成后同样要删除 install/ 目录。
安装后收尾
- ⚠️ 务必删除
install/目录——伪静态规则虽然拦截了直接访问,但物理删除才是唯一保险 - 登录后台 → 系统配置,核对站点名称、解析回落接口等配置
- 配置支付网关(后台 → 插件管理 → 支付插件)后再开放充值功能
伪静态与部署配置
系统把入口 index.php、静态资源 static/、上传目录 uploads/ 统一放在项目根目录,因此无需把运行目录指到子目录。
Nginx
把 docs/nginx.conf 中的 server 块整体贴入站点配置(宝塔:站点设置 → 配置文件)。要点:
root /www/wwwroot/shuiyin; # 指向项目根目录
index index.php index.html;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location = /index.php {
include fastcgi_params;
fastcgi_param PATH_INFO $uri;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass 127.0.0.1:9000; # 按实际 PHP-FPM 监听改(宝塔常见 unix:/tmp/php-cgi-80.sock)
}
# 代码目录 / 配置 / 运行数据 / 安装程序 一律拒绝
location ~ ^/(app|core|config|data|plugins|themes|install)/ { deny all; return 404; }
# 敏感文件(.sql/.md/.log/.bak 等)拒绝下载
location ~* \.(sql|md|lock|ini|log|bak)$ { deny all; return 404; }
Apache
项目根目录已自带 .htaccess(所有请求转发到 index.php + 拦截敏感目录/文件),确保:
- 开启了
mod_rewrite,且AllowOverride All - 若在子目录部署,检查
.htaccess中的RewriteBase
伪静态与功能的对应关系
系统所有后台功能(含邮件测试发送端点 /admin/config/testmail、数据库管理等)都运行在 /admin 前缀下,前台为常规路由,默认规则已全部覆盖,无需为新增功能追加放行规则。若后续二开新增了以下情况,需同步更新 docs/nginx.conf 与 .htaccess 并在本文档登记:
- 新增了独立入口脚本(类似
install/)→ 加入拦截列表; - 新增了对外暴露的静态资源目录(类似
static/、uploads/)→ 确保不被deny规则误拦; - 新增了插件带自己的公开回调/资源路径 → 同步两个规则文件。
已登记的前台公开路由(均走 index.php 常规路由,无需额外规则):
| 路由 | 用途 | 说明 |
|---|---|---|
/home/upload/avatar |
会员头像上传 | POST,仅登录会员可用,图片 ≤ 2MB,落盘 uploads/avatar/YYYY/mm/dd/ |
/admin/upload/index |
后台统一上传 | POST,type=image/video/audio/file,同时兼容 UEditor 协议 |
PHP 内置服务器(本地开发)
php -S 127.0.0.1:8899 -t . data/tmp/dev-router.php
调试模式:环境变量
SY_DEBUG=1会输出详细错误;生产环境务必关闭。
目录结构
shuiyin/
├── index.php # 唯一入口
├── .htaccess # Apache 伪静态
├── app/ # 应用代码(三段式)
│ ├── home/ # 前台控制器与视图逻辑
│ ├── admin/ # 后台控制器(含 database.php 数据库备份恢复)
│ └── common/ # 公共库
├── core/ # 框架内核(bootstrap.php / Db.php / Parser.php / Plugin.php …)
├── plugins/ # 插件目录(每个插件 = plugin.json + Plugin.php)
├── themes/ # 视图模板(含 themes/admin 后台主题)
├── config/ # 数据库等配置(安装向导写入)
├── data/ # 运行数据(缓存、backup/ 数据库备份、tmp/)
├── static/ # 静态资源(css/js/img,平台图标在 static/img/platform/)
├── uploads/ # 用户上传
├── install/ # 安装向导(装完删除!)
└── docs/ # nginx.conf 部署参考
后台管理
入口:http://你的域名/admin/login/index
| 模块 | 说明 |
|---|---|
| 仪表盘 | 站点概览、解析量统计 |
| 用户管理 | 用户列表、余额调整、会员状态 |
| 会员套餐 | 套餐价格 / 时长 / 次数配置 |
| 订单管理 | 支付订单查询、补单处理 |
| 解析记录 | 全站解析流水 |
| 插件管理 | 按类型分选项卡:解析器 / 支付 / 通用;在线启停与配置 |
| 数据库管理 | 一键备份、恢复、下载、删除备份文件(data/backup/) |
| 系统配置 | 站点信息、短信/邮箱渠道、解析回落接口等 |
权限说明:管理员分组 rules 字段为 * 即超级管理员;普通分组按规则串控制,按钮级权限在接口层二次校验。
插件体系
插件位于 plugins/<name>/,每个插件必须包含 plugin.json(元信息 + type/sort/fallback/default_enabled)和 Plugin.php(主类 plugins\<name>\Plugin)。
| 类型 | 插件 | 说明 |
|---|---|---|
| 解析器 parser | douyin / kuaishou / xiaohongshu / bilibili / weibo / pipixia / pipigx / izuiyou / weishi / toutiao / ixigua / haokan / huoshan / channels / youtube / doubao / jimeng / qianwen | 各平台本地解析;非 fallback 解析器安装时自动启用 |
| 三方回落 parser | thirdparty | 公开解析接口池,本地解析失败时的兜底渠道 |
| 支付 pay | epay(易支付)/ mpay(码支付)/ balance(余额) | 收银台渠道来源 = 后台已启用的支付插件 |
| 编辑器 general | wangeditor / ueditorplus | 前后台富文本编辑器,可切换 |
| 登录扩展 general | wechatmp(微信公众号) | 关注公众号 / 发送验证码口令登录,支持个人订阅号 |
解析回落机制:本地解析失败 → 依次尝试该插件 fallback_api 配置的多个三方接口(每行一个 URL 模板,{url} 占位符)→ 全部失败才报「暂不支持」。
微信公众号登录(wechatmp 插件)
以插件方式接入公众号,实现「关注即登录」与「发送验证码口令登录」两条通道,并支持已注册会员绑定微信。
前台入口(全部为页面内联面板,不使用遮罩弹窗)
| 位置 | 表现 |
|---|---|
| 登录页 | 表单上方的「账号密码登录 / 微信扫码登录」切换栏,默认停在账号密码;切到扫码后表单隐藏、二维码面板原地展开 |
| 注册页 | 表单下方「微信扫码登录 / 注册」按钮,点击就地展开二维码面板 |
| 个人中心 → 资料设置 | 「微信绑定」卡片:未绑定时展示二维码,绑定成功后展示状态与「解除绑定」按钮 |
绑定后可直接用微信扫码登录,无需再输入账号密码;解绑后
openid置为NULL(未绑定会员可以有任意多个)。
启用步骤
- 后台「插件管理 → 通用插件」确认
wechatmp已安装启用(全新安装默认启用); - 「插件设置 → 微信公众号登录」填写:公众号 AppID / AppSecret、服务器 Token(自定义串)、回调地址;
- 微信公众平台「设置与开发 → 基本配置 → 服务器配置」把 URL 填为该回调地址(形如
https://你的域名/home/wechatmp/callback),Token 与后台一致;消息加解密方式推荐选「明文模式」(最省事)。若选了「兼容模式 / 安全模式」,必须同时把平台生成的 EncodingAESKey(43 位)填进后台插件设置,否则用户给公众号发口令时收不到任何回复; - 按需填写「固定二维码图片」(关注引导图),并开启「关注即登录」/「验证码口令登录」开关。
消息加解密方式(重要):插件三种模式都支持 —— 明文模式直接解析 XML;兼容 / 安全模式
下微信推送的是<Encrypt>密文,插件会自动识别并解密,被动回复也自动加密回包。
判定以报文内容为准(不依赖 URL 上的encrypt_type参数),避免混合下发时被误判。
若选了安全模式却漏填 EncodingAESKey,站点会写入明确日志,并让登录面板直接提示「配置异常」,
不会再出现「发了消息毫无反应」这种情况。
公众号类型(设置项「公众号类型」,决定可用通道)
| 类型 | 带参二维码 | 可用登录通道 |
|---|---|---|
| 个人订阅号(未认证) | 不支持 | 仅「发送验证码口令」:引导用户关注后发送站点给出的 6 位口令 |
| 已认证订阅号 / 服务号 / 测试号 | 支持 | 扫码即登录(关注事件)+ 发送口令,双通道 |
关键配置项
| 配置 | 说明 |
|---|---|
| 关注即登录 | 用户扫带参二维码并关注 → 事件推送 → 自动登录 |
| 验证码口令登录 | 用户关注后发送站点显示的 6 位口令 → 被动回复确认 → 自动登录 |
| 自动注册 | 关闭时,未注册的微信用户扫码只提示「请先注册并绑定」,不自动建号 |
| 固定二维码图片 | 未配置 AppID/Secret 或使用个人订阅号时展示的关注引导图 |
安全:跳转只允许站内相对路径(
safeRedirect());登录票据(scene)10 分钟过期且一次性消费;
绑定票据额外记录发起绑定时的会员 ID,轮询时必须与当前登录态一致,票据被挪用也无法绑到他人账号;
解绑接口要求已登录且当前账号确有绑定;回调走签名校验(sha1(sort(token,timestamp,nonce))+hash_equals),
GET 请求原样回显echostr完成微信服务器验证。
插件不新建数据表,微信openid复用会员表的openid唯一列(未绑定时为NULL)。
支持的解析平台
| 平台 | 支持内容 | 平台 | 支持内容 |
|---|---|---|---|
| 抖音 | 视频 / 图集 | 微视 | 视频 |
| 快手 | 视频 / 图集 | 今日头条 | 视频 / 图集 |
| 小红书 | 视频 / 图集 | 西瓜视频 | 视频 |
| B 站 | 视频 | 好看视频 | 视频 |
| 微博 | 视频 / 图集 | 火山小视频 | 视频 |
| 皮皮虾 | 视频 / 图集 | 微信视频号 | 视频 |
| 皮皮搞笑 | 视频 / 图集 | YouTube | 视频 |
| 最右 | 视频 / 图集 | 豆包 | 视频 |
| 即梦 AI | 视频 | 千问 | 视频 |
平台支持范围以后台「解析器插件」实际启用情况为准;启停某个解析器后,前台平台列表自动同步。
微信视频号支持channels.weixin.qq.com全部链接形态(/web/feed/、feed_id=、/finder/);其内容受微信登录态保护,本地通道仅能提取元数据,视频直链依赖「备用解析地址」(后台可换自购接口)。
最右支持share.izuiyou.com/share.xiaochuankeji.cn/m.izuiyou.com/ixiaochuan.cn/zuiyou.tv全部链接形态(短链自动跟随);带查询参数的链接(如?pid=、?v=、?id=)均完整识别。
常见问题 FAQ
Q1:访问首页 404 / 所有页面都 404?
伪静态未配置或配置错误。检查:Nginx 的 try_files ... /index.php$is_args$args 是否生效;运行目录是否指向项目根而不是 public/;Apache 是否开启 mod_rewrite 且 AllowOverride All。
Q2:安装向导第一步「目录不可写」?
给 data/、uploads/、config/ 目录加 Web 运行用户写权限:
chown -R www:www /www/wwwroot/shuiyin
chmod -R 755 /www/wwwroot/shuiyin/data /www/wwwroot/shuiyin/uploads /www/wwwroot/shuiyin/config
Q3:某平台解析失败,提示「暂不支持」?
按顺序排查:
- 后台 → 插件管理 → 解析器插件,确认该平台插件已启用;
- 平台官方接口被风控(典型如抖音游客通道),属正常现象——系统会自动走回落渠道,可检查插件配置里的
fallback_api是否有可用的三方接口; - 三方接口本身失效:更换 / 追加新的回落接口(一行一个 URL,含
{url}占位符); - 部分平台(如最右)已删除的帖本来就是 404,无法解析。
- 前台失败提示只展示用户可读的原因,不会显示备用接口/上游服务的域名;完整明细(含各端点失败原因)已记入后台日志与解析记录,排障时到后台查看。
Q4:解析能拿到直链,但视频无法播放 / 下载失败?
部分平台 CDN 有防盗链(如 B 站需要 Referer),直接把直链贴进浏览器可能被拒。系统的下载代理会自动补齐请求头;若是前端播放问题,确认站点是 HTTPS 且平台直链也是 HTTPS(混合内容会被浏览器拦截)。
Q5:支付下单成功,但订单一直「待支付」?
支付回调未送达或验签失败。排查:
- 回调地址必须公网可达(本地调试无法收到回调,可用工具模拟);
notify_url必须与签名时提交的参数完全一致,不能带额外路由参数,否则验签必失败;- 回调地址为绝对地址(含协议+域名),由系统按当前访问域名自动生成;若站点走 CDN / 反向代理,确保已透传
X-Forwarded-Proto,否则生成的可能是 http 地址而被网关拒绝;也可在后台「支付设置 → 异步回调地址」显式填写固定地址; - 后台订单列表确认网关侧订单状态;码支付(mpay)可在网关后台查单核对。
Q6:支付完成后没有返回本站,停留在第三方支付平台?
同步跳转地址(return_url)必须是绝对地址,第三方平台拿到相对地址会按它自己的域名跳转。系统自 v2026.10 起已自动生成绝对地址;若在 CDN / 反向代理后仍异常,请在后台「支付设置 → 同步跳转地址」显式填写 https://你的域名/home/pay/return。正常流程:支付成功 → 跳回本站「支付结果页」(订单未确认时会自动轮询补单,几秒内刷新为已支付)。
Q7:后台登录不上 / 忘记管理员密码?
密码是加盐哈希存储的,直接改库无效。用 CLI 重建管理员:
php install/cli-install.php # 重新走一遍配置(数据可选保留)
或在测试环境重置后再把 admin 表该行的 password/salt 拷贝过去。
Q8:插件上传安装失败?
需要 PHP zip 扩展(可选扩展),开启后重试。也可以手动解压到 plugins/ 目录后到后台刷新。
Q9:换服务器怎么迁移?
- 旧站后台 → 数据库管理 → 备份,下载
.sql文件; - 打包整个项目目录(排除
data/backup/可选)上传新服务器; - 修改
config/里的数据库配置为新库信息; - 通过 phpMyAdmin 或后台数据库管理导入备份 SQL。
Q10:恢复备份后数据没变化 / 报错?
恢复是按备份文件内的 SQL 逐条执行、失败即中止:确认备份文件完整(未被截断)、表前缀一致、当前数据库用户有 DROP/CREATE 权限。
Q11:报错页空白,怎么查问题?
本地开发设环境变量 SY_DEBUG=1 开启调试输出;生产环境查看 php_errors.log 与 data/ 下的运行日志。部署后若一直白屏,优先检查 PHP 版本(≥8.0)和必需扩展是否齐全。
Q12:可以二开吗?目录里的代码能直接访问吗?
可以二开,框架是三段式 PSR-4 自动加载(core/ / app/ / plugins/),无 Composer 依赖。app、core、config、data、plugins、themes 目录已被伪静态规则拦截,Web 无法直接访问,只有 index.php / static/ / uploads/ 对外暴露。
Q13:金额为什么用整数存?
系统全部金额以整数分(BIGINT)存储,显示时再除以 100,避免浮点精度问题。二开涉及金额的字段请遵守同一约定。
Q14:邮件发不出去,怎么排查?
按顺序检查:
- 「解析设置 → 邮件功能」开关是否开启,且「邮件设置」已填 SMTP 参数;
- QQ / 163 等个人邮箱必须填授权码,不是邮箱登录密码(QQ 邮箱:设置 → 账户 → 开启 SMTP 并生成授权码);
- 端口与加密方式要匹配:SSL 用 465,STARTTLS 用 587;
- 服务器出站防火墙需放行对应端口(很多云服务器默认封 25 端口,推荐直接用 SSL 465);
- 配置好后用后台「邮件设置 → 测试发送」真实发一封验证,发送后有 60 秒倒计时防止误触发频控;
- 报「无法连接邮件服务器 / Connection timed out」时,点后台「邮件设置 → 连接诊断」:它会实测 DNS 与 25/465/587 三个端口的出站连通性并逐项回报——全被拦请到云控制台「安全组 → 出站规则」放行 TCP 465、587;安全组已放行仍不通则查服务器本机防火墙(firewalld / iptables);
- 系统会自动按「配置端口 → 465/SSL → 587/STARTTLS」顺序尝试,并在连接前自行解析 IPv4(A 记录)逐个直连,可绕开部分 Linux 服务器 IPv6 残缺导致的连接超时;
- 旧版本存在 SMTP DATA 结束符缺少 CRLF 导致发送超时的核心 bug,若历史部署发信一直超时,请更新到包含 2026-10-05 修复的
core/Mailer.php。
Q15:后期新功能如何扩展?会不会改坏核心?
新功能(解析平台、支付渠道、短信渠道、页面模块等)一律以插件方式增加(plugins/<name>/,含 plugin.json + Plugin.php),不修改 core/ 核心文件;core/ 仅允许最小化 bug 修复。后台可通过「插件管理」启停、配置插件,无需改动代码。
Q16:自定义登录入口忘了,进不了后台怎么办?
入口名保存在数据库 sy_config 表(key = admin_alias)。用 phpMyAdmin / 命令行连接数据库后,将该行 value 清空或删除该行,即可恢复默认地址 /admin/login/index:
DELETE FROM sy_config WHERE `key` = 'admin_alias';
Q17:前台发送验证码提示失败,但邮件收到了?
这是旧版本前端脚本的问题(已修复):发送接口成功返回后,前端误判了响应结构。若仍遇到,先强刷浏览器缓存(Ctrl+F5);同时确认后台「邮件设置」已正确配置并点「测试发送」验证链路。
Q18:前台注册报错 1062 Duplicate entry '' for key 'uk_openid',一个账号都注册不上?
旧版本会员表把 openid / api_token 定义成 NOT NULL DEFAULT '' 并各加了唯一索引。MySQL 的唯一索引会把多个空串当成同一个值,于是一整张表只容得下一个「未绑定」会员——第二个注册的人必然撞唯一键失败,现象就是「注册永远报错」。
修复方式(v2026.10.05 起):这两列改为可空的 NULL 语义(NULL = 未绑定),唯一索引保留。MySQL 认为多个 NULL 互不相同,未绑定会员因此可以有任意多个,而真实的 openid / API 密钥仍然保持唯一。
- 全新安装:
install/install.sql已是正确结构,无需处理; - 已有站点:覆盖新代码后执行一次
php install/cli-upgrade.php
或手动执行(表前缀非 sy_ 请自行替换):
ALTER TABLE `sy_user` MODIFY `openid` VARCHAR(64) NULL DEFAULT NULL;
ALTER TABLE `sy_user` MODIFY `api_token` VARCHAR(64) NULL DEFAULT NULL;
UPDATE `sy_user` SET `openid` = NULL WHERE `openid` = '';
UPDATE `sy_user` SET `api_token` = NULL WHERE `api_token` = '';
若表上缺少
uk_openid/uk_api_token唯一索引,升级脚本会一并补齐;执行完后清理一次data/cache/。
后台「新增会员」走的是同一张表,旧结构下同样会失败 —— 上面这一步一并修好。
Q19:微信公众号「服务器配置」保存时提示 token 验证失败?
微信服务器会主动请求你的回调地址(GET 携带 signature/timestamp/nonce/echostr),插件校验签名后原样回显 echostr。逐项检查:① 回调地址必须公网可访问,localhost / 内网地址不行;② 后台「服务器 Token」与微信平台填的完全一致(区分大小写、前后无空格);③ 站点走 HTTPS 或 80 端口;④ 中间层(CDN / 防火墙)未改写或缓存该路径的响应,PHP 未被拦截输出额外内容。
Q20:个人订阅号扫码后没有反应 / 拿不到二维码?
个人订阅号(未认证)没有带参二维码接口,因此没有「扫码即登录」。请在插件设置中把「公众号类型」选为个人订阅号,并开启「验证码口令登录」——用户关注公众号后,向公众号发送页面显示的 6 位口令即可登录。同时确认微信后台未用其他自动回复规则占用消息。
Q21:给公众号发送了口令,公众号一直没反应?
按顺序排查(插件在关键分支都会写日志,看 data/logs/plugin-日期.log 能直接定位):
- 消息加解密方式不匹配(最常见):微信后台若选了「兼容模式 / 安全模式」,推送的是
<Encrypt>密文,
后台必须填写与平台一致的 EncodingAESKey;漏填时日志会出现「收到加密推送但解密失败」,
登录面板也会直接提示「配置异常」。 - 服务器配置没生效:微信后台的「服务器配置」要处于启用状态。未启用时微信根本不会把消息推给你的站点,
用户发什么都得不到回复(此时你的日志里一条回调记录都没有)。 - 口令过期:有效期 10 分钟,超时后重发会收到引导文案,回网页重新获取即可。
- 微信后台配了关键词自动回复占用了该文本,消息可能不再转给开发者服务器。
- Token 不一致:日志出现「回调验签失败」即为此项,逐字符核对后台与平台的 Token。
Q22:改了 static/ 下的 CSS/JS(或模板),页面却还是旧的样子?
asset() 生成的 ?v= 参数取文件修改时间,改动文件后 URL 会自动变化,浏览器必然重新拉取,正常情况刷新即可。若仍看到旧样式,检查是否套了 CDN / 反向代理缓存(清一次即可)。
不要把这个版本号改回固定常量(如 ?v=1.0.0):那样改了文件 URL 也不变,浏览器会一直吃本地缓存,表现为「代码明明改了、页面毫无变化」——排查公告不滚动时就踩过这个坑。
Q23:前台解析提示「服务器返回异常,请稍后重试」?
这条文案来自前端:它对接口响应做 JSON.parse,只要响应体里混进一个非 JSON 字符就会整体失败。最常见的来源是 PHP 的 Warning / Notice —— 例如插件把本该是数组的配置项用 (string) 强转,PHP 8 会打印 Array to string conversion 并直接写进响应体,用户端就看到"接口报错",而 HTTP 状态码仍是 200,很容易被误判成接口挂了。
排查顺序:
- 用
curl直接请求该接口,看响应体开头是否包着<b>Warning</b>之类的 HTML 片段; - 按提示的文件与行号修掉那条 Warning;
- 框架侧已做兜底:
Response::send()与开放 API 端点在输出 JSON 前会清空输出缓冲,确保响应体是一段干净 JSON。
安全建议
- 安装完成后立即删除
install/目录 - 修改默认管理员账号密码,并在「系统配置 → 安全设置」设置自定义登录入口隐藏登录页
- 生产环境关闭
SY_DEBUG - 定期用后台「数据库管理」备份,并把
data/backup/纳入异地备份 - 及时更新三方回落接口,失效接口在后台插件配置中移除
- 站点启用 HTTPS(支付回调与混合内容都依赖它)