支付系统设计:支付系统的账户模型(一)

38 评论 180689 浏览 994 收藏 15 分钟

账户体系是支付系统的基础,它的设计直接影响整个系统的特性。这里探讨如何针对电子商务系统的支付账户体系设计。我们从一些基本概念开始入手,了解怎么建模。

支付账户和登录账号

账户体系设计首先要区分两个概念,支付账户和登录账号。 这是两个不同业务领域的概念:支付账户指用户在支付系统中用于交易的资金所有者权益的凭证;登录账号 指用户在系统中的登录的凭证和个人信息。 一个用户可以有多个登录账户,一个登录账户可以有多个支付账户,比如零钱账户,储值卡账户等。 一般来说,支付账户不会在多个登录账户之间共用。如果没有特殊说明,下文中的账户,都默认指支付账户。

账户的设计需求

在支付系统中,账户的设置,主要是从如下几个方面来考虑:

  1. 交易的需求,比如检查账户是否被锁定、余额是否足够、是否有效等。
  2. 记账的需求,按照公司会计需求记录账户上的所有行为,包括支出、充值、转账等。
  3. 对账的需求,包括和支付渠道、商户、个人的对账需求,核对交易和账户余额是否正确。
  4. 风控的需求,如反洗钱、反欺诈等,都需要依赖于账户体系来提供核心数据。本文暂不分析这个内容,将在《支付风控》、《支付反洗钱》这两篇文章中详细分析
  5. 信用的需求,对用户、资产、商户等主体进行信用评估时,也需要依赖账户体系来提供的核心数据。本文也暂不分析这内容,将在《信用与支付》一文中分析。

这五个需求,按照其设计的优先级,也是从支付、记账、对账、风控来进行。 支付系统根据其发展所处的阶段,逐步将新增需求纳入设计中。

交易与账户

账户设置,一般是从交易开始的。 交易的实现必须有账户的支持,账户是交易的基本构成元素。 从支付系统的角度,交易中涉及到的资金流是资金从一个账户流向另一个账户。 发起交易的一方,被称之为交易主体,他可以是个人,也可以是一个机构。

资金从该主体所拥有的账户中流出。 而接收交易的一方,被称为交易对手,他也可以是个人,或者机构。 和第三方支付或者金融机构的交易不同,电商系统中,交易还会涉及到渠道。

由于电商系统本身并无清结算的资质,所有资金从交易主体到交易对手的账户的流动,在大部分情况下,并没有经过电商系统,而是由电商系统调用支付渠道提供的接口,由它来完成真正的支付过程。 当然,渠道也不是活雷锋,在这过程中,渠道要收取费用。

所以,在电商系统中,一次交易会涉及到三个账户: 交易主体账户、交易对手账户以及支付渠道账户。 如何在这三个账户中完成一次交易,我们将在后续的《交易和记账》一文中详细分析。

记账与账户

公司的会计需要对每一笔交易都要做详细的记录,即记账。 公司每天都产生大量的交易行为,为了便于管理和统计,一个简单的方法是对交易进行分类,比如食品、带宽、办公用品等等。 这个分类,按照公司的规模和业务复杂度,可以有一级,二级,三级或者更多级的结构,这被称之为会计科目。 记账时,除了交易明细,还需要在每个级别上对交易额进行汇总。

一般来说,一级科目上汇总称为总帐科目,而详细记录称为明细科目。 在电商系统中,由于涉及到的参与方较多,记账也相对复杂,但基本方法也是类似的。 电商的参与者可以分为商户、买家和渠道,对这三类参与者,都需要分别建立总帐账户和明细账户。

内部账户和外部账户

当用户使用银行卡来支付时,电商支付系统需要和银行对接,从用户银行卡所代表的账户上扣除资金。对接了银行,第三方支付等机构的电商支付系统,它需要连接到用户在这些机构的账户来执行扣款或者充值操作,这些账户或称为外部账户。对外部账户,支付系统只能记录账户在本系统的明细以及累计消费额,无法得知账户真正余额。 不少电商在玩零钱的概念,也就是让用户充值到零钱,使用的时候就直接从零钱中扣除。这就需要零钱账号。这是电商系统中自己设立的账号,所以也叫内部账号,可以知道账号的全部消费明细和余额。 当然,除了零钱账号,也可以有储值卡账号,信用账号等。

那问题来了,什么时候需要建立账户,比如优惠券,需要账户吗? 一次消费的储值卡和可以充值的储值卡,需要建立账户吗?这里先埋个雷,后续介绍支付和记账时,给出答案。

收款账户和收单账户

