Phase 4:发票·核销·票夹(QR签名+Feistel短码+出票链路) #17

Open
opened 2026-04-20 15:45:47 +00:00 by sileya-ai · 1 comment

阶段目标

完成 Phase 4 三大功能:

  1. C端票夹:用户查看已购票 + QR码 + Feistel短码 + 核销状态
  2. B端核销页:工作人员扫码/输入短码 → 票验证 → 核销
  3. 出票链路闭环:支付成功 → 生成 vr_tickets → 用户可见票

码体系设计(已确认)

QR码(JWT签名,防无人值守暴力破解)

  • Payload: {id, g(goods_id), iat, exp, sig}
  • 签名: HMAC-SHA256(签名字符串, secret)[0:8]
  • 有效期: 30min,客户端本地缓存

短码(Feistel混淆)

  • goods_id(base36×4位固定) + ticket_id(base36×可变) → Feistel8混淆
  • 长度: 6~8字符,不区分大小写
  • per-goods key: HMAC-SHA256(master_secret, goods_id)

参考文档

  • docs/PHASE_4_PLAN.md(完整规划)

调研确认

  • hook在pay_status=1后触发,正确
  • extension_data完全可读
  • API路由PluginsService::PluginsControlCall动态映射
  • JsBarcode v3.11.5已内置
  • ⚠️ 需新建api/和index/目录

验收标准

  • 支付成功 → vr_tickets有记录
  • C端票夹展示QR + 短码 + 核销状态
  • QR 30min缓存逻辑
  • B端扫码核销成功
  • 全链路贯通
## 阶段目标 完成 Phase 4 三大功能: 1. **C端票夹**:用户查看已购票 + QR码 + Feistel短码 + 核销状态 2. **B端核销页**:工作人员扫码/输入短码 → 票验证 → 核销 3. **出票链路闭环**:支付成功 → 生成 vr_tickets → 用户可见票 ## 码体系设计(已确认) ### QR码(JWT签名,防无人值守暴力破解) - Payload: {id, g(goods_id), iat, exp, sig} - 签名: HMAC-SHA256(签名字符串, secret)[0:8] - 有效期: 30min,客户端本地缓存 ### 短码(Feistel混淆) - goods_id(base36×4位固定) + ticket_id(base36×可变) → Feistel8混淆 - 长度: 6~8字符,不区分大小写 - per-goods key: HMAC-SHA256(master_secret, goods_id) ## 参考文档 - docs/PHASE_4_PLAN.md(完整规划) ## 调研确认 - ✅ hook在pay_status=1后触发,正确 - ✅ extension_data完全可读 - ✅ API路由PluginsService::PluginsControlCall动态映射 - ✅ JsBarcode v3.11.5已内置 - ⚠️ 需新建api/和index/目录 ## 验收标准 - [ ] 支付成功 → vr_tickets有记录 - [ ] C端票夹展示QR + 短码 + 核销状态 - [ ] QR 30min缓存逻辑 - [ ] B端扫码核销成功 - [ ] 全链路贯通
sileya-ai changed title from Phase 3 前端:多座位下单 Demo(P0) to Phase 3:支付回调 + 观演人 QR 票生成(vrt_tickets 表写入) 2026-04-21 17:18:17 +00:00
sileya-ai changed title from Phase 3:支付回调 + 观演人 QR 票生成(vrt_tickets 表写入) to Phase 4:发票·核销·票夹(QR签名+Feistel短码+出票链路) 2026-04-22 08:38:59 +00:00
Poster
Owner

进度更新(2026-04-25)

Task 1: C端票夹 — 已完成

  • 票夹页面 + API + ticket_card弹窗组件 (2026-04-24)
  • JsBarcode 本地化(cdn.jsdelivr → ShopXO自带v3.11.5)(2026-04-25)

Task 2: B端核销 — 未开始(Issue #21已纠正状态)

  • B端核销API(admin/controller/Ticket.php):文件不存在
  • B端核销页(admin/view/ticket/verify.html):文件不存在

⚠️ Issue #7 安全问题(8个P1,全部未修复)

  • M-01: verifyTicket TOCTOU 竞态 → 原子更新
  • M-02: 手动核销无鉴权 → B端开发时处理
  • M-03: ALTER TABLE永不执行 → 快速修复
  • M-04: loadSoldSeats()未实现 → 超卖风险,P0
  • M-05: verifier_id伪造 → B端开发时处理
  • M-06: Admin控制器无权限校验 → B端开发前必须修复
  • M-07: QR明文暴露ticket_code → 评估
  • M-08: issueTicket二次写入时序 → B端开发时处理

📋 下一步计划(详见 Issue #22)

  1. M-04: 修复 loadSoldSeats() — 超卖防护
  2. M-06: Admin权限校验 — 安全基线
  3. B端核销开发 — 核销API + 页面
## 进度更新(2026-04-25) ### ✅ Task 1: C端票夹 — 已完成 - 票夹页面 + API + ticket_card弹窗组件 ✅(2026-04-24) - JsBarcode 本地化(cdn.jsdelivr → ShopXO自带v3.11.5)✅(2026-04-25) ### ❌ Task 2: B端核销 — 未开始(Issue #21已纠正状态) - B端核销API(admin/controller/Ticket.php):文件不存在 - B端核销页(admin/view/ticket/verify.html):文件不存在 ### ⚠️ Issue #7 安全问题(8个P1,全部未修复) - M-01: verifyTicket TOCTOU 竞态 → 原子更新 - M-02: 手动核销无鉴权 → B端开发时处理 - M-03: ALTER TABLE永不执行 → 快速修复 - M-04: loadSoldSeats()未实现 → **超卖风险,P0** - M-05: verifier_id伪造 → B端开发时处理 - M-06: Admin控制器无权限校验 → **B端开发前必须修复** - M-07: QR明文暴露ticket_code → 评估 - M-08: issueTicket二次写入时序 → B端开发时处理 ### 📋 下一步计划(详见 Issue #22) 1. **M-04: 修复 loadSoldSeats()** — 超卖防护 2. **M-06: Admin权限校验** — 安全基线 3. **B端核销开发** — 核销API + 页面
Sign in to join this conversation.
No Label
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: sileya-ai/vr-shopxo-plugin#17
There is no content yet.