D09 风控与合规域 · 设计文档

本域总览见《账号计费中心 · 结构大纲》。本文为该域完整设计:定位与边界 / 角色与依赖 / 数据模型 / 核心流程 / 接口契约 / 关键约束与验收标准。 章节顺序理由:先数据模型(事实结构)→ 再核心流程(结构之上的运行路径)→ 最后接口契约(流程的对外投影)。


1. 定位与边界

定位:本域承载门禁的判定口径、扫描与处置的闭环、实名合规的事实。

关键口径

概念 承载 语义
规则目录 risk_rules rule_type 四值:usage_spike / usage_spike_ratio / reconcile / waiver_spike;scope_org_id 为空即平台级,非空为单组织规则
命中台账 risk_events 每次命中一行:规则、客户、组织、组、触发值与阈值快照、动作、状态、命中时刻
命中状态 status 仅两态:active(待处置)/ resolved(已处置)
触发值随类型解释 trigger_tokens / threshold_tokens 用量类为 tokens,对账类为异常金额分整数,免计费类为话单计数
规则动作 action notify(只告警)/ notify_and_downshift(告警 + 生效限速减半,解除前持续)
个人核验 user_real_name_verifications 一次提交一行;终态 verified / failed / error
企业核验 org_real_name_verifications 一次认证一行;终态 verified / failed
实名等级 identity_level L0 未实名/未认证、L1 个人二要素或企业主体认证、L2 企业资金权限认证
密钥可用性 account_api_keys status 两态 active / disabled;封禁即不可调用,软删行不进处置清单

边界

归属口径:本域端点 = 门户实名校验链 /api/account/real-name(5)+ 内部运营链 /internal/risk(9)+ 运营面风控与实名复核段(11);两条运营通道共用同一实现。


2. 角色与依赖

能力矩阵

能力 运营面 内部运营链 门户用户 调度方
规则目录增改查 / 触发扫描 ✓ ✓ ✗ ✓(周期)
台账查询与解除 / 密钥封禁解封 ✓ ✓ ✗ ✗
个人实名提交与查询 ✗ ✗ ✓(本人) ✗
企业实名发起与自助确认 ✗ ✗ ✓(组织管理员) ✗
企业实名运营复核定案 ✓ ✗ ✗ ✗

上游依赖

上游 依赖内容 语义
计量与计费域 用量日聚合(组织 + 组 + 日)、扣减流水金额、免计费留痕计数 三类扫描的只读判据输入,本域不重算计量口径
钱包与账务域 组织到客户的映射、现金余额与可用额度 台账行的客户归属与门禁、账龄判定的读数源
租户与组织域 组织存在性、主体性质、实名状态与等级、组织名与信用代码 实名主体与票种门禁的判定输入
订购与支付域 密钥台账(归属组织与组、展示前缀、软删标记、状态) 风控处置的对象与处置后的可用性
身份域 登录失败计数与验证码门禁、协议同意留痕 门禁策略口径的落点,本域不实现

下游被引用

引用方 引用内容 语义
计费路由(router) 生效限速参数、密钥可用性判定 限速下调的执行面;扣费第二层按密钥状态拒绝被禁用密钥
运营管理域 规则变更、事件解除、密钥处置、实名复核的审计行 四类动作留痕,供运营台与合规追溯
发票域 实名等级对票种的判定入口 普票需 L1、专票需企业 L2、个人恒不可专票(详见 D08)
用户自助与门户域 实名状态与等级、协议重新确认标记、告警站内信 客户视角展示(编排详见 D12)

3. 数据模型

3.1 域内关联总览

规则命中客户维度,删除级联组织维度,删除级联认证主体,删除级联提交/确认/审核人,置空删除核验对象,删除级联

risk_rules

uuid

id

PK

string

rule_type

四值见口径表

uuid

scope_org_id

空=平台级

bigint

threshold_tokens

阈值或容差

int

window_days

窗口天数

jsonb

params

环比参数

string

action

notify / notify_and_downshift

boolean

enabled

启用开关

risk_events

uuid

id

PK

uuid

rule_id

FK

命中规则,删除级联

uuid

customer_id

FK

客户,删除级联

uuid

organization_id

FK

组织,删除级联

uuid

group_id

组定位,无外键

bigint

trigger_tokens

触发值快照

bigint

threshold_tokens

阈值快照

string

status

active / resolved

timestamp

triggered_at