当电商要对接银行时,往往都会被要求开设一个收款账户。用户通过这个银行来支付时,钱就被转到这个账户上。 对第三方支付也是一样。收款账户是开设在银行或者第三方支付这边的, 即渠道侧。 一般来说,渠道每天都可以提供这个账户的交易流水供电商对账用。 这样在电商这边,渠道就成为一个收单机构。 所以在电商这边,建立这个收款账户对应的对账用的收单账号,用来记录通过这个渠道进行的各项交易流水。

账户建模

说了这么多,目的是为了对账户建模。 账户模型是和公司业务密切相关的,公司不同规模,发展的不同阶段需要不同的模型。 账户建模本身包括三大核心模型:实体模型、账户模型和交易模型。 从交易模型中可以衍生出针对各个角色的账户流水,即明细模型,用于支持对账。

实体模型

实体模型和用户、商户模型有重叠的地方,这里专门针对支付而设置的各个实体属性。 一般来说,支付相关的实体模型需要包括如下的属性:

  • 用户ID,一般直接映射到登录账户的ID;
  • 是否允许执行支付;
  • 支付密码;
  • 用于设置或者重置支付密码的手机号;
  • 用户设置或者重置支付密码的邮箱;
  • 用户的安全等级,根据业务需要来设置。

账户模型

根据业务需要,可以设置多种账户,如支付账户、预付卡账户、代扣账户、零钱账户、结算账户等。 从类别上来说,这里的账户,一般指总账账户。一般来说电商系统中涉及的账户类型有:

  • 虚拟币账号:用户和使用奇点奇豆的商户都需要建立虚拟币账户。
  • 代扣账号: 用来支持订阅类型的定期代扣;
  • 零钱账号:即电商的内部账号,用户、商户、清算单位需要建立零钱账户
  • 第三方支付账号:用户在第三方支付机构建立的账户。
  • 银行卡账号:用户的银行卡信息,每个卡对应一个账户。
  • 结算账号:用来支持和第三方支付公司、银行进行结算用。 第三方支付需要为每个商户号建立结算账号;银行需要为借记卡、贷记卡分别建立结算账号(有必要吗?银行卡直连时使用)。
  • 代扣代缴账户:用来支持代扣税款业务。

对这些账户,需要设置如下属性: 基本属性,包括:

  • 账户号,或称为账户ID,一般是系统自动生成。特别注意的是,要事先约定好账户ID的规则。比如头三位用来表示账户类型,后几位用来表示账户编号等。务必保证根据账号号能够快速确定账户类型,并且保证账户号是不重复的。
  • 账户名称,一般是由用户自己设置的,显示用。
  • 账户使用的货币类型,注意虽然一张银行卡可以支持多个币种,实际在内部,还是针对每个币种建立独立的子账户。 涉及到多币种的账户,也可以采用类似的建模方案。
  • 会计科目代码,一般是一级会计科目的代码。

账户控制相关:

  • 是否允许充值;
  • 是否允许提现;
  • 是否允许透支;
  • 是否允许支付;
  • 是否允许转账进入;
  • 是否允许转账转出;
  • 是否有安全保障;
  • 是否激活;
  • 是否冻结。

资金相关:

  • 当前账户余额:等于可用余额+冻结余额;
  • 当前账户可用余额;
  • 当前账户冻结的余额。冻结余额指在账户上暂不能使用的额度。在支付的时候,往往是先冻结,商品出库后, 再实际执行扣款。

银行卡、第三方支付信息:

  • 第三方实体的ID;
  • 第三方账号,如银行卡号或者在第三方支付的open_id等;
  • 第三方的app_id;
  • 账号的失效日期,该账号什么时候失效。

注意,有些第三方信息是不能保存的,如用户的账号密码、信用卡的CV号等。 为了避免账户信息被爬库或者数据库信息意外泄露,一般还需要对敏感字段,如密码等,进行加密保存,甚至保存到另外的表中。 更进一步,为了避免账户信息被意外修改,还可以增加一个校验字段,在写入数据时设置该字段,在读取数据时做校验,一旦发现数据有问题,则关闭该账号。

交易模型

