# 插件扩展面 + 支付 / 内容付费 — 功能清单 ## 状态 - 对应 SPEC:`docs/specs/plugin-extension-commerce/SPEC.md` - 最近更新:2026-08-13 03:40 ## 完成项 ### 核心扩展面 - [x] `Hook::collect` / `Hook::filter` - [x] `ArticleAccess` 决策(作者/admin、密码、filter 只许变严) - [x] `BlogController::show` 改用 ArticleAccess;密码 POST 解锁后再 resolve - [x] 试读+购买主题模板(default;example fallback) - [x] API show 经 ArticleAccess;响应含 `access`;受限无全文 - [x] RSS 受限文无全文 - [x] `ArticleForm` / Table / Create+Edit 挂载 filament.article.* 扩展点 - [x] `plugin.json`:`requires` / `optional` / `docs` - [x] `PluginManager::enable` 依赖校验 + `isEnabled` - [x] 后台插件卡片:依赖展示 + 查看说明 - [x] 使用说明按 locale 选择 `README.zh_CN.md`,Markdown 渲染为 HTML 侧栏弹层(非 Notification 纯文本) ### payment - [x] 插件 migrations + `loadMigrationsFrom` - [x] models:Order / OrderItem / Entitlement / PaymentTransaction - [x] StubGateway 建单 → 确认页 → 入账 → entitlement → `order.paid` - [x] 重复有效权益拒绝建单 - [x] Filament OrderResource + 标记已支付 + 设置/说明页(插件内注册) - [x] 迁出/替换核心 `PaymentPluginPage` 骨架(导航隐藏) - [x] README + lang ### paid-content - [x] 插件骨架 + PSR-4 + `requires: larablog/payment` - [x] `article_products` migration/model - [x] 表单 Section 注入 + after_save 落库 - [x] 与 `read_password` 互斥校验 - [x] `article.access` 收紧 + 试读截断(渲染后 chars) - [x] 表列「付费」标识 - [x] README + lang ### Review 修复(Bugbot 2026-08-12) - [x] `HtmlTeaser` 恒截断,永不返回全文(含 trial ≥ 正文长度) - [x] `article.access` 用 `tightenWith` 逐个折叠,只许变严 - [x] `PluginManager::docsPath` 限制在插件目录内(防路径穿越) - [x] 建单/`markPaid` 事务内复核权益 + pending 单复用 + 跨单重复支付拦截 - [x] checkout 仅接受 `visible`+`published` 文章 - [x] 复用 pending 单时按当前价格重新定价(避免旧价成交) ### 文档与测试 - [x] `docs/plugins.md` 扩展点 / requires - [x] OpenAPI + ApiV1Test 同步(破坏性说明写入 openapi) - [x] PHPUnit:依赖、access 矩阵、Stub、重复下单、API/RSS 防泄露 - [x] 破坏性变更说明(匿名 API/RSS 不再泄密码/付费全文) ## 变更记录 | 时间 | 原因 | 变更 | |------|------|------| | 2026-08-12 00:17 | SPEC 定稿后初版 | 创建功能清单 | | 2026-08-12 00:35 | 实现完成 | 勾选全部完成项 | | 2026-08-12 01:01 | Bugbot review 5 项发现 | 新增「Review 修复」分组并全部完成 | | 2026-08-12 01:12 | 用户确认「复用刷新为当前价」 | 补充 pending 单重新定价完成项 | | 2026-08-13 03:40 | 使用说明英文且无排版 | 中文 README + Markdown 弹层渲染 |