全网去水印1.0.0源码发布

全网去水印系统

一套开箱即用的短视频 / 图集去水印解析站点,支持 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/(安装向导写入数据库配置)

安装步骤

方式一:网页向导安装(推荐)

  1. 上传代码
    把整个项目上传到站点目录(如 /www/wwwroot/shuiyin),确认:

    • 网站运行目录 = 项目根目录(index.php 所在处,不要指向 public/)
    • 已配置伪静态(见下文)
  2. 访问安装向导
    浏览器打开 http://你的域名/install/,向导共 4 步:

    1. 环境检测 —— 自动检查 PHP 版本、必需扩展、目录可写性,全部通过后才能下一步
    2. 配置信息 —— 填写数据库地址 / 端口 / 用户名 / 密码 / 库名 / 表前缀,以及管理员账号密码(请勿使用默认弱口令)
    3. 执行安装 —— 自动建库(utf8mb4)、导入 install/install.sql 与初始数据、创建管理员、注册并启用插件
    4. 安装完成 —— 展示后台入口
  3. 登录后台
    访问 http://你的域名/admin/login/index,用第 2 步设置的管理员账号登录。
    (本地调试默认库连接参考:host 127.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 并在本文档登记:

  1. 新增了独立入口脚本(类似 install/)→ 加入拦截列表;
  2. 新增了对外暴露的静态资源目录(类似 static/、uploads/)→ 确保不被 deny 规则误拦;
  3. 新增了插件带自己的公开回调/资源路径 → 同步两个规则文件。

已登记的前台公开路由(均走 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(未绑定会员可以有任意多个)。

启用步骤

  1. 后台「插件管理 → 通用插件」确认 wechatmp 已安装启用(全新安装默认启用);
  2. 「插件设置 → 微信公众号登录」填写:公众号 AppID / AppSecret、服务器 Token(自定义串)、回调地址;
  3. 微信公众平台「设置与开发 → 基本配置 → 服务器配置」把 URL 填为该回调地址(形如 https://你的域名/home/wechatmp/callback),Token 与后台一致;消息加解密方式推荐选「明文模式」(最省事)。若选了「兼容模式 / 安全模式」,必须同时把平台生成的 EncodingAESKey(43 位)填进后台插件设置,否则用户给公众号发口令时收不到任何回复;
  4. 按需填写「固定二维码图片」(关注引导图),并开启「关注即登录」/「验证码口令登录」开关。

消息加解密方式(重要):插件三种模式都支持 —— 明文模式直接解析 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:某平台解析失败,提示「暂不支持」?
按顺序排查:

  1. 后台 → 插件管理 → 解析器插件,确认该平台插件已启用;
  2. 平台官方接口被风控(典型如抖音游客通道),属正常现象——系统会自动走回落渠道,可检查插件配置里的 fallback_api 是否有可用的三方接口;
  3. 三方接口本身失效:更换 / 追加新的回落接口(一行一个 URL,含 {url} 占位符);
  4. 部分平台(如最右)已删除的帖本来就是 404,无法解析。
  5. 前台失败提示只展示用户可读的原因,不会显示备用接口/上游服务的域名;完整明细(含各端点失败原因)已记入后台日志与解析记录,排障时到后台查看。

Q4:解析能拿到直链,但视频无法播放 / 下载失败?
部分平台 CDN 有防盗链(如 B 站需要 Referer),直接把直链贴进浏览器可能被拒。系统的下载代理会自动补齐请求头;若是前端播放问题,确认站点是 HTTPS 且平台直链也是 HTTPS(混合内容会被浏览器拦截)。

Q5:支付下单成功,但订单一直「待支付」?
支付回调未送达或验签失败。排查:

  1. 回调地址必须公网可达(本地调试无法收到回调,可用工具模拟);
  2. notify_url 必须与签名时提交的参数完全一致,不能带额外路由参数,否则验签必失败;
  3. 回调地址为绝对地址(含协议+域名),由系统按当前访问域名自动生成;若站点走 CDN / 反向代理,确保已透传 X-Forwarded-Proto,否则生成的可能是 http 地址而被网关拒绝;也可在后台「支付设置 → 异步回调地址」显式填写固定地址;
  4. 后台订单列表确认网关侧订单状态;码支付(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:换服务器怎么迁移?

  1. 旧站后台 → 数据库管理 → 备份,下载 .sql 文件;
  2. 打包整个项目目录(排除 data/backup/ 可选)上传新服务器;
  3. 修改 config/ 里的数据库配置为新库信息;
  4. 通过 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:邮件发不出去,怎么排查?
按顺序检查:

  1. 「解析设置 → 邮件功能」开关是否开启,且「邮件设置」已填 SMTP 参数;
  2. QQ / 163 等个人邮箱必须填授权码,不是邮箱登录密码(QQ 邮箱:设置 → 账户 → 开启 SMTP 并生成授权码);
  3. 端口与加密方式要匹配:SSL 用 465,STARTTLS 用 587;
  4. 服务器出站防火墙需放行对应端口(很多云服务器默认封 25 端口,推荐直接用 SSL 465);
  5. 配置好后用后台「邮件设置 → 测试发送」真实发一封验证,发送后有 60 秒倒计时防止误触发频控;
  6. 报「无法连接邮件服务器 / Connection timed out」时,点后台「邮件设置 → 连接诊断」:它会实测 DNS 与 25/465/587 三个端口的出站连通性并逐项回报——全被拦请到云控制台「安全组 → 出站规则」放行 TCP 465、587;安全组已放行仍不通则查服务器本机防火墙(firewalld / iptables);
  7. 系统会自动按「配置端口 → 465/SSL → 587/STARTTLS」顺序尝试,并在连接前自行解析 IPv4(A 记录)逐个直连,可绕开部分 Linux 服务器 IPv6 残缺导致的连接超时;
  8. 旧版本存在 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 能直接定位):

  1. 消息加解密方式不匹配(最常见):微信后台若选了「兼容模式 / 安全模式」,推送的是 <Encrypt> 密文,
    后台必须填写与平台一致的 EncodingAESKey;漏填时日志会出现「收到加密推送但解密失败」,
    登录面板也会直接提示「配置异常」。
  2. 服务器配置没生效:微信后台的「服务器配置」要处于启用状态。未启用时微信根本不会把消息推给你的站点,
    用户发什么都得不到回复(此时你的日志里一条回调记录都没有)。
  3. 口令过期:有效期 10 分钟,超时后重发会收到引导文案,回网页重新获取即可。
  4. 微信后台配了关键词自动回复占用了该文本,消息可能不再转给开发者服务器。
  5. 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,很容易被误判成接口挂了。
排查顺序:

  1. 用 curl 直接请求该接口,看响应体开头是否包着 <b>Warning</b> 之类的 HTML 片段;
  2. 按提示的文件与行号修掉那条 Warning;
  3. 框架侧已做兜底:Response::send() 与开放 API 端点在输出 JSON 前会清空输出缓冲,确保响应体是一段干净 JSON。

安全建议

  • 安装完成后立即删除 install/ 目录
  • 修改默认管理员账号密码,并在「系统配置 → 安全设置」设置自定义登录入口隐藏登录页
  • 生产环境关闭 SY_DEBUG
  • 定期用后台「数据库管理」备份,并把 data/backup/ 纳入异地备份
  • 及时更新三方回落接口,失效接口在后台插件配置中移除
  • 站点启用 HTTPS(支付回调与混合内容都依赖它)
免责声明:本文来自其他站点,不代表本站观点和立场,如有侵权请联系本平台处理。

发表评论

欢迎 访客 举举你的小爪爪吐槽吐槽吧QwQ