支付系统架构设计

背景

什么是支付系统?
支付系统是一种金融基础设施,主要用于实现资金的转移和结算,以完成各种经济交易。

支付系统提供的产品能力

  • 支付处理:负责处理用户的各种支付指令,支持多种支付方式,如快捷支付、二维码支付、指纹支付、刷脸支付等。
  • 账户:为用户提供账户开立、实名认证、账户绑定等服务。用户可以将银行卡、信用卡等与第三方支付账户绑定,方便进行资金的转入、转出和存储。例如支付宝的余额账户,用户可以将资金充值到余额中,用于后续的支付消费。
  • 清结算:在交易完成后,第三方支付系统需要与银行及其他支付机构进行清算结算,确定各方的资金往来和债权债务关系。一般会在一定时间内(如每日)进行批量清算,将用户的交易数据与银行进行核对,完成资金的实际划转。
  • 风控:通过大数据分析、风险模型等技术手段,对用户的交易行为、账户信息等进行实时监控和风险评估,防范欺诈、盗刷、洗钱等风险。比如当系统检测到某笔交易存在异常时,会及时进行风险提示或暂停交易,保障用户资金安全。

(而水电煤缴费,余额宝,保险等产品是在支付系统基础设施之上的产品)

支付系统提供的业务能力

1.支付

支付指令:支付(付款),退款,充值,提现,冲退,转账。

支付界限上下文不仅仅是支付网关,核销实体:支付单,支付子单。
存在价值

  • 支持灵活复杂的支付模式,如组合支付的正向和逆向。
  • 和商户对接的凭证

三方支付流程
业务系统,比如TB发起收银台的流程: 1 先通过TB后台调用三方支付系统生成支付单。2 基于生成支付单作为参数拉起收银台 3 支付请求提交,支付系统需要校验TB传递的支付单

2. 账务。

3. 对账

4. 清结算

流程

三方支付流程
业务系统,比如TB发起收银台的流程: 1 先通过TB后台调用三方支付系统生成支付单。2 基于生成支付单作为参数拉起收银台 3 支付请求提交,支付系统需要校验TB传递的支付单

业务模型

支付界限上下文

命令:支付(付款),退款,充值,提现,冲退,转账。

支付界限上下文不仅仅是支付网关
存在价值:为什么需要支付

  • 支持灵活复杂的支付模式,如组合支付的正向和逆向。
  • 和商家系统对接的门面facade。 商家通过支付单ID和建立连接

业务需求

  1. 支持组合支付。如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。
交易时间戳。

会计

对账

对账和结算谁先谁后?一般对账和结算是分开的。一般成熟的平台是先结再对(为了用户体验)。但是有些平台不稳定,如果数据老不准确,可以先对,到结算时间就要结。

posted @   向着朝阳  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示