去重基准时刻

customers

organizations

org_real_name_verifications

uuid

id

PK

uuid

organization_id

FK

认证主体,删除级联

string

channel

渠道标识

string

status

pending / verified / failed

int

expected_amount_cents

应打款金额,可空

smallint

attempt_count

金额比对失败次数

string

fail_reason

失败原因

uuid

submitted_by

FK

企业侧提交人,置空删除

uuid

reviewed_by

FK

平台侧审核人,置空删除

timestamp

reviewed_at

string

review_note

审核结论说明

users

user_real_name_verifications

uuid

id

PK

uuid

user_id

FK

核验对象,删除级联

string

channel

id2_real / id2_mock

string

status

pending / verified / failed / error

string

id_no_last4

证件号末四位

string

consent_version

单独同意版本

图 1

group_id 只作定位线索、不建外键:组可能被停用,台账必须留在历史里可查。核验记录的操作人列都是置空删除——用户注销不连带抹掉实名事实。

3.2 域间引用

规则行必须存在客户与组织归属组织归属只读判据输入核验对象认证主体三操作人置空引用

risk_events
处置台账

risk_rules
规则目录

钱包与账务域
customers

租户与组织域
organizations

计量与计费域
usage_daily

user_real_name_verifications
个人核验

身份域
users

org_real_name_verifications
企业核验

图 2

3.3 表清单(4 表)

表 职责 关键字段
risk_rules 规则目录:类型 + 阈值 + 窗口 + 环比参数 + 动作 + 启用开关 + 作用范围 rule_type / scope_org_id / threshold_tokens / window_days / params / action / enabled
risk_events 命中台账:触发与阈值快照、处置状态、去重基准时刻 rule_id / customer_id / organization_id / group_id / trigger_tokens / status / triggered_at
user_real_name_verifications 个人核验尝试与独立同意留痕 user_id / channel / status / id_no_last4 / consent_version / privacy_policy_version / consented_at
org_real_name_verifications 企业核验记录与两条定案路径的操作人留痕 organization_id / channel / status / expected_amount_cents / attempt_count / fail_reason / reviewed_by / review_note

3.4 设计约束

  1. 台账的规则引用非空:命中必须挂到真实规则行,故扫描先解析规则、必要时惰性创建内置规则(§4.3 / §4.4)。
  2. 规则类型决定参数形态:绝对阈值规则必须有正阈值且不接受环比参数;环比规则无固定阈值(落库占位 0)而由参数决定;两个内置类型由扫描惰性创建,不走规则创建端点。
  3. 整数列与窗口受控:threshold_tokens 与 trigger_tokens 为 bigint、覆盖大模型用量量级,金额类判据以分整数落同一组列;window_days 非空、默认 1、可配 1~90 天。
  4. 去重键为规则 + 组织 + 组的命中时刻:triggered_at 即去重基准,组为空的规则按组为空匹配。
  5. 状态缺省:台账缺省 active、处置后 resolved;两张核验表缺省均 pending,个人侧多一个 error(渠道异常留痕,区别于明确比对不符的 failed)。
  6. 个人侧只存末四位:证件号前缀不落库不落日志;同意版本、隐私政策版本与同意时刻三列恒非空且与行创建时刻同源。
  7. 企业侧操作人与平台侧审核人分列:submitted_by / confirmed_by 与 reviewed_by 分开,审计可辨「谁批的」属哪侧。
  8. 实名等级与事实源双读:企业侧取实名状态与等级列的更强者(verified 即视同 L2),个人侧取组织所有者等级、缺失按 L0;软删密钥不受封禁 / 解封。

4. 核心流程

4.1 用量突增扫描(绝对阈值)

否是是否

取启用中的绝对阈值规则,按组织 + 组聚合窗口内日用量

触发值是否严格大于阈值

跳过该组

去重窗口内同规则 + 同组织 + 同组是否已命中

不重复触发

落台账(触发值与阈值快照、命中动作) + 落站内信(用量异常)

有新建则一次提交,返回新建台账数

图 3

4.2 环比陡增判定

否是否是

取启用中的环比规则,读倍数与两个周期数

只取已完成日:截至业务日的前一天

构造基线窗与最近窗,无行日期视为 0

基线均值是否大于 0

新客户起步期,不触发

最近各日是否全部超过 基线均值 × 倍数

不命中

落台账 + 落站内信(含限速下调提示)

