# C 端 H5 页面接口矩阵 > C 端是独立 H5,使用个人客户体系和 `/api/c/v1`,不复用管理 Web/H5 的账号密码登录、菜单或角色。 ## 一、C 端产品定位 当前 C 端是“围绕资产提供查询、充值、购包和设备控制”的服务 H5,不是完整电商商城。 客户通常从资产二维码、设备标签或外部链接进入,通过资产标识完成验证和微信身份登录。登录后可查看本人绑定的卡或设备,并围绕该资产操作。 首期不应设计购物车、商品分类、收货地址簿等页面,因为当前没有对应后端能力。 ## 二、进入与登录流程 ```mermaid sequenceDiagram participant U as 客户 participant H as C端H5 participant A as 后端 participant W as 微信 U->>H: 扫码或输入资产标识 H->>A: POST /auth/verify-asset A-->>H: asset_token、资产类型、微信配置 H->>W: 公众号OAuth或小程序登录 W-->>H: code H->>A: POST /auth/wechat-login 或 miniapp-login A-->>H: JWT、客户信息、need_bind_phone alt 需要绑定手机号 H->>A: POST /auth/send-code H->>A: POST /auth/bind-phone end H->>A: GET /asset/info A-->>H: 资产首页数据 ``` 关键约束: - `verify-asset` 支持 ICCID、虚拟号、MSISDN、IMEI、SN。 - 设备内绑定卡不能以独立卡身份登录,应提示客户使用设备标识。 - `asset_token` 是短期登录凭证,不等同于登录后的 JWT。 - C 端 JWT 由签名和 Redis 当前 Token 双重校验;同一客户后登录可能使旧会话失效。 - C 端没有 Refresh Token 接口,认证失效后重新走资产验证和微信登录。 ## 三、页面矩阵 ### 3.1 启动、登录和账户 | 页面 | 输入 | 展示字段 | 操作 | 接口 | | --- | --- | --- | --- | --- | | 启动初始化 | 当前完整 URL | `app_id`、JSSDK 配置、环境错误 | 初始化微信能力 | `GET /wechat/appid`、`GET /wechat/jssdk-config` | | 资产验证 | 资产标识 | 资产类型、脱敏资产摘要、登录提示 | 验证并获取 `asset_token` | `POST /auth/verify-asset` | | 微信登录 | `asset_token`、OAuth `code` | 客户、是否新用户、是否需绑手机、Token | 公众号/小程序登录 | `POST /auth/wechat-login`、`POST /auth/miniapp-login` | | 手机号绑定 | 手机号、验证码 | 绑定结果 | 发送验证码、绑定、更换手机号 | `/auth/send-code`、`/auth/bind-phone`、`/auth/change-phone` | | 个人资料 | 无或昵称、头像 | 客户 ID、昵称、头像、手机号、状态 | 查看、更新 | `GET|PUT /profile` | | 退出登录 | 无 | 无 | 使当前 Token 失效 | `POST /auth/logout` | 公开接口必须在没有 Bearer Token 时也能访问:微信配置、资产验证、微信/小程序登录、发送验证码。 ### 3.2 资产首页 | 区块 | 关键展示字段 | 交互 | 接口 | | --- | --- | --- | --- | | 资产身份 | `asset_type`、主标识、ICCID/虚拟号/IMEI/SN、设备名 | 复制标识 | `GET /asset/info` | | 状态 | 业务状态、网络/在线状态、实名状态及名称、最后同步时间 | 刷新 | `GET /asset/info`、`POST /asset/refresh` | | 流量 | 总量、已用、剩余、使用比例、周期 | 查看套餐历史 | `GET /asset/info`、`GET /asset/package-history` | | 当前套餐 | 套餐名、类型、生效/到期、预计最终到期、排队信息 | 查看可购套餐 | `GET /asset/info` | | 钱包 | 余额、冻结金额、资产类型 | 充值、查看流水 | `GET /wallet/detail` | | 实名 | `effective_realname_policy`、`realname_required`、`realname_status` | 去实名 | `GET /asset/info`、`GET /realname/link` | | 支付能力 | `allowed_payment_methods` | 控制购买和充值按钮 | `GET /asset/info` | 前端不得根据“卡还是设备”自行推断实名策略和支付方式。 ### 3.3 套餐购买 | 页面 | 主要输入/筛选 | 展示字段 | 操作 | 接口 | | --- | --- | --- | --- | --- | | 可购套餐 | 资产标识、分页/类型(以 OpenAPI 为准) | 套餐 ID、名称、系列、类型、流量、周期、售价、上下架/可购状态、有效期说明 | 选择套餐 | `GET /asset/packages` | | 下单确认 | 资产标识、套餐 ID、支付方式、应用类型 | 资产、套餐、价格、实名要求、强充提示、允许支付方式 | 创建订单 | `POST /orders/create` | | 支付 | 订单 ID | 应付金额、支付方式、订单状态 | 钱包支付、微信支付、支付宝支付 | `POST /orders/:id/pay` | | 订单列表 | 状态、分页 | 订单号、资产、套餐、金额、支付方式、状态名称、创建时间 | 查看详情 | `GET /orders` | | 订单详情 | 订单 ID | 订单、套餐、资产、金额、支付、状态时间、权益结果 | 重新支付 | `GET /orders/:id` | 调用顺序: 1. 先查询 `/asset/info`,取得实名策略和允许支付方式。 2. 查询 `/asset/packages`。 3. 提交 `/orders/create`。 4. 如果响应已包含强充支付参数,按响应拉起支付。 5. 普通待支付订单调用 `/orders/:id/pay`。 6. 钱包支付成功后直接刷新详情;第三方支付返回页面后重新查询订单详情。 当前没有独立 C 端支付状态接口,也没有客户端主动取消订单接口。页面通过订单详情确认后端最终状态。 ### 3.4 钱包与充值 | 页面 | 输入/筛选 | 展示字段 | 操作 | 接口 | | --- | --- | --- | --- | --- | | 钱包详情 | 资产标识 | 资产类型/ID、余额、冻结金额、可用余额 | 进入充值 | `GET /wallet/detail` | | 钱包流水 | 类型、时间、分页 | 流水号、变动金额、前后余额、业务类型、关联订单、状态、时间 | 查看关联业务 | `GET /wallet/transactions` | | 充值校验 | 资产标识、金额/场景 | 最低/最高金额、允许支付方式、实名/强充规则 | 进入充值 | `GET /wallet/recharge-check` | | 创建充值 | 资产、金额、支付方式、应用类型、幂等请求标识 | 充值单号、支付参数或支付宝链接、状态 | 拉起支付 | `POST /wallet/recharge` | | 充值记录 | 状态、分页 | 充值单号、金额、方式、支付状态、到账状态、时间 | 查看详情 | `GET /wallet/recharges`、`GET /recharge-orders` | | 充值详情 | 充值订单 ID | 金额、资产、渠道、第三方单号、支付/到账时间、状态名称 | 刷新状态 | `GET /recharge-orders/:id` | 充值只使用接口返回的支付方式。钱包不能给自己钱包充值,因此强充和普通充值通常只提供微信、支付宝等第三方方式。 ### 3.5 实名 | 页面 | 输入 | 展示字段 | 操作 | 接口 | | --- | --- | --- | --- | --- | | 实名引导 | 资产标识 | 是否需要实名、实名状态、模式、运营商、提示 | 获取实名链接 | `GET /realname/link` | 可能的策略: - `none`:无需实名。 - `before_order`:未实名时禁止充值或购买。 - `after_order`:可先购买,支付后继续引导实名。 页面必须使用 `effective_realname_policy`,不能只读资产原始策略。 ### 3.6 设备控制 仅设备资产显示该模块。 | 页面/动作 | 输入 | 展示字段 | 接口 | | --- | --- | --- | --- | | 卡槽列表 | 设备标识 | 卡槽号、ICCID、运营商、网络/实名/激活状态、当前卡 | `GET /device/cards` | | 切卡 | 设备标识、目标卡/卡槽 | 操作结果、当前卡 | `POST /device/switch-card` | | 配置 WiFi | SSID、密码等 DTO 字段 | 操作结果 | `POST /device/wifi` | | 重启 | 设备标识 | 操作结果 | `POST /device/reboot` | | 恢复出厂 | 设备标识、确认 | 操作结果 | `POST /device/factory-reset` | 重启、切卡、WiFi、恢复出厂都应防止重复点击;恢复出厂必须二次确认。 ### 3.7 换货 | 页面 | 输入 | 展示字段 | 操作 | 接口 | | --- | --- | --- | --- | --- | | 待处理换货提醒 | 当前登录资产 | 换货单号、旧资产、状态、提交期限 | 进入收货信息 | `GET /exchange/pending` | | 收货信息 | 收件人、手机号、地区、详细地址 | 换货摘要 | 提交 | `POST /exchange/:id/shipping-info` | C 端不能创建、发货、完成或取消换货,只负责查询待补资料换货单并提交收货信息。 ### 3.8 通知 | 页面 | 筛选/输入 | 展示字段 | 操作 | 接口 | | --- | --- | --- | --- | --- | | 未读提示 | 无 | 未读数 | 打开通知中心 | `GET /notifications/unread-count` | | 通知列表 | 类型、状态、分页 | 类型、标题、内容、风险、关联资源、时间、已读状态 | 标记已读 | `GET /notifications`、`PUT /notifications/:id/read` | | 全部已读 | 无 | 无 | 全部标记已读 | `PUT /notifications/read-all` | ## 四、全局交互状态 C 端至少统一处理: - 首次加载、局部刷新、空数据和网络异常。 - Token 失效后回到资产验证入口,并保留当前进入链接。 - 403 表示当前客户未绑定该资产或无权操作,不显示“资产不存在”的差异提示。 - 支付取消、支付失败、支付结果未知和支付成功。 - Gateway 操作已提交但结果未知,禁止无限自动重试。 - 订单、充值、换货使用后端 `status_name` 展示中文状态。 ## 五、当前缺口 以下页面没有现成接口支撑,不纳入首期: - 独立商品详情和商品分类。 - 购物车。 - 收货地址簿。 - 客户主动取消订单。 - 客户主动申请退款。 - 客户资产列表和主动切换当前资产。 - 独立支付状态查询。 若产品要求其中任一能力,应先作为独立后端用例设计,不能只在前端模拟。