交易记录,交易流水,账户流水,交易台账,这三个容易混淆的概念,从数据上来说,却并不复杂,它们的核心是交易流水,账户流水是从账户视角的交易流水。那对一笔交易,涉及到的方方面面内容很多,有哪些需要记录的呢?考虑到交易记录将被用于风控和信用分析,能收集到的信息是越全面越好。

  • 流水号:每一笔交易的流水号都不一样。需要根据业务情况详细设计流水号。这个号往往也是对交易表做分表分库的依据。
  • 交易记录创建时间;
  • 交易记录最后修改时间;
  • 会计科目代码
  • 关联的订单号,由商户提供;
  • 订单名称、描述、关联的地址等信息;
  • 费用信息,包括: 结算货币类型、原始费用、实际费用等;
  • 交易主体信息,记录主体ID、类型、名字、账号、账号类型、使用的IP地址、手机号、平台、通知邮箱、当前位置等。 这些信息虽然可以从主体表中获取,但考虑主体表信息随时会被修改,所以这里需要记录详细的各原始信息。
  • 交易对手信息,记录对手主体的ID,类型,名字,账号,账号类型,手机号,平台,通知邮箱等。
  • 交易渠道信息,记录所使用的交易渠道的实体id,渠道账户,渠道执行支付的时间、渠道侧返回的订单号等。如果有错误发生,还需要记录从渠道接收到的错误信息和错误码。

总结

如上内容,不管是账户还是交易,模型都很复杂。是否有必要记录这么多信息,如何在交易中使用这些模型,请关注后续文章。

 

作者:凤凰牌老熊,程序员 & 架构师,来自中科大的本科,研究生在软件所学习。先后在中科辅龙、三星(中国)研究院和国内一些大型的互联网公司呆过。在中科辅龙公司负责电子政务内容管理系统建设,负责研发龙驭系列产品的研发,这款产品最终实施到2000多个电子政务网站上,期间也参与了一些支付反洗钱以及支付系统的建设。之后在三星中国研究院,负责自然语言处理(NLP)以及智能家居相关项目。智能家居项目在2014CES消费电子展上作为三星重点项目推介。2014年开始加入爱奇艺公司,负责数据仓库和支付系统的建设。

本文由@凤凰牌老熊(微信公众号:shamphone) 原创发布于人人都是产品经理 。未经许可,禁止转载。

