[ 已解决] Q3: 观演人信息存储位置 → vr_tickets表(Option B) #3

Closed
opened 2026-04-14 08:55:29 +00:00 by sileya-ai · 1 comment

背景

用户确认"最终提交购买按钮时走 ShopXO 原生订单流程"。

但票务需要收集观演人信息(姓名、手机号、身份证号)。

问题

观演人信息存在哪里?

选项 A:存 sxo_order.extension_data(ShopXO 订单扩展字段)

  • ShopXO 订单有 extension_data(JSON)字段可存储额外信息
  • 优点:与 ShopXO 原生流程一致,不需要额外表
  • 缺点:extension_data 与商品解耦,观演人信息与具体票务商品关联需额外设计

选项 B:存 vr_tickets 表(已有字段)

  • vr_tickets 表已有 real_name、phone、id_card 字段
  • 观演人在购票时填写,支付成功后写入 vr_tickets
  • 优点:与票务逻辑紧耦合,查询方便
  • 缺点:购票时 vr_tickets 还未生成(支付完成后才生成)

选项 C:购票时暂存独立表,支付成功后合并到 vr_tickets

  • 购票流程中:观演人信息暂存 vr_pending_attendees(订单级)
  • 支付成功后:合并到 vr_tickets 表
  • 优点:流程清晰
  • 缺点:增加了数据模型复杂度

选项 D:作为 ShopXO 订单商品扩展表单(ordergoodsform)

  • ShopXO 支持"订单商品扩展表单"机制
  • 参考 plugins/ordergoodsform 插件的实现方式
  • 优点:复用 ShopXO 原生扩展机制
  • 缺点:需要研究 ShopXO 扩展表单的具体实现方式

待验证

  1. ShopXO 的 extension_data 是否支持存储观演人列表(每个座位的观演人不同)?
  2. ShopXO 是否有内置的"订单商品扩展表单"机制可以复用?
  3. 观演人信息是否需要与具体座位(spec_base_id)一一对应?
## 背景 用户确认"最终提交购买按钮时走 ShopXO 原生订单流程"。 但票务需要收集观演人信息(姓名、手机号、身份证号)。 ## 问题 **观演人信息存在哪里?** ### 选项 A:存 sxo_order.extension_data(ShopXO 订单扩展字段) - ShopXO 订单有 extension_data(JSON)字段可存储额外信息 - 优点:与 ShopXO 原生流程一致,不需要额外表 - 缺点:extension_data 与商品解耦,观演人信息与具体票务商品关联需额外设计 ### 选项 B:存 vr_tickets 表(已有字段) - vr_tickets 表已有 real_name、phone、id_card 字段 - 观演人在购票时填写,支付成功后写入 vr_tickets - 优点:与票务逻辑紧耦合,查询方便 - 缺点:购票时 vr_tickets 还未生成(支付完成后才生成) ### 选项 C:购票时暂存独立表,支付成功后合并到 vr_tickets - 购票流程中:观演人信息暂存 `vr_pending_attendees`(订单级) - 支付成功后:合并到 vr_tickets 表 - 优点:流程清晰 - 缺点:增加了数据模型复杂度 ### 选项 D:作为 ShopXO 订单商品扩展表单(ordergoodsform) - ShopXO 支持"订单商品扩展表单"机制 - 参考 plugins/ordergoodsform 插件的实现方式 - 优点:复用 ShopXO 原生扩展机制 - 缺点:需要研究 ShopXO 扩展表单的具体实现方式 ## 待验证 1. ShopXO 的 extension_data 是否支持存储观演人列表(每个座位的观演人不同)? 2. ShopXO 是否有内置的"订单商品扩展表单"机制可以复用? 3. 观演人信息是否需要与具体座位(spec_base_id)一一对应?
Poster
Owner

已解决:观演人信息存储于 vr_tickets 表(Option B)

决策结论

采用 Option B:支付成功后写入 vr_tickets 表。

实现方式

数据流:

  1. 用户在前端票务详情页(ticket_detail.html)填写观演人表单
  2. 提交时,观演人数据写入 ShopXO 订单的 extension_data 字段(JSON)
  3. 支付成功后,onOrderPaid 回调从 extension_data 读取观演人数据
  4. 写入 vr_tickets 表的 real_namephoneid_card 字段

关键代码(TicketService.php:issueTicket):

$extension_data = json_decode($order["extension_data"] ?? "{}"{'}, true);
$attendee = $extension_data["attendee"] ?? [];

$ticket_id = \Db::name(BaseService::table("tickets"))->insertGetId([
    "real_name"  => $attendee["real_name"] ?? "",
    "phone"      => $attendee["phone"] ?? "",
    "id_card"    => $attendee["id_card"] ?? "",
    ...
]);

关于个人信息加密(P1安全问题,已单独建 Issue)

当前实现中 real_namephoneid_card 为明文存储。
Council 安全审计已识别此问题(报告:reviews/code-review-SecurityEngineer.md M-03),属 P1 合规风险
相关 Issue:#7 [安全-P1] M-03 条目。

修复方案:对 id_card 等敏感字段使用 AES-256-CBC 加密存储。
此问题不阻塞当前 Phase 2 开发,属于迭代优化项。

Timeline

  • Q3 由 Architect Round 1(2026-04-14)确认为 Option B
  • Phase 1 实现(2026-04-15)完整落地
  • 个人信息加密列为 P1 待处理
## ✅ 已解决:观演人信息存储于 vr_tickets 表(Option B) ### 决策结论 **采用 Option B:支付成功后写入 vr_tickets 表。** ### 实现方式 **数据流:** 1. 用户在前端票务详情页(ticket_detail.html)填写观演人表单 2. 提交时,观演人数据写入 ShopXO 订单的 `extension_data` 字段(JSON) 3. 支付成功后,`onOrderPaid` 回调从 `extension_data` 读取观演人数据 4. 写入 `vr_tickets` 表的 `real_name`、`phone`、`id_card` 字段 **关键代码(TicketService.php:issueTicket):** ```php $extension_data = json_decode($order["extension_data"] ?? "{}"{'}, true); $attendee = $extension_data["attendee"] ?? []; $ticket_id = \Db::name(BaseService::table("tickets"))->insertGetId([ "real_name" => $attendee["real_name"] ?? "", "phone" => $attendee["phone"] ?? "", "id_card" => $attendee["id_card"] ?? "", ... ]); ``` ### 关于个人信息加密(P1安全问题,已单独建 Issue) 当前实现中 `real_name`、`phone`、`id_card` 为明文存储。 Council 安全审计已识别此问题(报告:`reviews/code-review-SecurityEngineer.md` M-03),属 **P1 合规风险**。 相关 Issue:#7 [安全-P1] M-03 条目。 修复方案:对 `id_card` 等敏感字段使用 AES-256-CBC 加密存储。 此问题不阻塞当前 Phase 2 开发,属于迭代优化项。 ### Timeline - Q3 由 Architect Round 1(2026-04-14)确认为 Option B - Phase 1 实现(2026-04-15)完整落地 - 个人信息加密列为 P1 待处理
sileya-ai changed title from [pending-council] Q3: 观演人信息存储位置 to [ 已解决] Q3: 观演人信息存储位置 → vr_tickets表(Option B) 2026-04-15 01:52:15 +00:00
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#3
There is no content yet.