# 接手验收状态 文档核对日期:2026-10-11。以下区分本会话检查结果与用户验收确认,不承诺服务器一直保持此状态。 ## 最新代码基线 - 邮件页签实现版本 13117587c86aa49dafad3467b04d90469f4de2ab;本地提交推送、生产 Git fast-forward 完成。 - 本地和线上后台实际登录成功;/dove 已验证渲染后台仪表盘。 - 邮件设置已拆为五页签;无旧悬浮按钮与弹窗。基本设置保留 SMTP,新增 Resend 与档位、收件与自动回复、用量汇报。当前档位三档。 - 两环境新增页签显示和切换已验收;Resend 页签保存原配置成功。每个扩展页签仅提交本页字段,密钥留空保留。 - 最新邮件隔离回归:57 测试、333 断言通过。 ## 已有真实联调与限制 Resend 发信、常规 SMTP、配额回退、投递事件回调、master 一次性汇报都曾实测。来信保存、每日一次自动回复曾在本地实测并收到回复。生产 IMAP 连接与增量检查已验证。 用户于 2026-10-11 明确确认“日报送达和自动回复验收 ok”。据此,日报实际送达与自动回复已通过用户验收,不再列为待验收项。本次仅登记该确认,未重新发送邮件、触发日报或读取服务器记录。后续发生异常或变更相关逻辑时重新核验,并检查已处理记录避免重复回复/汇报。 ## 接手注意 - 生产曾有与邮件无关的教程和文件模式修改,发布时保留了它们。下次仍必须重新核对,不能假定生产工作区干净。 - 后台资源子模块版本目前锁定 ef5f43da335092cbff8fdf0ad7ff9b4d92d7d0d7;已修复生产未初始化导致的空白问题。 - 后台邮件 UI 目前由扩展脚本接入已构建的第三方管理界面。升级后台子模块需回归挂载、页签、样式、保存、异步切换和原功能,不能认为 DOM 结构永久稳定。 - 本地 PHP-FPM 已重载以加载已安装 IMAP;其他环境需独立确认。 - 独立项目未列入本轮实现;不能把本轮完成扩展为其他聊天任务也完成。 ## 支付配置同步(2026-10-11) 用户授权将本地两条 EPay 配置(支付宝、微信支付)同步到生产,随后要求按资料中新补充的空中支付信息对接线上。两个生产渠道已创建并启用,使用独立生成的渠道标识;通知域名为正式主页 https://dp-link.net。新增资料中的密钥与本地旧配置不同,已按新资料更新线上两个渠道的商户配置,并核对保存值一致。本地商户配置未随该后续要求修改。 生产后台支付列表已实际核对:支付宝、微信支付均显示且开启,通知地址使用正式域名。本次仅修改生产配置数据,未修改支付代码,未创建订单或付款;真实支付和支付回调仍未验收。两次写入前均保存了受保护的加密备份,传输临时私密文件已清除;文档和 Git 不包含商户密钥。 ## 空中支付对接检查与代码修正(2026-10-11) 已实际登录空中支付商户后台,确认账号状态正常、MD5+RSA 兼容模式已启用,提供的新密钥与商户后台一致。已有商户设置未更改;尝试补充空白网站域名时,页面以其他资料未完善拒绝保存,重新读取确认原字段均未改变。接口文档通过每笔请求的 notify_url、return_url 传递回调,不在商户页面单独配置回调地址。 用户授权继续后,已补齐 EPay 回调成功状态、金额(含手续费)、商户及渠道归属校验,并按官方 V1 规则生成签名。隔离测试 5 项、20 个断言通过,覆盖正常/重复回调、错误金额/状态/商户/渠道、缺失/错误签名、取消订单和冲突交易号。语法检查通过。修正已提交推送并通过 Git fast-forward 部署至生产版本 60457487726b95dd7811eea16a625b01cf5c9d69;发布前备份了旧插件和生产既有差异,发布后插件哈希、PHP-FPM 与 Horizon 状态已核对。生产调用空中支付商户查询 API 返回 HTTP 200、业务成功且商户正常。尚未进行真实付款或真实成功回调验收。用户随后要求仅线上联调,本地支付配置保持不动。服务商支付测试页面目前仅展示支付宝按钮;微信通道可用性尚未确认,不能把网站启用微信配置视为通道验收完成。 ## 不付款验收(2026-10-11) 用户明确要求以不做真实支付的方式验收。新增真实控制器与 PaymentService/EPay 插件调用链的隔离测试,使用 SQLite 内存数据库、虚构商户及订单;拦截订单开通任务、禁止外部 HTTP 请求,不操作正式订单。与插件单元测试合计 8 项、53 个断言通过。成功回调返回 success、记录回调号并只派发一次开通任务;签名正确但状态、金额、商户、支付类型或订单不匹配,以及取消订单均不会开通。 本轮验收目标是代码逻辑及接口可达性,不包含真实收款、服务商实际成功回调和正式套餐开通;微信通道仍未得到真实验证。线上隔离检查已完成:生产 PHP 环境以虚构内存订单执行 13 项插件检查全部通过,正式订单写入次数为 0;通过用户指定的远端访问域名请求公网无签名回调,返回 HTTP 422,确认拒绝。生产未安装 PHPUnit 和 SQLite PDO,因此未安装额外依赖,完整控制器内存数据库测试在开发测试环境执行。测试与文档已通过 Git 更新生产至 7a123f8e970c5c404084cd5867d2343824b3f13f。不付款验收按该范围通过;不宣称真实收款、实际服务商成功回调、正式套餐开通或微信通道已通过。 ## 每次维护更新本文件 记录任务、修改文件、测试、提交、是否推送/部署、真实验收结果、尚未完成项与敏感边界。禁止写密码、令牌、原始用户邮件或未经核实的完成结论。 ## Telegram 工单实现(2026-10-11) 沿用原有 Telegram 插件与机器人接口,未对接 master。新增工单推送与消息关联、管理员私聊绑定及权限校验、更新编号去重、未知发送结果不自动重试、429 延迟重试和现有邮件通知复用。新增设置直接位于 Telegram 设置页面,无悬浮入口。 本地新迁移执行成功;工单与既有邮件回归合计 68 项测试、375 个断言通过,PHP 与 JavaScript 语法检查通过。浏览器验证新增区域显示、保存、刷新持久化以及切换邮件设置后返回恢复;测试开关已恢复推送开启、回复关闭。详细操作见 TELEGRAM_TICKETS.md。 用户已在线上保存机器人令牌;只读检查确认令牌配置存在,官方 getWebhookInfo 成功,但机器人开关仍关闭、回调地址为空、绑定管理员为零。本节记录时新代码尚未部署,真实工单推送、Telegram 回复和邮件通知闭环尚未验收。 ### Telegram 工单 Git 上线 用户明确批准上线后,实现已提交推送并在生产 fast-forward 至 6c9422d05566e40c3dfa577dae0a57f7afa9f195。发布前数据库完整转储、配置、原提交及生产既有差异已备份到受保护的 /root/codex-backups/dpl/telegram-tickets-20261011;两张新表迁移成功。发布时私密备份用的 umask 导致 Git 新文件不可供运行用户读取,已只修正受影响的非私密代码文件与父目录权限;备份仍保持私密。视图缓存清理、PHP-FPM 重载和 Horizon 重启完成,站点 HTTP 200,两个服务 active,恢复原有 cron。生产既有教程和存储目录修改保留。 线上实际登录后台,新增工单区域显示并保存成功。机器人令牌已配置,但当前机器人未启用、回调为空、管理员未绑定;未点击连接按钮,未发送真实 Telegram 工单或邮件。下一步由管理员在页面连接机器人并通过一次性命令私聊完成身份绑定,再开启回复并做真实闭环验收。代码上线完成不表示真实工单链路已验收。 ### 管理员邮箱汇报核查 检查当前 app 与 plugins-core 发信入口:工单创建/用户追加内容推送 Telegram,管理员回复的邮件收件人为工单提交用户;收款与节点离线通知也通过 Telegram;用量日报由 master 发送 Telegram。未发现专门向管理员邮箱发送上述汇报的代码,因此没有需要移除的管理员邮件汇报实现。本次不新增全局邮箱封锁,不删除验证码、登录邮件、人工群发或正常用户通知;管理员汇报渠道约束已写入 BUSINESS_RULES.md。该核查不是新的真实工单验收。 用户随后明确关闭管理员邮箱汇报应通过开关保留实现,不能删除代码。已更新业务约束;当前尚未找到此类实际邮件入口,本轮没有删代码,也没有添加没有实际对象的开关。若后续增加该类入口,须提供独立默认关闭的开关。线上机器人现已启用,官方回调地址已注册,管理员绑定数仍为零;真实工单链路尚未验收。 ### Telegram 真实回复排查 管理员完成绑定并开启回复后,已通过正式队列向管理员私聊发送一条隔离测试工单通知。用户确认收到并已使用回复功能发送文字,但现场核对仍未发现管理员回复、关联更新记录或 ticket_reply 邮件。绑定、通知映射、回复权限和官方回调 HTTP 200 均已核对,不能据此宣布真实闭环通过。 补充真实控制器 → 原插件 → 工单与邮件队列的隔离回归,回复按引用消息编号识别而不依赖引用原文;为已绑定管理员增加一小时自动过期、无正文的路由诊断缓存。工单与邮件测试合计 70 项、383 个断言通过,PHP 语法检查通过。修正已提交推送并通过 Git fast-forward 发布至 5b643135e1d197b10819f71a3e501907ffc2c8bf;发布前已备份旧代码及既有差异,PHP-FPM 已重载,PHP-FPM/Horizon 均 active。发布后再次核对测试工单仍无管理员回复或邮件,短期诊断尚无新的管理员消息;真实回复验收仍未通过。 ### 保留原有回复分类 用户表示此前可能回复错了消息,并明确要求保留原来的“引用包含原文才进入工单处理”规则。已恢复该分类条件;消息编号关联、权限和去重校验不变,无正文的短期诊断保留。此调整不代表先前故障已定位或真实闭环已通过;仍需对原始通知发送回复完成验收。 恢复版本 8ccc38908b5071070d1d535afaae92ad9ef40625 已提交推送并通过 Git fast-forward 发布,受影响控制器与生产既有差异已备份,PHP-FPM 重载后与 Horizon 均 active;工单与邮件回归合计 71 项、385 个断言通过。真实工单回复与邮件通知仍待验收。 ### Telegram 工单真实闭环验收通过 用户对原始工单通知使用 Telegram 引用回复后,生产短期诊断确认收到原生回复且命中工单关联。测试工单新增一条管理员回复,reply_status 更新为已回复,关联更新处理记录一条。ticket_reply 邮件通过正式队列走 Resend 提交,并在用户授权的 Proton 测试别名收件箱实际观察到“工单得到了回复”通知,收件人为本次独立测试用户。网站工单推送 → 管理员引用回复 → 写回网站 → 用户邮件到达的真实闭环已通过;保留用户要求的原有引用 text 分类,不再将此前回复错误归因于已证实的代码故障。 重复更新去重、权限拒绝及无有效邮箱等边界由 71 项工单与邮件隔离回归(385 个断言)覆盖,未对真实 Telegram 回调执行人工重放。文档不保留管理员原始回复或机器人凭据。测试用户无套餐权限且已禁用,测试工单保留用于审计,未删除正式数据。 ## 2026-10-11 本地套餐说明调整 购买套餐和结算摘要取消强制插入设备行,只渲染套餐 content。说明可显式使用 {{display_device_limit}},读取虚拟展示值并保留既有实际限制兜底;不会修改实际连接限制。本地四个套餐说明已备份并改为流量、基础月付时长30天、展示设备数三行;流量保留各套餐原值,价格和可购买周期不变。热更新允许 dpl.loc 加载本机 Vite,仍需本地启动标记及监听服务;未部署线上。 本地浏览器已核验四张套餐卡片,设备行仅出现一次且变量正确替换为6、18、200、200;Vue TypeScript检查、PHP语法与两个仓库的diff检查通过。截图在 codex/output/plan-description-20261011/preview.png。未提交、未推送、未上线。 ## 2026-10-11 套餐说明去掉时长并准备上线 最新要求覆盖上一节三行说明:本地四个套餐已去掉套餐时长行,仅保留套餐流量和显式引用虚拟展示设备数的说明。线上只读核对同名同ID套餐及流量/展示设备数一致;准备按两个独立仓库的 Git 版本发布,并仅同步这四个套餐的 content。价格、周期、实际限制不修改。发布与线上页面验收尚未完成。