6.9 KiB
Context
- 后端 8-11 提供的沉默期 C 端能力(接口说明见
junhong_cmp_fiber/docs/2026-10-27-实名即生效套餐沉默期-前端接口变更说明.md第 4、6、9 节):- 套餐历史
GET /api/c/v1/asset/package-history每笔套餐带silence对象,总开关关闭或不适用时不返回。 /api/c/v1/package-silence:GET /eligibility、GET /quote、POST /orders、GET /orders、GET /orders/:id、GET /records。资产须属于当前客户。
- 套餐历史
- C 端现状(
iteration/8-11):- 套餐历史页
pages/asset-package-history通过components/PackageHistoryNode.vue递归渲染主套餐与加油包,api/modules/asset.js的normalizePackageHistoryNode用展开运算保留原字段,silence会原样透传。 - 接口统一走
utils/request.js:code !== 0时 reject 原始响应(含code、msg、data),showError: false可关闭默认提示。 - 支付:套餐购买走
orderApi.create/pay,微信用公众号 JSAPI(wechatH5Pay),支付宝走pages/alipay-payment(u-qrcode渲染二维码 + 复制链接),返回刷新用markPendingPaymentRefresh/consumePendingPaymentRefresh。 - 支付方式标签与过滤在
utils/payment-methods.js,资产信息返回allowed_payment_methods。
- 套餐历史页
- 后端延期下单的支付:
POST /orders只返回qr_content,按商户池路由:支付宝为 WAP 支付链接,微信为微信 H5 支付链接(H5URL),富友为扫码内容。没有返回 JSAPI 支付参数。 - 约束:基于
iteration/8-11,只部署测试环境;不改停复机逻辑;不改现有套餐购买流程。
Goals / Non-Goals
Goals:
- 套餐历史可见沉默期状态与截止日,可延期的套餐有入口。
- 客户能自助完成付费延期并看到结果。
- 金额、可选天数、新截止日全部以后端为准。
Non-Goals:
- 特殊延期、线下登记、批量延期(后台功能)。
- 后端改动,包括为延期订单增加微信 JSAPI 支付。
- 生产发布。
Decisions
D1 沉默期展示放在 PackageHistoryNode 内
在套餐卡片"到期时间"下方加沉默期区域,node.silence 为空时整块不渲染;加油包节点复用同一组件,规则一致。不新开详情页,客户在原页面即可看到状态。状态名直接用后端 silence_status_name,前端只按 silence_status 选颜色(waiting 蓝、expired 红、ended 灰)。
备选:在套餐历史页顶部汇总沉默期。拒绝原因:一个资产可能有多笔套餐,按笔展示更清楚。
D2 新增接口模块 api/modules/packageSilence.js
与现有模块风格一致,导出 packageSilenceApi:getEligibility、quote、createOrder、getOrders、getOrder、getRecords。下单和资格请求 showError: false,由页面按错误码映射提示(D6)。订单列表默认带当前资产 asset_identifier,只看当前资产的订单。
D3 页面结构
新增三个页面并在 pages.json 注册:
| 页面 | 用途 |
|---|---|
pages/silence-extension/silence-extension |
资格、选天数、试算、选支付方式、下单 |
pages/silence-orders/silence-orders |
我的延期订单列表,点击进入详情(详情用同目录 detail 页) |
pages/silence-records/silence-records |
某笔套餐的沉默期流水 |
延期页参数 package_usage_id,流水页参数 package_usage_id。入口:套餐卡片"延期""沉默期记录";"我的延期订单"放在套餐历史页右上角或延期页底部。
D4 天数选择与试算
优先展示 options 档位(每档计费天数、金额、新截止日),默认选第一档;同时提供"自定义天数"输入,输入停止 500ms 后调 quote,以最后一次请求结果为准(丢弃过期响应)。前端只校验 min_days ≤ days ≤ max_days 和整数,金额一律显示后端值(分转元,两位小数)。
D5 下单幂等与支付拉起
request_id在客户点击"确认支付"时生成(时间戳 + 随机串),存在页面状态中;同一次提交的网络重试复用,天数或支付方式变化后清空。- 提交中按钮置为 loading,禁止重复提交。
- 支付宝:复用
openAlipayPayment跳pages/alipay-payment,二维码与复制链接都用qr_content。 - 微信:后端返回的是微信 H5 支付链接或扫码内容,不是 JSAPI 参数。实现时先按"
qr_content是 http(s) 链接则window.location.href跳转,否则用u-qrcode渲染二维码并提示截图扫码"处理,见 Open Questions。 - 拉起前
markPendingPaymentRefresh('silence-extension');延期页与订单详情onShow时consume到标记即查询订单详情。
D6 错误码映射
在 utils/silence-errors.js 维护 1263~1274 的客户提示文案,1265、1266 用 data 中的范围拼接文案;资格接口的 reason 也映射为文案(not_expired、no_silence、extension_disabled、no_policy、exceeds_limit、refunded、order_pending、activated、adjust_pending)。未映射的错误码回退为后端 msg。
D7 测试
沿用 tests/october-h5.test.mjs 的运行方式新增测试:套餐卡片沉默期显示与入口条件、天数校验、request_id 复用规则、错误码映射、支付返回刷新。
Risks / Trade-offs
- [微信 H5 支付链接在微信内置浏览器中通常无法直接支付] → C 端主要在公众号内打开。上线测试前需要确认测试环境商户池给延期订单路由的微信渠道;若确实不能在微信内支付,短期只开放支付宝或二维码,长期需后端为延期订单提供 JSAPI 支付(另开后端变更)。
- [总开关默认关闭,测试环境看不到沉默期] → 验证前请超级管理员在后台打开总开关(打开前有 4 项检查)。
- [支付回跳不可靠] → 不依赖回跳,统一在
onShow查订单详情;订单列表也可手动刷新。 - [延期下单不涉及停复机] → 延期只改套餐沉默期截止日;后端在延期生效后是否复机由后端规则决定,测试环境资产已全部在只读表中,不会真实复机。
Migration Plan
- 在
iteration/8-11上实现并本地build:h5(development 模式,接测试后端)。 - 推送
iteration/8-11部署测试环境(C 端 CI 目前推送未触发构建,需先查原因或手动部署)。 - 测试环境打开沉默期总开关,用测试资产验证:展示、资格、试算、下单、支付、流水。
- 回退:回滚
iteration/8-11对应提交重新部署;后端关闭总开关时前端自动不显示沉默期。
Open Questions
- 延期订单的微信支付方式:测试与生产商户池对延期订单走哪种微信渠道?是否需要后端提供 JSAPI 支付?决定前按 D5 的兜底方式实现。
- "我的延期订单"入口位置(套餐历史页右上角 / 首页功能卡 / 延期页底部),默认放套餐历史页右上角。