搜 索

支付系统架构:从零到一搭建一家支付公司

  • 51阅读
  • 2025年01月11日
  • 0评论
首页 / 支付相关 / 正文

写在前面

很多人以为支付系统就是"调个收单接口 + 记录一下订单"。

直到他们第一次遇到:凌晨三点的重复扣款告警、季度对账差了几百万找不到原因、监管来函要求提供完整的资金流水审计链……

支付公司的架构,是在合规压力、资金安全、高并发、极低容错四座大山之间走钢丝。少一块,轻则业务异常,重则牌照被吊。

这篇文章画出一家支付公司必须有的核心系统全景,每个系统讲清楚"它解决什么问题、为什么不能没有它"。


一、全景架构图

先看整体,再看细节。

graph TD subgraph 外部接入层 MERCHANT[商户系统] USER[C端用户] CHANNEL[外部支付渠道 Visa Mastercard Aani 等] REGULATOR[监管机构 CBUAE SAMA 等] end subgraph 网关层 API Gateway GW[统一支付网关 API Gateway] AUTH[认证鉴权 OAuth2 + HMAC] RATE[限流熔断 Rate Limiter] end subgraph 核心业务层 PAY[支付核心 Payment Engine] RISK[风控系统 Risk Engine] ROUTE[智能路由 Smart Router] WALLET[账户钱包 Wallet Service] LEDGER[会计账本 Ledger Engine] end subgraph 渠道接入层 CHANNEL_GW[渠道网关 Channel Gateway] RECONCILE[对账系统 Reconciliation] SETTLE[清结算系统 Settlement] end subgraph 合规风控层 AML[反洗钱 AML Engine] KYC[身份核验 KYC Service] SANCTION[制裁筛查 Sanction Screening] REPORT[监管报送 Regulatory Reporting] end subgraph 基础设施层 MQ[消息队列 Kafka] CACHE[缓存集群 Redis] DB[数据库集群 MySQL + TiDB] VAULT[密钥管理 HSM + Vault] end MERCHANT & USER --> GW GW --> AUTH --> RATE --> PAY PAY --> RISK PAY --> ROUTE PAY --> WALLET PAY --> LEDGER ROUTE --> CHANNEL_GW CHANNEL_GW --> CHANNEL CHANNEL_GW --> RECONCILE RECONCILE --> SETTLE PAY --> AML AML --> SANCTION WALLET --> KYC SETTLE --> REPORT REPORT --> REGULATOR PAY & WALLET & LEDGER --> MQ & CACHE & DB GW & PAY --> VAULT

二、核心系统逐一拆解

2.1 支付核心引擎(Payment Engine)⭐ 最重要

支付引擎是整个系统的心脏,所有支付指令在这里被创建、调度、执行和终结。

它解决的问题: 如何在分布式系统中保证一笔钱只被处理一次、状态不丢失、出错可回滚。

stateDiagram-v2 [*] --> CREATED : 商户发起支付 CREATED --> RISK_CHECK : 提交风控 RISK_CHECK --> REJECTED : 风控拦截 RISK_CHECK --> ROUTING : 风控通过 ROUTING --> PROCESSING : 路由选渠道,调用渠道API PROCESSING --> SUCCESS : 渠道返回成功 PROCESSING --> FAILED : 渠道返回失败 PROCESSING --> PENDING : 渠道超时,状态未知 PENDING --> SUCCESS : 主动轮询确认成功 PENDING --> FAILED : 轮询确认失败 PENDING --> REVERSED : 触发隐式撤销 SUCCESS --> REFUNDING : 发起退款 REFUNDING --> REFUNDED : 退款成功 REFUNDING --> REFUND_FAILED : 退款失败 REVERSED --> [*] REJECTED --> [*] REFUNDED --> [*] note right of PENDING PENDING 是最危险的状态 钱可能已扣,也可能未扣 必须有主动探查机制 超时后触发 Implicit Reversal end note

支付引擎的三个核心设计原则:

幂等性是底线。每一笔支付请求必须携带唯一的幂等键(idempotency key),无论因网络重试被调用多少次,只处理一次,只产生一笔资金变动。

最终一致性是目标。支付涉及多个系统(风控、路由、账务、渠道),不追求强一致,但每笔交易必须在有限时间内达到确定状态,不允许永久 PENDING。

可补偿事务是保底。任何一步失败,都必须有对应的补偿动作——渠道已扣款但业务系统异常,则触发撤销;撤销失败则人工介入,但流程不能断。


