20180108-第三方支付虚拟账户设计经验

Posted by PaymentGroup on January 8, 2018

一、主题分享

今天分享的主题是 虚拟账户系统设计经验,一般来说账户系统属于核心系统中比较重要的模块,做金融的都知道得账户者得天下,微信支付宝之所以遥遥领先其他支付公司和直销银行,就是把使用场景和资金账户关联了起来

1.1支付交易系统架构图

20180108_192326
做支付,电商,互金的一般都知道,支付工具是相对固定的,变化的都是业务和产品交互模式。交易过程中,可能用到银行卡,虚拟账户余额,以及卡卷,红包等支付工具。如果把各支付工具都抽象一下,都是跟资金相关,所以完全可以用账户来记录余额变更及使用情况;所以一次交易过程中,涉及到的账户可能包括 个人虚拟账户,卡卷账户,红包账户,以及商户账户,还有平台的内部账户等,所以账户模型设计如下:
20180108_192843
主要分三类:客户账户,内部账户,产品账。 其中客户账户就是大家平常接触最多的,如微信钱包,支付宝钱包等,这里面参考了电信行业的三户模型,通过用户,客户,账户的关系,进行了 一定的改造; 平台的客户分为用户和商户;

用户分为个人用户,企业用户; 商户分为公司,个体工商户,小微等;
所有已认证的用户和商户,都对应会员,每个会员有身份证号、营业执照号等信息,然后实名信息会分别存储到自然人和法人两个模型中,用于做客户管理和支付限额控制,会员建立时一般开一系列账户,包括个人余额账户,商户余额账户,商户待结算账户等,所以每个会员都有一个主账户,这个主账户id我们称为户口号,当业务变化时,也可以增加子账户,如购买理财和领取卡券时,所有的子账户都会下挂到这个户口号下,当账户余额变动时,如发生充值、提现、转账交易,会根据支付工具不同,调用会计模块,不过会计科目根据不同业务可以设置相对简单些,充值和提现会记录渠道应收款和应付款内部户,而转账交易则无需记会计账,账户的模型类似这样:

20180108_193947

账户明细模型类似这样:

20180108_194012

  • 账号明细有明确的余额变更记录,记录每笔明细的起初余额和期末余额,账户中则只记录每日的期初余额,当日终处理时,会计算检查科目账与客户账汇总的平衡,防止篡改和记错账;
  • 产品账可以理解为外部账,比如发红包,扣一次用户余额,产生200个随机红包,这些红包可以被人领取,也可能过期退回,所以外挂到产品账账户中便于灵活处理和提高系统并发性能;
  • 内部账户一般都是根据业务预制进去的,另外增加银行或其他资金渠道时,也会建立一套内部户,内部户通常每日汇总记一笔余额变更明细即可,差不多先说这么多,大家有什么疑问可以讨论。

    这就我的今天的分享,谢谢大家的聆听!


二、Q&A

Q: 如果想查询某个时间点的余额怎么处理?
A: 每笔账户明细都有入账时间,根据这个能查到时间点余额。

Q: 账户明细有记录上次余额。这个是怎么处理的,高并发下会出现上次余额一致?
A: 单边记的,比如商户发了100万的优惠券,则声称了100万条优惠券产品账,可实际营销资金可能只放了1w块钱,所以当用户使用优惠券时,就需要核销,这时候扣营销账户,钱不够则核销失败,扣到一定程度则提醒商户营销充值,这个是技术问题,我设计的是通用记账,会按照账户号,资金加减做group by,然后把list传过去放到一个事务中执行;

Q: 余额有可提现余额,冻结余额,是每一个作为一种类型单独记明细账吗?2.内部账户可以举一个例子吗?
A: 我发一个之前整理的科目设计,供参考: 20180108_195442

Q: 会员建立时一般开一系列账户,包括个人余额账户,商户余额账户,商户待结算账户等。是个人和商户会同时开么? A: 个人注册和商户入网时分别开的

Q: 可提现,冻结余额等,是根据每一笔明细每天汇总后更新到主账户余额中吗?
A: 不更新,冻结余额一般是给风控用的,业务冻结会采用内部户的方式;看业务场景,比如信用卡消费退款到余额或系统发的红包什么的,要求只能用于消费,不允许提现,就不更新;

Q: 随机红包是分配好放缓存 领取再记录?
A: 缓存的 领取再存;这种红包可以先生成部分。比如预先生成2000个红包。然后每次领取的时候,判断剩下多少个。如果低于300个。再生成2000个红包。

本文档来自“支付产品架构交流群” 的聊天记录整理,由志愿者整理并发布到本网站。如需要及时收到来自“支付产品架构交流群”的最新消息,请扫码关注“凤凰牌老熊”的微信公众号。目前支付产品架构群还有不少空位。 本群面向支付行业的有经验(2年以上)的产品经理、软件工程师、架构师等,提供交流平台。如想加入本群,请在本文评论中留言(不公开),说明所在的公司、负责的工作、入群分享的主题和时间。