图 4

4.3 对账异常处置台账

是否否是是否

扫描已完结窗口:逐组逐日的量(计量上报)与钱(扣减流水合计)

组内量钱是否都为零

不参与异常判定

绝对差异是否超过容差

视为相符

惰性解析内置规则(对账异常,平台级;不存在则创建)

去重窗口内同组是否已命中

不重复触发

落台账(触发值=异常金额分整数,阈值=容差分整数)

落站内信(含多扣或缺扣方向与两侧金额)

图 5

4.4 免计费量级突增扫描

否是否是

读突增倍数与计数下限

倍数或下限是否为正

告警关闭,直接返回

取当前窗口与前一等长窗口的免计费计数

计数达下限 且 超过 前窗计数 × 倍数

小样本豁免或未达倍数,不触发

惰性解析内置规则 + 查去重窗口

落台账(触发值=当前计数) + 落站内信

图 6

4.5 风险事件处置闭环

处置确认无异常重复解除

active
待处置

resolved
已处置

图 7

4.6 访问密钥封禁与解封

关系库风控域运营面 / 内部运营链关系库风控域运营面 / 内部运营链alt[密钥不存在或已软删][状态已是目标态][需要变更]密钥处置(封禁 / 解封,携原因)取密钥行,要求未软删404 key_not_found幂等:不改状态、不重复发信置状态 + 落站内信 + 同事务落审计(动作、密钥标识、展示前缀、原因)处置行(台账字段 + 展示前缀 + 组织名 + 组名 + 客户标识)
图 8

4.7 个人实名提交与渠道门禁

关系库核验渠道实名域门户用户关系库核验渠道实名域门户用户alt[渠道异常][比对不符][比对通过]alt[未携带单独同意][已实名 / 当日提交达上限][可提交]提交姓名 + 证件号 + 单独同意422 realname_consent_required(不进渠道、不落核验行)409 already_verified 或 429 identity_verify_daily_limit_exceeded解析默认渠道;非白名单环境而渠道为 mock → 503 mock_provider_not_allowed(不回落)落待核验行(末四位 + 同意版本 + 同意时刻)并提交占额度正向核验(姓名 + 证件号)置 error 并计入当日次数,异常原样上抛置 failed,应答 422 identity_verify_failed置 verified + 回写实名状态、核验方式、核验时刻,等级置 L1
图 9

4.8 企业实名两条定案路径

不合通过具备(金额比对)一致不一致未超次数不一致达上限不具备

发起企业核验(携可选渠道)

前置校验:主体性质 / 是否已实名 / 是否已有进行中核验

400 not_company_account 或 409 already_verified / verification_pending

按渠道发起:落待核验行,主体置进行中

渠道是否具备自动定案能力

申报金额是否与应打金额一致

通过

400 amount_mismatch

置 failed → 422 real_name_attempts_exceeded

企业侧自助确认一律 403 manual_review_required

运营复核定案:驳回须给原因,通过走同一回写点

驳回:置 failed;主体处于进行中则回退为未认证

同一回写点:实名状态置已验证 + 等级置 L2 + 实名时刻

图 10

4.9 门禁与欠款账龄分级

可用降为不大于 0宽限到期可用恢复为正可用恢复为正运营封禁注销或关户

active
现金可用为正

grace
欠费宽限:仍服务并催缴

overdue
欠费停服:按额度拒绝

banned
按状态拒绝

closed
终态:按状态拒绝

图 11

4.10 协议版本门禁

否是等于不等(未同意或低于当前版本)

读取当前生效协议版本

门禁开关是否开启

不拦截(仅灰度或演示场景)

用户同意版本是否等于当前版本

放行

应答标记重新确认;未完成确认前下单与充值入口 403 terms_not_agreed

图 12

5. 接口契约

5.1 门户实名校验链(5 个端点)

方法 路径 语义
POST /api/account/real-name/individual/submit 个人实名提交:须携单独同意;通过即生效并回写等级
GET /api/account/real-name/individual/status 个人实名状态与等级
POST /api/account/real-name/company/submit 发起企业核验:组织管理员以上,可指定渠道
POST /api/account/real-name/company/confirm 企业侧自助确认:仅可自动定案的渠道,其余 403 manual_review_required
GET /api/account/real-name/status 企业实名状态与等级、最近一次渠道

5.2 内部运营链(9 个端点)