2.2 会计账本(Ledger Engine)⭐ 最容易被忽视

账本不是数据库里几张表,它是整个公司的财务真相

它解决的问题: 在任意时刻,系统内每一分钱在哪里、从哪来、到哪去,必须可以完整追溯。

graph LR subgraph 复式记账模型 TX[每笔交易] --> DR[借方 Debit 资金流出方] TX --> CR[贷方 Credit 资金流入方] DR -.->|金额相等| CR end subgraph 账户体系 A1[用户钱包账户] A2[商户结算账户] A3[手续费收入账户] A4[渠道待结算账户] A5[备付金账户] A6[风险准备金账户] end subgraph 一笔用户付款的账务流 E1["用户钱包 -100 AED 借:用户账户 100"] E2["渠道待结算 +100 AED 贷:待结算账户 97"] E3["手续费收入 +3 AED 贷:手续费账户 3"] end TX --> E1 & E2 & E3

账本的黄金法则:

永远不要直接 UPDATE 余额,只能 INSERT 流水记录,余额通过 SUM 计算得出。这听起来性能差,但它换来了完整的审计链——任何余额异常,都能追溯到每一笔流水的来源。


2.3 风控引擎(Risk Engine)⭐ 最复杂

风控是支付公司的免疫系统,它必须在毫秒级完成对每笔交易的判断。

flowchart LR TXN[交易请求] --> PRE[前置规则 同步 毫秒级] PRE --> R1[设备指纹 是否异常设备] PRE --> R2[IP黑名单 代理/VPN检测] PRE --> R3[账户状态 是否冻结/限额] PRE --> R4[基础限额 单笔/日累计] R1 & R2 & R3 & R4 --> SCORE[实时评分引擎 规则+模型混合] SCORE --> S1[行为序列分析 近30分钟交易模式] SCORE --> S2[设备关联图谱 同设备多账户] SCORE --> S3[收款方风险 历史拒付率] SCORE --> S4[ML模型打分 异常概率0-100] S1 & S2 & S3 & S4 --> DECISION{综合决策} DECISION -->|低风险| PASS[放行] DECISION -->|中风险| REVIEW[人工审核队列] DECISION -->|高风险| BLOCK[直接拦截] PASS & REVIEW & BLOCK --> POST[异步后置分析 特征回流 模型更新]

风控引擎有一个永恒的矛盾:拦截率和误伤率。拦截太松,欺诈穿越;拦截太严,好用户被误杀,客诉飙升,GMV下跌。这个平衡点需要通过持续的数据反馈来调整,没有一劳永逸的策略。


2.4 智能路由(Smart Router)

路由决定的是:这笔钱走哪条路,才能以最低成本、最高成功率送达目的地。

graph TD REQ[支付请求] --> FILTER[硬过滤 剔除不可用渠道] FILTER --> F1{渠道支持 该支付方式?} FILTER --> F2{渠道当前 是否熔断?} FILTER --> F3{渠道单日 限额是否已满?} FILTER --> F4{渠道支持 该币种?} F1 & F2 & F3 & F4 -->|全部通过| POOL[候选渠道池] POOL --> SCORE2[软评分排序] SCORE2 --> W1[成功率权重35% 近7日成功率] SCORE2 --> W2[成本权重40% 综合MDR费率] SCORE2 --> W3[延迟权重15% 平均响应时间] SCORE2 --> W4[容量权重10% 剩余配额比例] W1 & W2 & W3 & W4 --> SELECT[选取最优渠道] SELECT --> EXECUTE[发起支付] EXECUTE -->|失败| FALLBACK[降级到次优渠道] FALLBACK --> EXECUTE

2.5 账户钱包系统(Wallet Service)

钱包是用户资金的数字容器,它比普通余额表复杂得多。

graph TD subgraph 账户分层 MAIN[主钱包 可用余额] FROZEN[冻结余额 待处理资金] REWARD[奖励账户 积分/返现] ESCROW[托管账户 第三方托管资金] end subgraph 资金状态流转 TOPUP[充值入账] --> MAIN MAIN -->|发起支付| FROZEN FROZEN -->|支付成功| OUT[资金流出] FROZEN -->|支付失败| MAIN MAIN -->|提现申请| FROZEN FROZEN -->|提现成功| WITHDRAW[提现完成] end subgraph 核心保护机制 P1[乐观锁 防止并发超扣] P2[余额下限检查 不允许负余额] P3[大额操作二次确认] P4[资金变动实时通知] end