更多精彩内容,请关注人人都是产品经理微信公众号或下载App
评论
评论请登录
  1. 作者您好, 看了您这篇文章收益匪浅。其中我有个地方有疑惑, 交易主体和交易对手, 是否和交易中资金流转的方向有关系?比如资金流出方是交易主体,资金流入方是交易对手? 其实我认为是交易主体是指交易的发起方, 而交易的另一方就是交易对手了, 和资金流向没有关系。但我另外一个同事看了你这篇文章, 他的理解却是跟资金流转的方向有关。

    来自广东 回复
  2. 一个账户系统同时承担用户零钱交易和财务清结算功能会不会不太好? 因为零钱账户需要在支付时使用实效性要求较高,财务清结算可以是异步转账记账(偏向于财务会计领域复式记账)。博主建议分开还是可以合并成一套? 一套的话,使用零钱支付时,复式记账会计分录该怎么走?还是同一套系统针对实时交易(支付/退款)这种采用另外一套记账方法。

    来自四川 回复
    1. 一个账户系统的定义是什么,一个是支付账户,一个是结算账户,这样应该不会有影响吧。

      来自广东 回复
    2. 个人经验,平台类业务的账户规划还是需要两套,一套是结算账户,用来快速处理资金和零钱的相关业务操作,一套是财务账户,用来进行异步财务相关的账户处理;

      来自上海 回复
    3. 用来进行异步财务相关的账务处理。不是账户处理,敲错字了。

      来自上海 回复
  3. 您好,请问一下公司的电商平台允许用户在非登录状态下输入手机号即可购买并支付,支付成功后,系统会自动以手机号创建一个用户账号并提供一个默认密码完成用户的注册工作,这样在系统上会存在安全隐患吗?如果会,风险有多大?

    来自北京 回复
    1. 首先不明白为什么会这样设计,首先很多支付渠道是不需要用户输入手机号码的。另外即使如果有手机号码了,如果这个手机号码和已有的用户手机号码冲突了又该如何?

      来自上海 回复
  4. “这样在电商这边,渠道就成为一个收单机构。 所以在电商这边,建立这个收款账户对应的对账用的收单账号,用来记录通过这个渠道进行的各项交易流水。”
    请问这个收单账号是指什么,不是指收款账户么。 账号账户分不清楚

    来自四川 回复
    1. 了解了,即开设一个账号,绑定这个收款账户,就可以查这个账户在渠道侧的流水

      来自四川 回复
  5. 要是能补上关键的结构图就更清楚了

    来自广东 回复
  6. 😯 真是精彩

    来自广东 回复
  7. 真是精彩

    来自广东 回复
  8. Thank you so much!!!

    来自浙江 回复
  9. 交易模型中是否要加个记录交易状态的字段? 比如说成功,失败,冻结?

    来自广东 回复
  10. 作为一个支付前端sdk的产品,后台的东东了解甚少,学习了,谢谢少侠

    来自浙江 回复
    1. 同,希望可以进一步交流

      回复
  11. 谢谢楼主,分析的很好,我能说楼主也是账户账号傻傻分不清楚,嘻嘻 :mrgreen:

    来自广东 回复
  12. 楼主咨询一下,像银行,第三方支付,银联,在整个支付系统中资金渠道都有哪些?分别在什么情况下用起来呢?

    来自浙江 回复
  13. 纯干货,太实用了,谢谢楼主!

    来自广东 回复
  14. 假设是用支付宝渠道的话

    来自上海 回复
  15. 您好,请教您一个问题。对于做电商的平台,想要做到自动退款,确认收货后自动打款到商家账户。是不是需要支付宝为公司开设的中间账号/公司支付宝账号及买家支付宝账号就可以打通了?谢谢!

    来自上海 回复
    1. 是的。

      来自北京 回复
  16. 讲得非常好,分析很全面,值得学习。。。

    来自广东 回复
  17. 膜拜楼主,写的逻辑性超强,而且通俗易懂,期盼跟多好文。尤其是这种系列类的文章,太棒了。

    来自北京 回复
  18. 楼主写得太好了!!有个问题想请教下:虚拟币账号是指实际发生消费时,商家直接接收该虚拟币作为收入?还是说要兑换成相应现金再转给商家?

    来自广东 回复
    1. 商家先接受虚拟币,如何结算需要和商家定协议。

      来自北京 回复
  19. 写的很全面 逻辑清晰 LZ好人

    来自广东 回复
  20. 太实用啦,干货满满!把支付这块知识梳理得很清楚。刚刚做了一个支付系统,如果早看到这个就好了。有几个问题,希望老师能回答一下:
    1.为什么要设置多种账户模型?是因为每种的钱不一样(有的是虚拟币,有的是人民币,有的是美金),每种的权限不一样(有的自动扣减,有的需要用户授权)吗?
    2.文中留下的问题优惠券需要设置账户吗?一次性使用的储值卡需要设计账户吗?充值的储值卡需要设置账户吗?
    3.交易记录和交易流水有什么区别?交易台账是什么意思?
    4.交易记录在什么情况下会修改?提交订单后商家修改运费或商品价格算吗?
    谢谢!

    回复
    1. 1. 账户模型在实现上可以统一成一个,也可以分开建模。 取决于其中差异性。在业务实体上是多个。
      2. 优惠券可以不设置账户;一次消费的储值卡也可以不设置账户,当做优惠券处理; 可以多次消费、充值的储值卡,需要建模成账户;
      3. 记录、流水、台账,在会计上有不同含义,但对电商系统来说,无太大区别。
      4. 交易记录不是一次全写入的,会分阶段写入。 修改运费和价格,需要更新交易记录,但这字段和原始运费、价格,需要存储在不同字段中。

      来自北京 回复
    2. 懂了。太感谢啦!

      回复
    3. 1、我还想深入了解一步,什么时候能设置账户,什么时候不设置账户?
      2、假如系统里面有积分,积分也可以用来抵扣货款,那积分要设置账户吗?
      3、什么叫做支付属性?
      请楼主指点。

      来自广东 回复
    4. 这里积分类似虚币,需要账户。

      来自北京 回复
    5. 老熊,方便留个微信不 , 有问题可以跟你讨论一下。

      来自广东 回复
    6. 关注下“凤凰牌老熊”公众号,在公众号下留言即可。

      来自北京 回复
  21. 这个支付还是需要研究一下的

    来自北京 回复
  22. 流程设计一直是弱项,学习啦!流程设计一直是弱项,学习啦!流程设计一直是弱项,学习啦!流程设计一直是弱项,学习啦!流程设计一直是弱项,学习啦!流程设计一直是弱项,学习啦!流程设计一直是弱项,学习啦!流程设计一直是弱项,学习啦!流程设计一直是弱项,学习啦!流程设计一直是弱项,学习啦!流程设计一直是弱项,学习啦!流程设计一直是弱项,学习啦!流程设计一直是弱项,学习啦!流程设计一直是弱项,学习啦!流程设计一直是弱项,学习啦!流程设计一直是弱项,学习啦!流程设计一直是弱项,学习啦!流程设计一直是弱项,学习啦!流程设计一直是弱项,学习啦!流程设计一直是弱项,学习啦!流程设计一直是弱项,学习啦!流程设计一直是弱项,学习啦!流程设计一直是弱项,学习啦!流程设计一直是弱项,学习啦!流程设计一直是弱项,学习啦!流程设计一直是弱项,学习啦!流程设计一直是弱项,学习啦!

    来自北京 回复
  23. 流程设计一直是弱项,学习啦!

    来自北京 回复
  24. 写的好全面,适合我这种小白 🙂

    来自江苏 回复