方法 路径 语义
GET /internal/risk/rules 规则目录:可按作用范围与启用态筛选,按创建时刻倒序
POST /internal/risk/rules 新建规则:平台级不指定组织、组织级绑定范围;参数形态互斥校验
PATCH /internal/risk/rules/{rule_id} 编辑规则:阈值 / 窗口 / 参数 / 动作 / 启用开关,下轮扫描生效
GET /internal/risk/events 处置台账:可按规则、组织、状态筛选,按命中时刻倒序,上限 200
POST /internal/risk/events/{event_id}/resolve 解除事件:置已处置、幂等,返回是否真正变更
POST /internal/risk/scan 手动触发扫描:两类规则一并执行,返回新建台账数
GET /internal/risk/keys 密钥检索:按展示前缀模糊匹配,可叠加组织与状态筛选
POST /internal/risk/keys/{key_id}/disable 密钥封禁:置禁用并落站内信,幂等
POST /internal/risk/keys/{key_id}/enable 密钥解封:恢复可用,幂等

5.3 运营面(11 个端点)

方法 路径 语义
GET /api/account/ops/risk/rules 规则目录(与内部运营链同源同实现)
POST /api/account/ops/risk/rules 新建规则(携审计:类型、阈值、窗口、参数、动作)
PATCH /api/account/ops/risk/rules/{rule_id} 编辑规则(携启用态留痕)
GET /api/account/ops/risk/events 处置台账(审计与处置回写数据源)
POST /api/account/ops/risk/events/{event_id}/resolve 解除事件(生效限速随之收敛)
POST /api/account/ops/risk/scan 手动触发扫描(返回新建台账数)
GET /api/account/ops/risk/keys 密钥检索(泄露处置定位)
POST /api/account/ops/risk/keys/{key_id}/kill 密钥熔断:原因必填,置禁用 + 站内信 + 审计
POST /api/account/ops/risk/keys/{key_id}/unblock 密钥解封:原因必填,恢复可用 + 审计
GET /api/account/ops/real-name/verifications 实名复核队列:缺省取待复核与自动失败两类,按提交时刻升序
POST /api/account/ops/real-name/verifications/{verification_id}/review 运营复核定案:通过或驳回(原因必填),审核人取绑定员工本人

6. 关键约束与验收标准

6.1 约束

  1. 台账必有规则来源:命中必须挂在真实规则上;内置规则在被首次需要时惰性创建,创建幂等(同类型平台级规则最多一条)。
  2. 扫描幂等:去重窗口内同规则 + 同组织 + 同组不重复落台账、不重复发信;重复与多副本并发扫描不产生重复副作用。
  3. 规则参数形态互斥:绝对阈值规则必须有正阈值且不接受环比参数;环比规则的倍数必须为正、两个周期数至少为 1;触发值语义由规则类型决定(tokens / 异常金额分整数 / 话单计数)。
  4. 命中动作只落信号:notify_and_downshift 的下调以「台账未解除」为条件,本域只落信号与生效参数,执行面在计费路由。
  5. 事件两态且解除幂等:仅在待处置与已处置之间单向流转,重复解除如实返回是否变更。
  6. 密钥封禁即可用性归零:置禁用后该密钥不可调用、扣费侧据此拒绝;台账行、展示前缀与历史归因不被改写;软删行不接受处置,处置必留原因。
  7. 每人每日实名提交有上限:按自然日计数,成功、比对不符、渠道异常均计入,超限即拒。
  8. mock 渠道在非白名单环境 fail-closed:解析 mock 即拒并给出诊断,绝不静默回落真实渠道;真实渠道凭据不全同样拒服务。
  9. 实名不落完整证件号:落库只有末四位、完整号不落日志,只做正向核验不做反查;单独同意先于渠道,未同意不落核验行。
  10. 企业侧无自助通过通路:无自动定案能力的渠道一律拒绝自助确认,未知渠道按需人工复核处理;终态记录不可再复核,两条定案路径共用同一回写口径。
  11. 协议版本不一致即拦:同意版本与当前版本不等即要求重新确认,服务端在下单与充值入口兜底;门禁开关关闭仅限灰度与演示场景。
  12. 门禁判定与执行分离:本域只产出口径与事实,门禁执行在各准入点与计费路由;平台侧审核人与企业侧操作人分列留痕。

6.2 验收标准