钱包最怕的两件事: 超扣(余额变负)和重复入账(余额凭空多出来)。前者靠数据库乐观锁/悲观锁,后者靠幂等键。两者都靠严格的流水记录和定期余额校验。


2.6 对账系统(Reconciliation)⭐ 最容易被低估

对账是支付公司的体检报告。它每天回答一个问题:我们账本上的数字,和渠道实际结算的数字,是否一致?

flowchart TD subgraph 数据源 INTERNAL[内部账本流水 每笔交易记录] CHANNEL_BILL[渠道账单文件 T+1 CSV/SFTP] end subgraph 对账流程 DOWNLOAD[自动下载渠道账单] --> PARSE[解析标准化 统一字段映射] PARSE --> MATCH[逐笔撮合 按渠道订单号匹配] MATCH --> CHECK{对账结果} end subgraph 差异分类 CHECK -->|金额一致| OK[平账 正常] CHECK -->|内部有 渠道无| TYPE1[长款 可能是渠道漏记] CHECK -->|渠道有 内部无| TYPE2[短款 可能是回调丢失] CHECK -->|金额不一致| TYPE3[金额差异 需人工核查] CHECK -->|手续费差异| TYPE4[费率差异 合同Review] end subgraph 差异处理 TYPE1 --> ACTION1[向渠道确认 追溯补记] TYPE2 --> ACTION2[查回调日志 触发补单] TYPE3 --> ACTION3[人工审核 上报财务] TYPE4 --> ACTION4[对比合同 计入损益] end INTERNAL --> MATCH CHANNEL_BILL --> DOWNLOAD

对账的黄金指标: 对账平账率。一家成熟支付公司,日对账平账率应在 99.99% 以上。剩下的 0.01% 才是人工介入的部分。如果平账率低于 99.9%,说明系统有严重的稳定性或数据一致性问题。


2.7 清结算系统(Settlement)

清结算解决的是:钱在什么时候、按什么规则、打到谁的账户里。

sequenceDiagram participant RECON as 对账系统 participant SETTLE as 清结算系统 participant FEE as 手续费计算 participant BANK as 出款银行 participant MERCHANT as 商户账户 RECON->>SETTLE: 对账完成,触发结算 SETTLE->>SETTLE: 按结算周期汇总
T+1 或 T+3 或周结 SETTLE->>FEE: 计算应扣手续费 FEE-->>SETTLE: 返回净结算金额 SETTLE->>SETTLE: 生成结算指令 SETTLE->>BANK: 发起银行出款 BANK-->>SETTLE: 出款确认 SETTLE->>MERCHANT: 更新商户结算账户 SETTLE->>SETTLE: 生成结算报告 Note over SETTLE: 结算记录不可修改 Note over SETTLE: 每笔出款必须可追溯

2.8 合规四件套(AML + KYC + 制裁筛查 + 监管报送)

合规不是可选项,是牌照的生命线

graph TD subgraph KYC["KYC 身份核验"] K1["文件核验 护照 ID 驾照"] --> K2["活体检测 Liveness"] K2 --> K3["地址证明 水电账单"] K3 --> K4["风险定级 Low Medium High"] end subgraph SANCTION["制裁筛查 实时"] S1[OFAC SDN List] S2[UN Sanctions] S3[EU Consolidated] S4["本地监管黑名单 如CBUAE名单"] S1 & S2 & S3 & S4 --> SCREEN{命中?} SCREEN -->|命中| FREEZE["冻结账户 上报监管"] SCREEN -->|未命中| CLEAR[放行] end subgraph AML["AML 反洗钱监控"] T1["交易行为监控 金额 频率 对手方"] T2["结构性交易识别 化整为零 smurfing"] T3["跨境资金流向 高风险国家预警"] T4["PEP识别 政治敏感人士"] T1 & T2 & T3 & T4 --> SAR["可疑交易报告 SAR Filing"] end subgraph REPORT["监管报送"] R1["日报 大额交易报告 CTR"] R2["月报 业务数据统计"] R3["即时报 可疑交易 SAR"] R4["年报 审计财务报告"] end K4 --> T1 CLEAR --> T1 SAR --> R3

三、关键横切关注点

3.1 幂等性设计

幂等是支付系统的第一公民,任何对资金有影响的操作都必须幂等。

