支付系统架构设计
背景
什么是支付系统?
支付系统是一种金融基础设施,主要用于实现资金的转移和结算,以完成各种经济交易。
支付系统提供的产品能力
- 支付处理:负责处理用户的各种支付指令,支持多种支付方式,如快捷支付、二维码支付、指纹支付、刷脸支付等。
- 账户:为用户提供账户开立、实名认证、账户绑定等服务。用户可以将银行卡、信用卡等与第三方支付账户绑定,方便进行资金的转入、转出和存储。例如支付宝的余额账户,用户可以将资金充值到余额中,用于后续的支付消费。
- 清结算:在交易完成后,第三方支付系统需要与银行及其他支付机构进行清算结算,确定各方的资金往来和债权债务关系。一般会在一定时间内(如每日)进行批量清算,将用户的交易数据与银行进行核对,完成资金的实际划转。
- 风控:通过大数据分析、风险模型等技术手段,对用户的交易行为、账户信息等进行实时监控和风险评估,防范欺诈、盗刷、洗钱等风险。比如当系统检测到某笔交易存在异常时,会及时进行风险提示或暂停交易,保障用户资金安全。
(而水电煤缴费,余额宝,保险等产品是在支付系统基础设施之上的产品)
支付系统提供的业务能力
1.支付
支付指令:支付(付款),退款,充值,提现,冲退,转账。
支付界限上下文不仅仅是支付网关,核销实体:支付单,支付子单。
存在价值:
- 支持灵活复杂的支付模式,如组合支付的正向和逆向。
- 和商户对接的凭证
三方支付流程
业务系统,比如TB发起收银台的流程: 1 先通过TB后台调用三方支付系统生成支付单。2 基于生成支付单作为参数拉起收银台 3 支付请求提交,支付系统需要校验TB传递的支付单
2. 账务。
3. 对账
4. 清结算
流程
三方支付流程
业务系统,比如TB发起收银台的流程: 1 先通过TB后台调用三方支付系统生成支付单。2 基于生成支付单作为参数拉起收银台 3 支付请求提交,支付系统需要校验TB传递的支付单
业务模型
支付界限上下文
命令:支付(付款),退款,充值,提现,冲退,转账。
支付界限上下文不仅仅是支付网关
存在价值:为什么需要支付:
- 支持灵活复杂的支付模式,如组合支付的正向和逆向。
- 和商家系统对接的门面facade。 商家通过支付单ID和建立连接
业务需求
- 支持组合支付。如TB买100元商品,50元使用余额支付,50元使用银行卡支付,或者支付宝的优惠券抵扣
2.逆向退款支持多次退款,资金流需要原路退回。如买了3次商品,我可以退3次
业务对象简介和关系
支付单:和商家对接的凭证。
支付资金明细单。 具体支付方式的凭证。 物理模型上可以拆成银行卡,红包,积分,余额等多张表。
退款单
退款资金明细单。物理模型上可以拆成银行卡,红包,积分,余额退款等多张表。
支付单 -- 1,N 支付明细单
退款单 -- 1,N 退款资金明细单
业务对象
支付单
关键属性
- 业务类型:支付,充值,提现,退款,冻结,解冻
- 状态:初始,支付中,支付失败,完成
- 金额:
- 商家订单号
支付资金明细单 (到物理模型可能会根据业务类型拆多张表)
- 状态
- 银行单号
- 业务类型:积分支付,余额支付等
账务
账务管理又拆账务系统和 会计系统。支付宝由于用户量巨大,针对单个用户的记账支付宝自己做,账户使用复式记账的借记,会计使用贷记。ERP仅承载科目汇总后的金额。
针对业务量不大,技术不是很强大的公司,账务系统使用单表账,个人账户明细的复试记账和总账全部在ERP实现。
技术点
1. 安全上需要防篡改。防止IT人员或者黑客直接修改账户余额牟利
2. 支持热点数据,如奖励户发红包
https://www.cnblogs.com/aibi1/p/18715932
3. 余额表设计。 余额,可用,冻结。哪几个字段是一定要记的,哪个字段是算出来的?
- 余额,冻结。 可用余额不用存储,搞个方法计算出来即可。 设计更简洁。
4. 转账如何确保分布式事务一致性?
5. 存储和计算的精度如何设计
https://www.cnblogs.com/aibi1/p/18715493
6. 尾差如何处理?
https://www.cnblogs.com/aibi1/p/18715516
XX账户
状态:冻结,可用
币种。
余额,一般使用币种最小单位。
账户状态,比如是正常态、支付或者冻结等。
余额版本号,这个字段非常重要,体现了余额的变化过程,是与流水进行关联的关键
账户流水(账户余额变动)
当余额发生变更时,需要同步记录流水,以此来跟踪余额的变化,流水信息一般包括如下内容:
流水 ID。
凭证 ID,一般是业务单号(如订单 ID、退款单 ID 等),也就是下面凭证中的 ID。
发生金额。
发生币种。
起始余额。
终止余额。
余额版本号,与余额信息中的版本号字段对应。
业务类型:入充值,提现,转账入,转账出 。。。
源账户 ID。
目的账户 ID。
交易时间戳。
会计
对账
对账和结算谁先谁后?一般对账和结算是分开的。一般成熟的平台是先结再对(为了用户体验)。但是有些平台不稳定,如果数据老不准确,可以先对,到结算时间就要结。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性