# 验收口径
1 建规则后立即在目录可见、字段与提交一致;关闭启用态后下一轮扫描不再命中
2 绝对阈值规则缺阈值被拒;环比规则倍数不大于 0 或周期数小于 1 被拒;两类参数形态互换提交被拒
3 用量超过阈值:台账新增一行(触发值为实测合计、阈值为规则值)并新增站内信;恰好等值不落台账
4 去重窗口内重复扫描:台账数不增、站内信不重复;越过去重窗口后再命中可再次落台账
5 环比规则:连续周期各日均超过基线均值乘倍数才命中,任一日未超过不命中;基线为零的新客户不触发
6 环比命中伴随限速下调时该范围生效限速减半,解除事件后恢复档位默认值
7 组内计量与扣减差异超容差:落台账一行,触发值为差异金额分整数、阈值为容差分整数,站内信含多扣或缺扣方向与两侧金额
8 扣减大于计量为多扣、小于为缺扣;组内量钱都为零的日不参与判定;差异在容差内不落台账,容差调大后同一差异不再命中
9 免计费突增:仅当计数达下限且超过前一等长窗口计数乘倍数时命中;倍数或下限非正时该告警整体关闭
10 内置规则(对账异常、免计费突增)在首次命中前自动出现且仅一条平台级行,重复扫描不产生第二条
11 解除事件后该行为已处置;重复解除返回未变更
12 未软删密钥封禁后状态为禁用、站内信一条,再次封禁不重复发信且标记未变更;该密钥调用被扣费侧拒绝并返回 403 key_disabled;已软删密钥封禁 404 key_not_found;解封后可用、重复解封幂等
13 个人实名未携单独同意 422 realname_consent_required 且核验记录数不增加
14 个人实名通过:实名状态为真、等级 L1、核验方式为渠道标识;记录为已通过且末四位与提交一致、同意版本与同意时刻非空
15 个人实名比对不符 422 identity_verify_failed 且实名状态不变;渠道异常时记录为异常态且异常原样上抛;当日提交达上限 429 identity_verify_daily_limit_exceeded 且记录不增
16 非白名单环境解析 mock 渠道:503 mock_provider_not_allowed 且不落核验行、不占额度;真实渠道凭据缺失 503 identity_channel_not_configured
17 企业实名前置:非企业主体 400;已实名 409;存在进行中核验 409
18 企业自助确认金额一致即通过(状态已验证、等级 L2、实名时刻非空);不一致未超上限 400 amount_mismatch,达上限置失败并 422 real_name_attempts_exceeded;需人工复核的渠道一律 403 manual_review_required 且主体状态不被改写
19 运营复核驳回未给原因 422 review_note_required,给出原因后记录为失败、主体退为未认证;复核通过时主体状态与等级同自助路径口径一致,审核人 / 审核时刻 / 结论说明非空且与提交 / 确认人分列
20 对终态记录再次复核 409 verification_not_pending;已完成的企业在另一条记录被驳回时不被降级
21 复核队列缺省返回待复核与自动失败记录、按提交时刻升序,且不含证件照或身份证明文字段
22 组织所有者缺失(已注销)时个人等级判定为最低档,普票门禁拒绝
23 协议版本提升后未重新确认的用户在下单或充值入口被 403 terms_not_agreed,确认后放行;关掉门禁开关后不再拦截
24 内部运营链无令牌或令牌不含运营范围:9 个端点均拒绝;运营面只持客户范围访问风控段、只持风控范围访问实名复核段均被拒

6.3 待后续设计细化的开放项

  1. 规则目录的版本化与灰度:规则改动目前就地下轮生效,缺少生效时点与按组织灰度;变更前后值对照的留痕粒度待定。
  2. 触发值列的语义收敛:对账类与免计费类的判据寄居在用量类的整数列上,随台账结构收敛应拆出金额列与计数列,摆脱按规则类型解释的约定。
  3. 自动处置动作:notify_and_downshift 之外的自动动作(自动封禁密钥、自动降级准入门槛)尚不可配,需先定「谁有权自动执行」与回滚路径。
  4. 真实渠道与账龄催收分级:企业实名(对公打款线下通知与对账、执照类要素核验与工商回执)与个人二要素渠道的凭据投放、轮换周期均待选型定策;企业 L1 与 L2 目前按过渡口径等价,资金权限认证接入后的升降级规则、宽限之外的多级提醒与冻结前置阈值亦待与通知与触达域、账户状态与准入域共同定口径。