flowchart TD REQ2[收到请求 携带 idempotency-key] --> QUERY[查询幂等表 是否已处理] QUERY -->|已存在且处理完成| RETURN[直接返回历史结果 不重复执行] QUERY -->|已存在且处理中| WAIT[等待或返回处理中] QUERY -->|不存在| INSERT[写入幂等记录 状态 processing] INSERT --> PROCESS[执行业务逻辑] PROCESS --> UPDATE[更新幂等记录 状态 completed + 结果] UPDATE --> RETURN2[返回结果]

3.2 分布式事务策略

支付涉及多个服务,强一致分布式事务代价太高,生产中常用的是以下模式:

graph LR subgraph Saga 模式 推荐 SA1[支付服务 扣减余额] -->|成功| SA2[渠道服务 发起扣款] SA2 -->|成功| SA3[账本服务 记录流水] SA3 -->|失败| COMP3[补偿:冲销流水] SA2 -->|失败| COMP2[补偿:恢复余额] end subgraph 本地消息表 兜底 LM1[业务操作 + 写消息表 同一DB事务] --> LM2[消息轮询投递 至少一次] LM2 --> LM3[消费方幂等处理] end

3.3 资金安全四道防线

graph TD LINE1[第一道:接入层防护 防重放 防篡改 签名验证 TLS加密] LINE2[第二道:业务层防护 幂等控制 余额乐观锁 限额校验] LINE3[第三道:账务层防护 复式记账 余额双向校验 流水不可删改] LINE4[第四道:审计层防护 操作日志全留存 异常告警 定期对账] LINE1 --> LINE2 --> LINE3 --> LINE4 style LINE1 fill:#3498db,color:#fff style LINE2 fill:#27ae60,color:#fff style LINE3 fill:#e67e22,color:#fff style LINE4 fill:#8e44ad,color:#fff

四、系统重要性总览

quadrantChart title "支付系统核心模块 重要性与复杂度" x-axis "实现复杂度低" --> "实现复杂度高" y-axis "业务重要性低" --> "业务重要性高" quadrant-1 "优先投入 核心壁垒" quadrant-2 "重要 逐步完善" quadrant-3 "基础配套" quadrant-4 "技术挑战 按需建设" "支付核心引擎": [0.75, 0.98] "会计账本": [0.60, 0.95] "对账系统": [0.65, 0.92] "合规体系": [0.80, 0.90] "风控引擎": [0.85, 0.88] "清结算系统": [0.70, 0.85] "账户钱包": [0.55, 0.80] "智能路由": [0.60, 0.70] "API网关": [0.40, 0.75] "监控告警": [0.35, 0.72] "消息队列": [0.30, 0.60] "密钥管理": [0.50, 0.82]

五、建设顺序建议

不是所有系统都要在 Day 1 建好,但有些东西拖不得:

timeline title 支付公司系统建设路线图 MVP 第1-3月 : 支付核心引擎(状态机+幂等) : 基础账本(流水记录+余额) : 单渠道接入 : 基础KYC接入 : API网关+签名验证 合规就绪 第4-6月 : AML引擎上线 : 制裁筛查实时化 : 监管报送系统 : 对账系统T+1自动化 : 密钥管理HSM 规模化 第7-12月 : 智能路由多渠道 : 风控引擎规则+模型 : 清结算自动化 : 钱包账户体系 : 完整监控告警 成熟期 第2年起 : 实时对账 : ML风控模型迭代 : 多币种多市场扩张 : 自动化监管报送

六、写在最后:支付架构的本质

画了这么多图,最后说一句大白话:

支付系统架构的本质,是在"钱不能丢、钱不能多、钱不能慢、钱不能乱"这四个约束下,构建一套可以持续演进的工程体系。

graph LR A[钱不能丢 幂等+账本+对账] --- B[钱不能多 乐观锁+余额校验] B --- C[钱不能慢 路由+缓存+异步] C --- D[钱不能乱 状态机+事务+审计] D --- A A & B & C & D --> CENTER[用户信任] style CENTER fill:#e74c3c,color:#fff

技术可以迭代,架构可以演进,唯独用户信任,一旦丢失极难找回。

这是支付和其他软件系统最本质的区别:其他系统出 bug 是用户体验问题,支付系统出 bug 是真实的钱消失了。


本文为《从入门到放弃》系列技术架构篇,适合作为支付系统建设的 High-Level 路线图参考。

评论区
暂无评论
avatar