金融支付系统
· 阅读需 9 分钟
金融支付系统是高敏感、高可用、高并发的核心系统,设计需兼顾安全性、准确性、性能、合规性四大核心目标。下面从「核心架构」「关键模块」「安全设计」「容灾与合规」四个维度,给出一套完整、可落地的设计方案,覆盖从交易流程到技术实现的全链路。
一、核心设计原则(必须遵守)
在开始设计前,先明确底层原则,避免核心风险:
- 原子性:交易要么全成、要么全败(比如扣款和入账必须同时成功/失败);
- 一致性:资金数据在任何节点/场景下都保持准确(核心是对账机制);
- 高可用:系统全年可用率≥99.99%(4个9),单笔交易响应≤300ms;
- 安全性:防篡改、防伪造、防重放、防越权;
- 合规性:符合监管要求(如备付金管理、反洗钱AML、交易日志留存≥5年);
- 可追溯:每一笔交易都有唯一流水号,全链路日志可查。
二、整体架构(分层设计)
采用经典的「分层+微服务」架构,解耦且便于扩展:
┌─────────────────────────────────────────────────────────┐
│ 接入层(API网关/负载均衡) │
│ - 路由转发、限流、鉴权、协议转换(HTTP/HTTPS/GRPC) │
├─────────────────────────────────────────────────────────┤
│ 应用层(核心业务微服务) │
│ - 支付网关、订单服务、账户服务、风控服务、清算服务 │
├─────────────────────────────────────────────────────────┤
│ 领域层(核心逻辑) │
│ - 交易引擎、资金引擎、风控引擎、对账引擎 │
├─────────────────────────────────────────────────────────┤
│ 数据层(存储/缓存/消息) │
│ - 主数据库(MySQL/PostgreSQL)、缓存(Redis)、消息队列 │
│ - 分库分表、读写分离、数据备份 │
├─────────────────────────────────────────────────────────┤
│ 基础设施层(监控/日志/运维) │
│ - 全链路监控、审计日志、容灾备份、配置中心 │
└─────────────────────────────────────────────────────────┘
核心组件说明:
| 组件 | 核心功能 |
|---|---|
| API网关 | 统一 接入、限流(防止并发过载)、签名校验、黑白名单、接口版本管理 |
| 支付网关 | 对接微信/支付宝/银联等渠道,统一支付接口,处理渠道回调 |
| 账户服务 | 管理用户账户(余额/冻结/解冻)、资金变动记录 |
| 订单服务 | 生成支付订单、订单状态管理、幂等控制(防止重复支付) |
| 风控服务 | 实时风控(交易金额/频率/IP/设备校验)、反洗钱规则、异常交易拦截 |
| 清算服务 | 每日/实时清算、对账(系统内对账+渠道对账)、差错处理 |
| 交易引擎 | 核心交易逻辑(扣款、入账、退款)、事务控制、流水生成 |
| 消息队列 | 异步通知(支付结果回调)、削峰填谷(高并发场景)、解耦服务 |
三、核心模块详细设计
1. 支付流程(核心链路)
以「用户支付订单」为例,梳理核心流程(保证原子性和一致性):
关键设计点:
- 幂等性:每个支付请求生成唯一
requestId,渠道回调/重试时通过requestId判断是否已处理,避免重复扣款; - 异步回调:渠道回调采用「重试机制」(如微信回调最多重试10次),系统需保证回调接口幂等;
- 事务控制:资金变动必须在数据库事务内完成(如「扣用户余额 + 加商户余额」必须同时成功)。
2. 账户与资金模块
核心表设计(简化版):
-- 用户账户表(核心,分库分表)
CREATE TABLE `user_account` (
`id` bigint NOT NULL AUTO_INCREMENT,
`user_id` varchar(64) NOT NULL COMMENT '用户唯一ID',
`balance` decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '可用余额',
`frozen_balance` decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '冻结余额',
`version` int NOT NULL DEFAULT '0' COMMENT '乐观锁版本号(防并发)',
`create_time` datetime NOT NULL,
`update_time` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户账户表';
-- 交易流水表(全量记录,不可修改)
CREATE TABLE `trade_flow` (
`id` bigint NOT NULL AUTO_INCREMENT,
`flow_no` varchar(64) NOT NULL COMMENT '唯一流水号',
`order_no` varchar(64) NOT NULL COMMENT '关联订单号',
`user_id` varchar(64) NOT NULL COMMENT '用户ID',
`amount` decimal(18,2) NOT NULL COMMENT '交易金额(正为入账,负为扣款)',
`trade_type` varchar(32) NOT NULL COMMENT '交易类型:PAY/REFUND/FREEZE/UNFREEZE',
`status` varchar(32) NOT NULL COMMENT '状态:SUCCESS/FAIL/PROCESSING',
`channel` varchar(32) COMMENT '支付渠道:WECHAT/ALIPAY/UNION',
`create_time` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_flow_no` (`flow_no`),
KEY `idx_order_no` (`order_no`),
KEY `idx_user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='交易流水表';
资金操作核心逻辑(伪代码):
// 扣款操作(带乐观锁,保证并发安全)
func DeductBalance(userId string, amount float64) error {
// 开启数据库事务
tx := db.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
// 1. 查询账户(带行锁/乐观锁)
var account UserAccount
if err := tx.Where("user_id = ?", userId).ForUpdate().First(&account).Error; err != nil {
tx.Rollback()
return err
}
// 2. 校验余额
if account.Balance < amount {
tx.Rollback()
return errors.New("余额不足")
}
// 3. 更新余额(乐观锁防并发)
account.Balance -= amount
account.Version += 1
if err := tx.Model(&account).Where("version = ?", account.Version-1).Updates(account).Error; err != nil {
tx.Rollback()
return err
}
// 4. 生成交易流水
flow := TradeFlow{
FlowNo: GenerateFlowNo(), // 生成唯一流水号
OrderNo: GetCurrentOrderNo(),
UserId: userId,
Amount: -amount, // 扣款为负
TradeType: "PAY",
Status: "SUCCESS",
}
if err := tx.Create(&flow).Error; err != nil {
tx.Rollback()
return err
}
// 5. 提交事务
return tx.Commit().Error
}
3. 风控模块(防欺诈/异常交易)
核心风控规则(可配置化):
- 基础规则:
- 单用户单日支付金额上限(如5万);
- 单用户单小时支付次数上限(如10次);
- 单笔支付金额下限/上限(如0.01元~1万);
- 高级规则:
- IP/设备/手机号异常(如异地登录、新设备支付);
- 交易行为异常(如短时间内频繁小额支付);
- 反洗钱规则(如单日多笔大额转账、 非营业时间交易);
- 实现方式:
- 实时风控:基于Redis统计频次(如
incr user:123:pay_count:20260306,设置过期时间); - 离线风控:基于大数据平台分析用户行为,标记高风险用户。
- 实时风控:基于Redis统计频次(如
4. 对账模块(保证资金一致)
对账是支付系统的「生命线」,核心是「三方对账」:
- 系统内对账:订单表 + 交易流水表 + 账户表,校验资金变动是否一致;
- 渠道对账:下载微信/支付宝/银联的对账文件,与系统内交易流水比对;
- 对账流程:
- 每日凌晨下载渠道对账文件;
- 解析文件,与系统内流水按「商户订单号/渠道交易号」匹配;
- 标记差异订单(如单边账、金额不符),生成对账差异报表;
- 人工介入处理差异,自动触发补单/退款(如漏入账的订单)。
四、安全设计(重中之重)
1. 接口安全
- 签名校验:所有接口请求必须携带签名(
timestamp + nonce + appKey + 业务参数加密),防止参数篡改; - 防重放:timestamp有效期5分钟,nonce随机字符串(Redis记录已使用的nonce,防止重复请求);
- HTTPS:所有接口强制HTTPS,防止数据传输过程中被窃取;
- 接口限流:按IP/商户ID限流,防止DDoS攻击。
2. 数据安全
- 敏感数据加密:用户手机号、身份证号、银行卡号采用国密算法(SM4)加密存储,脱敏展示(如138****1234);
- 交易日志审计:全链路日志记录(操作人、操作时间、操作内容),日志不可篡改,留存≥5年;
- 权限控制:基于RBAC模型,最小权限原则(如财务只能查看对账数据,不能操作资金)。
3. 交易安全
- 支付密码/短信验证:大额支付强制验证,防止账户被盗;
- 风控拦截:异常交易实时拦截,触发人工审核;
- 资金隔离:用户备付金与平台自有资金隔离,符合监管要求。
