本域总览见《账号计费中心 · 结构大纲》。全文分六段:定位与边界 / 角色与依赖 / 数据模型 / 核心流程 / 接口契约 / 关键约束与验收标准。
定位:把「用户想买的东西」变成「账上可用的钱」。本域回答买什么、多少钱(商品与价目)、怎么付(渠道与下单)、钱何时算到账(回调、人工确认、关单与查单自愈),并承载订阅套餐账本与密钥台账。
核心概念
| 概念 | 口径 |
|---|---|
| 商品 | kind 只取 recharge;商品行不承载售价,只有规格(meta)与可见性(status 取 listed / unlisted)。 |
| 售价版本 | product_prices 的有效区间快照:当前价 = 区间未闭合那条;调价 = 关旧价 + 落新价。 |
| 价目规则版本 | price_rules 按整版本发布,供计量方读单价;本域不二次核算扣费。 |
| 订单 | 购买意图事实行,幂等键 = order_no;下单定格商品与渠道快照,调价下架不回改历史单。 |
| 支付渠道 | pay_channel_configs:四道闸门齐备且灰度放行才对客户可见;模式取 mock / sandbox / production / manual。 |
| 账户访问密钥 | account_api_keys:明文仅创建时返回一次,库存哈希,消耗归因落到组。 |
| 订阅套餐账本 | 每客户每商品至多一个在营订阅;周期额度以新发额度包承载,到期即过期,等同于额度重置。 |
边界
关键口径
order_no(全局唯一)与下单意图级 client_request_id(同客户唯一,重复提交返回原单)。ref_order 等于订单号且类型为 recharge 的那行;赠金等类型同键不阻断入账。参与角色:客户(门户下单人,订单与密钥归属工作区、操作人为成员本人)、组织 Owner / Admin(可处置全组织密钥行)、组管理员(密钥可见范围收窄到其管理的组与本人名下)、运营(带运营令牌与操作人标识)、在册平台员工(灰度判据,非权限体系)、数据面网关(以明文密钥现取校验台账)、计量方(读价目规则版本)、渠道(外部支付网关与对公资金账户)。
能力矩阵(组织角色与组内角色相互独立)
| 操作 | Owner / 组织 Admin | 组管理员 | 普通成员 | 运营 |
|---|---|---|---|---|
| 创建密钥(归属本人) | ✓ 可指定本工作区任意启用组 | ✓ 限本人所在组 | ✓ 限所在组或默认组 | ✗ |
| 改 / 停用 / 启用 / 软删密钥 | ✓ 全工作区任意行 | 仅本人名下 | 仅本人名下 | ✗ |
| 商品与价目维护 | ✗ | ✗ | ✗ | ✓ |
| 渠道配置、探活与灰度放行 | ✗ | ✗ | ✗ | ✓ |
| 对公人工确认 / 强制查单 | ✗ | ✗ | ✗ | ✓ 须在册且具出款范围 |
上游依赖
| 上游 | 依赖内容 |
|---|---|
| 账号与身份域 | 门户令牌解析出的用户;协议同意版本(下单出口按当前版本比对) |
| 租户与组织域 | 工作区、成员与角色、组(含默认组)、组启停状态 |
| 钱包与账务域 | 入账原语(充值 → 现金余额)、流水幂等键、余额位数与欠费重算 |
| 运营管理域 | 平台员工在册事实与运营面配置权限范围 |
下游被引用
| 引用方 | 引用内容 | 语义 |
|---|---|---|
| 计量与计费域 | price_rules 版本快照 |
按 model_glob 匹配,重叠取 priority 高者;无匹配即未定价 |
| 钱包与账务域 | 订单与 order_no |
入账幂等键(ref_order)与流水归属 |
| 退款与对账域 | 订单状态机与渠道列 | 退款只接受已支付订单;对账按订单渠道过滤 |
| 数据面网关 | 密钥现取校验 | 明文现取 → 台账(归属组与工作区、状态、额度、过期) |
| 风控与合规域 | 密钥台账只读视图 | 封禁 / 解封 / 停用 / 启用(详见 D09) |
customers/organizations/groups/users由他域持有,本域只以归属列引用;订阅周期额度经额度账本的归属列关联(额度账本属钱包与账务域,本域只写归属、不持余额)。
| 表 | 职责 | 关键字段 |
|---|---|---|
| products | 商品定义:仅现金充值面额,只控可见性 | code / kind / name / meta / status |
| product_prices | 售价版本的有效区间快照 | product_id / price_cents / effective_from / effective_to |
| price_rules | 计价规则整版本(单价参考) | version / effective_from / model_glob / unit_price_cents_per_1k_tokens / tier / priority |
| customer_orders | 订购订单事实,order_no 为业务幂等键 | customer_id / order_no / client_request_id / product_code / amount / channel / status / channel_trade_no / channel_raw / meta / paid_at / expires_at / order_poll_attempt_at / order_last_polled_at |
| customer_subscriptions | 订阅套餐账本:每客户每商品一个在营订阅 | customer_id / product_code / cycle_days / quota_tokens / price_cents / status / current_cycle_start / current_cycle_end / cancel_reason |
| pay_channel_configs | 渠道配置:每渠道每模式一行、每渠道至多一行启用 | channel / is_active / mode / rollout_stage / probe_ok_at / last_probe_error / credentials_encrypted / gateway_url / notify_url / return_url / bank_account_name / bank_account_no / bank_name |
| account_api_keys | 账户访问密钥台账(明文仅创建时一次) | organization_id / user_id / group_id / name / key_prefix / key_hash / quotas / ip_allowlist / expires_at / status / deleted_at |
code 唯一、kind 只取 recharge;售价只在 product_prices 上版本化。effective_to 为空那条;调价先关旧价再落新价,新价生效时点不得早于当前价生效时点(不得抹掉价格历史)。order_no 全局唯一;(客户, client_request_id) 唯一(部分索引,空值互不相等,未携带该键的下单不受约束)。pending / paid / failed / cancelled / refunding / refund_processing / refunded / refund_failed / refund_unknown;expires_at 非空,金额为元 6 位小数。(客户, 商品) 至多一行在营订阅(部分唯一索引)。(渠道, 模式) 唯一;每渠道至多一行启用(部分唯一索引,不同渠道可同时启用)。key_hash 唯一、明文不落库;软删(deleted_at 非空即视为不存在)保流水追溯。quotas 承载 day / week / month / total,缺省即不限;单值上界与请求口径同源(QUOTA_VALUE_MAX)。day / week / month / total),缺省即不限,清空即回到不限;来源白名单逐项须为地址或网段、去重保序、上限 20 条,空列表即不限制来源。/api/account)| 方法 | 路径 | 语义 |
|---|---|---|
| GET | /api/account/products |
公开目录:仅已上架商品,可按类型过滤 |
| GET | /api/account/products/{code} |
商品详情:未上架与不存在一律 404 |
| GET | /api/account/price-rules |
计费公示:仅当前有效版本;未发布返回空 |
| GET | /api/account/pay-channels |
当前用户可见渠道(含对公收款账户明文) |
/api/account)| 方法 | 路径 | 语义 |
|---|---|---|
| POST | /api/account/orders |
下单 → 待支付订单 + 支付参数;带意图幂等键时重复提交返回原单 |
| GET | /api/account/orders |
我的订单(时间倒序,最多 50 条) |
| GET | /api/account/orders/{order_no} |
订单详情(字段白名单,不透渠道原始回执) |
| POST | /api/account/orders/{order_no}/refund-apply |
申请退款(审批与出款详见 D07) |
| POST | /api/account/payments/callback/{channel} |
渠道支付回调:验签优先 → 订单定位 → 渠道一致性 → 金额一致性 → 幂等入账 |
/internal)| 方法 | 路径 | 语义 |
|---|---|---|
| POST | /internal/products |
新建商品 + 初始当前价(充值面额须等于售价) |
| PUT | /internal/products/{code} |
改规格与上架状态(编码与类型不可改) |
| POST | /internal/products/{code}/prices |
新价格版本:关旧价区间 + 落新价 |
| POST | /internal/price-rules |
发布计价规则整版本 |
| GET | /internal/products |
管理列表(含未上架):当前价 |
| GET | /internal/products/{code}/prices |
价格历史(区间回查) |
| GET | /internal/price-rules |
计价规则版本快照(可按版本号读) |
/internal/pay,下表为前缀内相对路径)| 方法 | 路径 | 语义 |
|---|---|---|
| GET | /status |
当前生效支付模式与来源(配置行优先,部署配置兜底) |
| GET | /channels |
配置列表(启用行在前;密钥类只回是否已配置) |
| POST | /channels |
新建配置(不自动启用;同渠道同模式只能一条) |
| PATCH | /channels/{config_id} |
部分更新:凭据留空不改;触及探活相关字段即作废调测证据 |
| POST | /channels/{config_id}/activate |
启用(同事务清零同渠道其他行;默认落灰度) |
| POST | /channels/{config_id}/rollout |
灰度与对外切换 |
| POST | /channels/{config_id}/deactivate |
停用(幂等) |
| DELETE | /channels/{config_id} |
删除配置(启用行拒绝,须先停用) |
| POST | /channels/{config_id}/probe |
探活:只读查询验签,落库为调测证据 |
/internal)| 方法 | 路径 | 语义 |
|---|---|---|
| POST | /internal/orders/{order_no}/confirm |
对公人工确认 → 已支付 + 入账 |
| POST | /internal/orders/expire |
超时关单(幂等,可重复触发) |
| POST | /internal/orders/poll |
主动查单(幂等、自愈、多副本安全) |
| GET | /internal/orders |
运营订单列表(可按状态筛选,含工作区名) |
| GET | /internal/orders/{order_no} |
订单详情(含渠道原始回执) |
/internal)| 方法 | 路径 | 语义 |
|---|---|---|
| POST | /internal/api-keys/lookup |
哈希命中且未软删 → 台账(归属组与工作区、状态、额度、过期),不返回明文 |
/api/account/ops)| 方法 | 路径 | 语义 |
|---|---|---|
| GET | /api/account/ops/payments/status |
生效支付模式与来源 |
| GET | /api/account/ops/payments/channels |
渠道配置列表 |
| POST | /api/account/ops/payments/channels |
新建配置 |
| PATCH | /api/account/ops/payments/channels/{config_id} |
编辑配置(凭据留空不改) |
| POST | /api/account/ops/payments/channels/{config_id}/activate |
启用渠道 |
| POST | /api/account/ops/payments/channels/{config_id}/rollout |
灰度与对外切换 |
| POST | /api/account/ops/payments/channels/{config_id}/deactivate |
停用渠道 |
| POST | /api/account/ops/payments/channels/{config_id}/probe |
渠道探活 |
| DELETE | /api/account/ops/payments/channels/{config_id} |
删除渠道配置 |
| GET | /api/account/ops/orders |
运营订单列表 |
| GET | /api/account/ops/orders/{order_no} |
运营订单详情 |
| POST | /api/account/ops/orders/{order_no}/confirm |
对公人工确认(运营令牌路径) |
| POST | /api/account/ops/orders/{order_no}/query |
单笔强制查单(跳过退避) |
| POST | /api/account/ops/orders/poll |
整轮主动查单 |
| GET | /api/account/ops/orders/refunds/offline-pending |
待线下打款核对清单(详见 D07) |
| GET | /api/account/ops/orders/{order_no}/refund-risk |
退款审批画像(详见 D07 与 D09) |
order_no 为幂等键、以 recharge 类型流水为唯一判据;重复回调、重复确认、查单收敛三源并发时净效果为恰好一次入账。| # | 验收口径 |
|---|---|
| 1 | 同一意图幂等键重复下单返回同一订单号,不产生新订单与新流水;并发同键提交仅落一行 |
| 2 | 不带意图幂等键的下单撞订单号时自动重试,多次撞号后仍失败才抛冲突,不出现以撞号为由的 500 |
| 3 | 同一订单重复回调仅首次入账,其后幂等返回当前余额;余额取已提交真值,并发双充值下响应余额含本笔 |
| 4 | 回调金额与订单金额不一致 → 拒绝且余额不变;对公确认实收金额不一致 → 拒绝且余额不变 |
| 5 | 未知订单号的回调与签名错误的回调应答姿态一致;渠道不一致的回调被明确拒绝 |
| 6 | 已支付订单再收回调 → 幂等返回;已取消订单收回调 → 拒绝(不复活),由查单路径处置 |
| 7 | 超时关单只改写已过期的待支付订单;关单后渠道确认收款的订单可被复活入账,金额不一致时保持关单并告警 |
| 8 | 关单扫描多副本并发不产生重复关单审计;关闭自动扫描后手动触发仍可用 |
| 9 | 渠道未启用 / 凭据不全 / 未探活 / 灰度未放行时,既不出现在门户列表也不可下单(同一份判定) |
| 10 | 启用渠道默认落灰度:非在册员工看不到;放行对外后普通用户可见;回退灰度后立即不可见 |
| 11 | 同渠道启用新行时旧行自动停用;不同渠道可同时启用;启用行删除被拒绝 |
| 12 | 修改密钥类凭据后调测证据被作废,渠道回到待调测态,无法直接放行对外 |
| 13 | 渠道配置响应中密钥类字段只出现「是否已配置」布尔,不出现明文;对公收款账户为明文 |
| 14 | 密钥创建响应含明文一次,此后任何查询都不返回明文;软删后现取校验返回未找到,流水仍可追溯 |
| 15 | 密钥额度按多周期生效,缺省即不限;来源白名单超过 20 条或含非法项 → 拒绝 |
| 16 | 成员移出工作区后其名下工作区内启用的密钥全部停用;组停用后组下启用的密钥全部停用,组恢复后密钥仍为停用 |
| 17 | 调价后新下单按下单时当前价定格;历史价格可按区间回查;新价生效时点早于当前价生效时点被拒绝 |
| 18 | 计价规则按整版本发布,同版本重叠命中取优先级高者;未发布时公开公示返回空 |
| 19 | 同客户同商品的并发订阅开通至多一行在营订阅;取消后可重新订阅开新行 |
| 20 | 运营令牌缺失或操作人非在册平台员工时对公确认被拒;非人工确认型渠道被拒;实收金额缺失被拒 |