支付系统设计小结
支付作为平台最核心的基础能力,其重要性不言而喻。
对于平台而言,支付功能最简单粗暴的实现方式是业务系统直接接入支付渠道,支付和业务耦合在一起。流程见下图。
但随着业务的多样性和复杂度的变化以及业务量的提升,需要有独立的系统来维护支付规则,管理支付渠道,记录支付信息。因此引入支付系统,业务流程升级为:
在一个消费者付款流程中,支付系统需完成以下任务:
1、接受业务系统的业务订单;
2、根据业务订单类型及金额判断可支持的支付产品并返回给前端页面,让用户选择;
3、根据用户选择的支付产品,选出具体执行扣款的支付渠道;
4、根据选出的支付渠道要求组装指令,调用渠道执行扣款任务;
5、获取支付渠道通知的扣款结果或主动查询通道扣款结果;
6、通知业务系统支付结果;
以上6个任务在具体执行中可以分化出以下几个单体:
1、支付应用
平台交易每天有无数订单,支付系统需要将订单进行分类。不同类型的订单对支付渠道有着不同的需求,可以将订单类型对支付渠道的需求规则维护在支付应用层。
支付应用提供给上层业务统一模块化的调用方式,业务层而不再需要关注支付的实现。一般来说,支付应用可分为: 即时消费(消费类订单),充值(钱包类业务),转帐(钱包类业务),提现(钱包类业务),退款(异常情况处理)等。
2、支付核心(支付产品)
支付核心将下游支付渠道自身带有的原子化功能(鉴权,签约,扣款等)封装后提供给上游统一调用。上游通道仅需明确具体支付产品和金额后,由支付核心根据路由选出的渠道的接口要求组装指令,调用渠道支付接口。
支付核心应封装渠道包括验证要素,支付额度,手续费,结算账户,查询方式等属性。也要能新渠道接入的可扩展性,屏蔽各渠道的差异,将渠道差异统一维护在单个系统中。
3、支付路由
用户选择支付产品后,可以有多个支付渠道支持对应支付产品。系统需要根据特定逻辑选出具体的支付通道去执行扣款,而这个特定逻辑就是支付路由。
这里至少要包括以下几个逻辑:
1) 指定走某条通道、指定不走某条通道;
2) 选出限额满足订单金额的支付通道;
3) 选出手续费较低的通道;
4) 现有的支付要素是否满足通道要求,是否仍需要用户参与。
另外,支付应用中支持的具体支付产品,也可在路由中实现。
4、渠道管理
支付路由,和支付核心都需要根据通道特性进行判断,可以独立维护一个系统来记录通道的特性。当通道属性发生变化时,比如需要参数发生变化,费率发生变化等,通道维护时,可以在渠道管理系统中配置相关信息即可,而不需要重新发版。
基于上面的讨论,可以抽象出下面两张模型图。
支付模型
支付系统
以上仅是收款环节的设计概述,其中仍有很多单体可以展开来讲,快捷产品设计,支付路由,账户系统等等,有机会再提。
以上仅是个人在实践中的总结,如有不对的地方,还请指正。
支付收银系统设计概要,这里我们为了方便扩展,增加一个业务方的概念,即一个收银系统接入多个业务方,这个业务方既可以是不同的部门也可以是不同的业务。
下面是系统的交互时序图,可以参考下一个大概的流程。
客户端下单,完成业务订单的创建。
客户端用业务系统的订单请求支付收银系统支付,支付系统请求三方支付,完成支付请求。
这是一个标准的支付请求流程。
支付宝的系统采用的是一个典型的从渠道到产品到服务到支付渠道的应用架构,其中服务根据业务的发展,一方面考虑平衡业务的增长与创新,另一方面考虑系统的安全、稳定、可伸缩。所以系统架构设计上需要构建稳定的基础业务服务,通过服务重用实现业务敏捷,同时保障核心安全稳定。
对于各类的支付场景,其典型处理模式如上图所示,互联网商户访问渠道系统,通过API平台接入,经过产品层,封装订单处理,然后调用收银台或者直接调用交易,交易过程中附加计费、营销、风控,然后到支付处理,支付处理再到清算处理和账户会计处理,最后通过渠道通信前置调用银行渠道完成支付交易落地。
支付交易的处理在上述流程下就很好理解了,首先,业务系统通过收银台或者支付API将交易发到支付系统,支付系统通过账务交易记录账务并给到会计系统,然后通过清算模块与银行渠道完成支付落地,最后将清算模块与会计记录进行核算。
账务和会计相关我之前专门有一篇文章分析,此处就不再赘述。
传送门: 【支付系统设计从0到1】支付宝架构中记账功能设计分析
在支付清算这页里我们看到,支付宝分了支付系统和清算系统作为联机交易,其实这就是我们之前讲的支付系统设计中的支付产品和支付渠道,然后通过记账指定给到账务系统里再做记账,联机记录交易流水,异步做复式记账。这其实也是我们在设计支付清算系统的时候的一个原则:为提高交易性能,交易必须与账务分离,以提高交易处理性能和效率,从而有针对性的分块解决复杂业务逻辑。所以,我们在支付系统设计中一般是将记账为分2个步骤,支付成功后系统同步记录流水账,异步通知会计系统做复式记账,如下图所示。
支付系统中实现四种的支付方式,充值,提现,内转,充退等。而清算系统完成跟渠道之间的渠道管理、任务调度、实时处理以及文件处理、还有接收异步清算处理。
支付宝架构中的交易系统就是我们之前支付系统架构设计中支付产品所实现的功能,包括各种支付方式的实现(担保交易、即时到账交易、货到付款交易等)。
另外,这里面还包括了:数据持久、流程引擎、规则引擎、超时处理、资金处理、产品账接入、收费接入、商户通知、统一事件等。
商户通知和统一事件通过消息系统异步交易时间处理。
整体分为交易系统(OMS)、支付系统、清结算系统、对账系统、会计报表(非必须)等几个部分。
支付系统是负责电商系统收款和出款的子系统,需要支持电商平台与外部渠道间,所有收款和出款的功能,以及电商平台内部账户间转账的功能。简单来说,支付平台需实现充值、提现、转账、退款四方面的功能。
一般来说,支付系统由以下几个功能组成。
第三方支付:微信和支付宝占据国内移动支付的绝大部分份额,因此是一定要接入的。
按照结算类型来分,收款类一般有即时到账、担保交易两种,出款类有转账、银行卡代付等。
如果电商平台有支付牌照,可以自己分账,或者收款类型为年费等无需分账的交易,那么可以选择即时到账方式收款。
如果电商平台没有支付牌照且需要给实现二级商户分账,则可以选择微信的收付通或支付宝的直付通等产品。但用户通过微信支付的订单才能通过微信的产品来分账结算,支付宝支付的订单才能通过支付宝的产品来结算,对于平台对接、商户收款皆有不便之处,因此电商平台很少选用这种方式。
银行卡支付
一般来说,电商平台接入了微信和支付宝后,已经可以满足大部分支付需求,无需再接入银行卡支付。而对于购买了支付牌照的大型电商平台,想要打造自己的支付工具,才会对接各大银行,接入快捷支付功能。或者有一定规模的电商平台也可以直接与银行签约,开通快捷支付接口。
和第三方支付不同的是,银行卡收单、退款,一般都不是实时结算的。而支付公司与电商商户的收单交易,是实时结算的,实际是支付公司提前垫资。
快捷支付
现在市面上大部分电商app中,银行卡支付功能都是使用的快捷支付方式。对于电商平台,如果需要接入银行卡快捷支付功能,有两种方式:
例如电商平台在工行开通了快捷支付接口,用户签约了工行卡快捷支付,用户付款后,资金扣款成功结算后,会进入电商平台在工行的结算账户。注意快捷支付是有经营业务种类限制的,只允许在签约经营范围内的业务收款,即MCC码。
如果是第三方支付公司,因为不允许与银行直连,需使用银联或银行提供的网联接口,用户支付后,网联结算后,金额会转移到支付公司在银行开设的备付金账户。
对于电商平台,与银联对接要方便快捷得多,一次接入即可搞定大多数银行卡的快捷支付;而对于有支付牌照的电商平台或第三方支付公司,为了更低的手续费,才会选择与银行直接对接。
银行卡快捷支付,需要先绑卡签约,后续则无需任何验证完成扣款,而为了安全性,电商平台会加上指纹、人脸、短信或支付密码验证,仅小额支付可以免验证。
快捷支付的签约,需要提供三要素(姓名,身份证号,银行卡号)或四要素(银行预留手机号),信用卡可能额外需要有效期和背后后三位数cvv。注意支付公司或电商平台是不允许保存用户的cvv码的。在快捷支付签约前,用户需先完成实名认证或更高级别的认证,以保证签约卡为本人银行卡。国家法规对于第三方支付用户的信息验证有3个等级,三级为最高安全等级,对应的付款限额和支付范围限制也更大。
对于第三方支付公司,为了安全性、手续费等原因,会与同一家银行,不同的总行分行,或者银联等其他通道,分别签约快捷支付;用户在绑卡签约时,或者后续签约支付时,可能在签约一个需短信验证的通道的同时,还签约了其他无需短信验证的通道。后续用户使用快捷支付时,支付渠道路由会自动选择当前最合适的支付通道发起扣款。对于同一张卡的快捷支付额度,使用不同的支付通道的额度是独立的,但总额不超过发卡行的限制。
对于产品侧来说,如果要实现快捷支付功能,前端需要实现签约卡管理、新增签约(录入卡信息 - 识别卡信息 - 签约结果返回)、解绑功能。
不管是第三方支付还是快捷支付,和支付公司签约时,都可以绑定多个收款账户,有时为了财务上的区分,不同业务可使用不同收款账户收款。
银行转账基础原理
跨行转账有超级网银和小额转账两种,限额都是5w以内,开放时间都是7*24小时,不同的是超级网银实时结算,小额转账银行跑批处理,是准实时的。大额转账是在5w以上,开放时间是工作日的 8:30 ~ 17:00,实时结算。银行提供的转账产品,基本都是基于上述三种方式包装的。
电商业务的退款、商户结算、佣金结算、供应商货款结算等业务都涉及到出款。
退款:一般来说,在支付后一段时间内(一般3到6个月),可以使用原支付渠道的退款功能,将资金原路返回。如果超过时间限制或部分退款次数限制,则无法原路返回。退款最多可能5~7个工作日才能确认返回状态;对于银行来说,一笔已经清算的收单交易,手续费已经扣取;就算产生退款,之前的收单手续费也不会退回。如果在结算之前退款,银行侧可能支持按比例退回手续费。第三方支付公司与电商平台之间退款手续费的收取,由双方协议决定。
银企直连:若电商公司已接入银行的银企直连产品,且支付对象已绑定银行卡,则可使用此方式。
第三方支付的代付功能:对于高频小额的付款需求,且用户已绑定第三方支付账号情况下,可使用此方式。
企业网银:一般用于2B的大额资金转账。资金结算或者用户提现。
对于第三方支付公司,用户提现时,同一个出款账户,会归集一定量(金额或条数)之后批量提交银行处理,所以提现不一定能够实时到账。
出款的前提是用户已实名认证,并绑定了实名对应的银行卡。绑卡需要验证四要素,会需要用到第三方支付提供的信息验证接口,或直接与银行对接。已经签约过快捷支付的借记卡,也可以用于该账户资金提现,无需再次验证。
各个支付渠道的接口指令各不相同,为了方便业务调用以及日后拓展维护,需要建立一个统一的支付网关,开放给业务使用;业务调用时同时指定支付渠道,支付网关请求渠道路由,按照事先配置的路由规则,返回最合适的支付通道,发起支付请求。
网关需实现不同类型的功能接口,一般来说就是支付通道侧接口能力的并集,如充值、提现、转账、退款、签约查询、实名认证校验等等。
引导路由:是指用户在付款时,给用户展示支付方式的规则,包含可见状态,可用状态,展示顺序等。引导路由的意义是,根据用户支付的场景,引导用户选择平台侧希望用户选择的支付方式。平台侧的需求一般是支付成功率高(通道稳定,额度充足)、费率低等,也有因不同支付渠道商务合作关系,限定额度分流的原因。
匹配接入的支付渠道比较少时,引导路由作用不大,一般可能只有一个简单的权重配置后台,即所谓的静态路由,或者直接记住用户上次选择的方式即可。
渠道路由:对于电商平台来说,如果只接入了第三方支付,则不存在渠道路由。对于支付公司来说,如果接入了不同银行、银联网联的快捷支付接口,且用户选择的银行卡签约了多个通道时,渠道路由则按照路由规则去匹配权重最高的渠道,发起扣款请求。
在断直连之后,支付公司的代收服务,只能通过银联或网联接口,因此渠道路由意义也削弱了。对于代付服务,支付公司会在各大银行都开设收付账户,将跨行转账都转化为同行转账,以提高转账速度免除手续费,同时支付公司需要做好备付金管理系统,自动或人工管理监控调拨各行备付金。
当业务向支付网关发起支付请求时,支付网关需要对业务方进行鉴权判断,确定请求是否合法。一次支付请求一般包含以下元素:业务标示,支付时间,支付金额,支付账号,支付客户端信息,支付订单信息等。支付网关需要确认各个元素都合法,比如支付时间是否在有效期内,此支付单是否过期;支付账号状态是否正常,支付订单是否是可支付的,商品是否有库存等等。同时还需要将这些信息过一遍风控,风控那边会根据各种规则判断此次支付是否有风险。风控是一个比较复杂的系统,属于另一个专业领域,在此不细说。
电商平台向支付渠道请求支付后,支付渠道会同步或异步返回支付结果信息。如果支付渠道不主动返回结果,电商平台侧则需要定时去轮询结果。同时电商侧需要将支付请求信息、结果信息、结果凭证等保存下来,也就是支付流水记录。支付流水记录是之后电商与支付渠道对账的凭证。
拿到支付结果记录后,支付系统需要向支付请求方返回支付结果,同时通知账务系统,触发对应的记账操作。
各个支付渠道都会按日和按月生成交易记录文件和资金流水账单,分为支付、退款、提现等类型。交易记录文件相当于信息流凭证,资金流水账单相当于资金流凭证。
银行渠道一般也会推送资金流水文件,但不是所有银行的交易都有业务对账文件,通常收单交易业务对账文件会普遍一些。
电商的支付系统或者对账系统,需要做的事情:
支付系统同样需要和上游各个业务系统进行对账,包装支付状态金额的一致性。一般采用明细轧帐的方式。
收单对账常见问题:
长款:用户支付了但是交易系统未确认支付成功,这种情况需要及时补单或者退款处理,一般如果业务侧订单状态是待支付则可转为支付成功,状态是已取消则自动退款;也有可能是测试数据混入了生产环境;也有可能能与之前的短款差错互相抵消;
短款:一般是日切问题导致,挂账后下个会计日继续对账;或者看是否能与之前的长款差错互相抵消;
重复支付:一般支付渠道都不允许重复支付同一个订单,发现重复支付也可以自动退款处理;
金额不一致:可能用户支付后,支付结果返回之前,交易系统订单金额变化了
退款常见问题:
网络问题或接口问题导致退款失败,这种情况可自动再次提交退款;
对方账户状态异常导致退款失败,这种无法走原路返回退款方式,只能转账/代付;
退款时需要处理好支付手续费的退款,以及退款手续费谁来承担的问题,一般是按比例退;
对于短款差错,可挂账7天处理。
提现常见问题:对方账户状态异常导致退款失败,需要及时通知用户处理。对于短款差错,可挂账3天处理。
产品侧需要设计对账管理后台,可查看支付流水,对账批次记录,差错处理后台等。对于固定处理方式的差错类型,可做成自动化处理。
合单支付是指用户一次支付多笔订单,在电商中很常见。电商业务侧需要自己做好订单拆分,支付系统中,如果使用支付渠道的合单支付接口,则会自动拆分记录支付流水,是最佳的方式;如果支付渠道没有合单支付接口,则可拆可不拆,按原始记录保存简单不易出错,拆分记录则可方便其他业务处理。
混合支付是通过多种支付方式,支付一笔订单,比如余额+快捷支付。混合支付会按照不同支付方式,生成多笔支付流水。
因为不同支付方式,支付成功率不同,可能会发生有的支付方式扣款失败的情况。因此混合支付需要按照支付成功率,优先扣款成功率较低的支付方式;如果有某些支付方式扣款失败,需要判断是取消支付,全部退款,还是提醒用户换其他方式继续支付;全部支付方式都扣款成功后,这比订单才支付完成。后续订单发生退款,如果是部分退款,需要判断,优先退款手续费最低的支付方式。
电商平台或支付公司有时候会做营销活动,出钱补贴支付,也可以用混合支付方式处理。
据说余额+卡的混合支付有洗钱风险,目前已逐渐少见。
对于大额订单,可以采用分次、分阶段支付的方式,实质也是一种混合支付。
订单完成时,电商平台需要扣取平台佣金,结算货款给商家;若涉及推广服务,则需要计算推广用户的佣金和税额,再结算给推广用户。
按照法规,没有清结算牌照的电商,不允许自行截存货款,之后再结算给商家。电商平台可以选择第三方支付公司或者使用银行的电商清结算产品,由他们代为保存货款,之后再结算给商家。此类产品需要先提交商户资料给支付渠道或银行审核,审核通过后,用户支付此商户订单,提交支付同时上送清分规则(分给哪些人,按照什么比例或金额)。在订单交易完成时,电商侧提交结算请求,支付平台按照此前支付时上送的清分规则进行分账结算。部分支付平台,需要在结算时由电商平台指定分账对象和金额,但这样略有二清嫌疑。
选择这类清结算产品时,还需要注意以下几点:
接入此类产品后,除了后端的支付、结算接口对接以外,电商平台商户侧客户端,也需要对接好商户入驻进件,提现账户绑定,结算账单等功能。
电商平台常见的分销、主播代销、拼团、淘宝客等销售模式,其中“分销商”或“团长”角色,本身不是销售主体,在订单完成后可获得推广佣金。一般来说,这部分推广费用,在订单生成后,商户侧可在订单费用明细中看到此支出项;在订单结算时,可将推广佣金与平台佣金一起扣除,再由平台将推广佣金结算给推广人员。
这类支出属于劳动报酬,平台有为推广人员代缴税的义务,需要按月计算税率和金额。因此部分平台采用月结的方式,每个月指定日期,计算每个待结推广人的税费,扣除后再将税后金额结算给推广人。也有部分平台(比如O2O,网约车平台等),会自己承担此部分税费(羊毛出在羊身上),在订单结算时,即时将推广佣金结算给推广人,次月再统计推广人税费,平台自己为推广人交税。
平台也可以采用各种税务筹划方式,比如“灵活用工”的方式,与推广人建立非全日制劳务关系,这样推广人可以享受更低税率。
平台自行结算给推广人,可使用银企直连、支付平台代付等功能进行出款。而平台代缴税需要推广人的实名信息,所以在推广人在提现佣金之前,需要先实名制认证。
不管采用哪种结算方式,电商平台都需要计算订单结算时的各类费用明细(清分),负责清分的模块,也叫做计费系统。
电商平台有花样百出的扣点规则,比如按商品、按商户、按品类、按营销活动等规则扣点,以及各类推广佣金等。扣点规则路由对应着各类扣点规则,比如针对商品、商家、类目的扣点规则管理后台,基本元素是扣点对象、扣点比例、扣点上线、规则生效时间范围、规则状态等。产品经理需要和运营人员确认好扣点规则判断逻辑,即根据怎样的条件判断顺序,确认订单适用的扣点规则。之后加入新的扣点规则时,也需要维护这个扣点规则路由。
扣点规则路由各电商平台都不一样,可能包含营销活动、下单/支付客户端、买家身份、扣点规则权重等等。
一般在订单创建时,扣点规则路由就需要根据订单相关的信息,判断出订单适用的扣点规则并记录下来。同时也需要将用于判断的信息元素保存下来,以作为之后核对凭证。
如果订单有推广员的参与,则也需要在订单创建时,计算出需要扣除的推广费用,并保存记录相关推广员信息。
在计算各方分账明细时,需要注意几点:
与订单交易相关的清算,一般来说,是在订单状态变为终态(交易完成,退款完成),且订单尚有待结算金额时,由交易系统向清结算系统提交清结算请求。也有一些多次结算的场景,比如订单里有部分商品先确认收货时,也可以先结算部分金额,后续再结算剩余金额。
对于有支付牌照的大型电商平台,为了提高商户的回款速度,也可以在订单尚未变为终态时给商家结算货款,比如用户确认收货时或者商家发货时。如果结算后订单发生退款,则再在商户钱包中扣除相应金额。此类结算方式需要平台侧有比较成熟的风控能力,通过风险控制和风险转移的方式,防止平台资金损失。比如和商户签约协议,设置商户保证金,商户&买家风控,购买对应的赔付保险等等。
交易系统向清结算系统发起结算请求时,需提交结算订单、结算金额、结算类型(完全/部分结算)等字段。清结算收到结算请求后,可能实时结算,也可能异步周期结算,比如每X小时一次等,视业务量大小决定。
开始结算时,计费中心从账务系统获取订单待结金额,根据结算类型核对结算金额,核对无误后,冻结待结算金额,并提交到计费中心;计费中心找到订单快照中的扣点规则,计算分账明细。
计费中心计算出各方分账明细后,需要和账务中心进行实时或准实时的对账,保证需结算的金额等于各方分账明细之和。核对无误后生成预结算单。
大部分订单,此时结算中心可将结算单提交到支付系统,进行最终的资金转账。小部分订单,结算单可能需要人工审核,则需要审核通过后再提交到支付系统,或者驳回撤销此次结算。
各分账方一般会提前在支付系统内部开设好账户,支付系统会将资金结算到各方的资金账户中,对于支付系统来说,仅涉及内部账户间的资金转移,因此很少会出现结算支付失败的情形。
支付系统返回结算成功结果后,结算单状态变为结算完成;结算系统需要实时通知交易系统和账务系统,账务系统记录各账户资金变化,更新账户余额;交易系统则触发对应的消息通知等关联服务。如果有会计系统的话,也需要异步通知会计系统,进行会计分录记账。
对于成熟的支付公司,会有账务系统和会计系统两套系统。这两套都是以会计分户模型来设计,不同的是账务系统是直接面向业务使用,随着业务信息流实时记账并更新余额,账务流水更多记录交易相关内容;会计系统是面向财务会计使用,一般是异步入账,使用严格的复式记账法。
账务系统中的账户,必须是在是账务系统分户中的叶子科目下。两套系统之间的分户模型,会有多对多的关系。账务系统这套体系可称为分户账户(外),会计系统这套称为分户账户(内)。
按照复式记账法,一般分为资产、负债、损益、共同类等。
交易的实质就是各金额账户间资金的转移,因此首先需要建立好对应的账户。
账户设计遵守三户模型:客户、账号、账户。
客户:指自然人或企业,必须要实名认证才可以开通支付账户,客户以身份证号为唯一标识。
账号:登录账号,一个客户可以有有限多个账号,即一个身份证可以用于有限多个账户用来实名认证。但对于同一个支付公司,一个身份证下多个账号,支付额度上限是共享的。根据身份认证信息丰富程度,支付平台余额账号等级分为一二三类,3类拥有的支付额度和权限最高是20万/年。余额提现、余额宝支付、信用支付无年度额度限制。银行卡快捷支付签约、提现银行卡绑定等操作,也是以账号为主体操作。
账户:每个账号在支付平台或电商网站,都会有多个不同功能的账户。商户侧有货款结算账户,保证金账户;买家侧有支付账户,信用支付账户,积分账户;或者电商平台侧的内部账户,比如活动补贴账户,订单担保账户等。
账务核心主要有四张表:分录流水、分户账、明细账、总账。
首先需要有一个交易码 - 分录规则的分录规则表,用来维护每种用交易码区分的交易场景,发生时应该如何拆成会计分录的规则。比如定义交易码1001为订单银行卡快捷支付,那一笔订单付款流水,经过支付平台,同步到账务中心时,根据同步过来的交易码1001,找到对应的分录规则,按照规则中的定义,生成会计分录:
当一笔业务发生时,首先生成分录流水,然后驱动账户余额变化,账户余额变化后,生成明细账。日终根据分录流水生成总账。根据业务需要,也可以先修改账户余额,然后异步生成分录流水,但是无论先生成会计分录,还是缓冲异步生成会计分录,都要保证分录流水与分户账余额的一致性,这一点通过日终系统的检查来保证。
每天首先需要做支付渠道的对账,然后再进行账务系统和会计系统内对账。
需要做到:
错处理需达到2个效果,一个是完成对账,另外一个是将账务对平,常见的账务处理方式有挂账、登账、调账。
补单:通过人为干预方式,将原有业务进行下去,如通过接口人工干预订单状态
挂账:对于不平账单,先挂起,等查明后再进行相应处理
登账:会计记账,伴随虚拟资金从一个账户向另一个账户转移的过程(原始凭证)
1、多账
多账主要存在2种情况,一种是异步通知未收到,优先采用补单处理,另外一种是同订单2次支付,一般通过登账处理
2、短账
基本不会出现,一般通过签名防抵赖机制与第三方协调处理。协调一致后通过人工增加对账单进行平账。
3、金额不一致
出现概率极低,一般为电商平台内部计算有误。
首先得先解决此bug,然后根据异常订单相应处理,比如说撤销对账,修改系统或对账单金额后再进行对账。
1、支付分账系统的使用场景
支付分账系统的使用场景:适用于平台和子商户的结算,举个例子来说:平台(橙色购物软件)和子商户(某旗舰店)到了约定的时间,关于用户支付了99.8元的货款,橙色购物软件和旗舰店怎么瓜分的过程。
2、分账的前置条件
大多数中小型的公司是不能完成分账工作的,因为分账的前提条件是有资质能收取各个商户的资金并进行拆分结算,但如果没有支付牌招去进行收款、分账,则会违法国家法律规定,也就是我们常说的二清,所以平台企业除了购买支付牌照以外,也可以借助支付分账系统来完成分账。
3、分账的类别
分账方式说的是分账时可以根据单个商品,也可以根据某个时段内订单的累计金额进行分账。根据订单商品品类的不同,或者是其他的原因,有些商品是不参与分账的,比如商品引流款不分账等等。大致的类别包含部分分账、不分账、全部分账。而在部分分账的逻辑中有些是按照固定金额,有些是按照比例分账的,具体要根据业务的实际情况去选择,去设计。
4、分账的周期
指逐笔订单分账或是到了约定的日期如月底进行统一分账。逐笔订单分账是说用户A支付了一笔99.8元,则立马完成分账这个动作。约定日期是用户A支付了99.8元,用户B支付的500元,但是都暂时不进行分账,等到了月初、月中或者月末等约定时间再进行统一的分账结算。
5、分账的比例
分账的比例是针对于部分分账的情况进行详细说明。分账的常用的方式可以根据单个商品订单走,也可以根据某个时段内的累计金额进行分润,分润的比例可以自由定义。需注意:按比例计算之后,因为客户支付的金额不一定是整数,按照比例计算之后算出来的可能是小数后四位数,而系统在单条处理的时候可能进行取舍,比如100.8652,则取为100.87,而为了保障对账的一致性,则会将另外的多算金额,在剩下的角色的提成扣除减少的部分。
6、结算方式
结算方式包含自动发放还是手动发放这两种。一是系统按照规则计算好分账金额后,由系统自动发放分账资金,二是系统算好分账资金之后,需要人工的干预,人工核对完成,确认无误后,再进行资金的发放。
7、手续费
手续费指的是用户A完成支付后,根据支付平台的规定,有些需要产生手续费。比如用户支付1000元后,实际到账只有996元,中间的手续费需要有人来承担。按照业务实际情况,可以选择平台承担,共同承担,或者是子商户来承担等。
以上就是支付分账系统设计需要考虑的几方面,由于支付分账系统设计较复杂,研发成本高,现如今大多数的平台企业都是选择现成的系统。市面上可提供支付分账系统的机构大致可以分为三类:银行、支付机构、以MallBook为代表的分账服务商。不过,银行和支付机构门槛相对较高,多方对比之下,分账服务商才是平台企业最具性价比的选择,其一般多与银行及支付机构有深度的合作,可以无缝对接优化准入门槛,并且技术也相对稳定很多。
针对一笔商品订单,在支付时,产生一个唯一的支付订单号,这个支付订单号包含了客户选定的支付落地的支付方式和真正的支付渠道。
支付系统对这个支付订单号做交易的幂等。
1.如果不存在该支付订单号,则记库,并标记状态为支付中,然后调用渠道进行支付落地。
2.收到渠道异步通知或者通过查询得到渠道支付状态时,更新该笔支付订单状态
3.如果客户再次发起支付,不给客户产生新的支付订单号,先用该笔支付订单号调用支付系统,支付系统会判断订单号幂等性,如果已支付,则报错告诉客户已支付成功,请勿重复支付;如果支付失败,则新产生流水调用渠道进行支付落地;如果支付状态未知,则告诉客户,交易状态未知,请发起查询或者关单。
4.针对状态未知这种情况,如果支持冲正和关单则最好,如果不行,只能让客户发起查询。在这种情况下,如果客户等不及,才流转到最坏的可能,客户重新下一单商品订单,这单根据最终渠道对账情况,给客户做退款。这种情况下需提示客户确认未发起前一笔支付,再新创建,否则,前一笔需要等第二个工作日状态确认后进行退款处理。
如果出现上述4里面最坏的情况,还是会有用户误操作,直到收到两份商品才发现下重了。此时就得依靠运营/客服的支持了。提供用户申诉的手段,让用户提出哪些订单是重复的,并且由销售系统店家、商品提供者和买家三方共同根据用户操作的记录来协商如何处理。我们需要让技术帮助让这种人工处理的几率尽量小。因为每次处理都会耗费较大的人工成本,和一些运营费用
在实际设计中,无论多么好的技术,也不可能100%的拦截所有的可能性,必须依靠技术+产品设计+运营支持的综合手段才能解决这类问题。所以即便京东这一类电商等也是配合运营手段进行处理。
在实际业务场景中,可能还会有各种各样复杂的情况,我们只能以尽可能保护我们系统自己的方式,将重复下单可能性降到最小,并且即使发生,我们也不能出现短款,再结合运营手段进行差错处理。
全球支付系统是复杂和不断变化的,涉及从订单、欺诈、通知、与各种支付方式的集成到清算和结算等广泛的板块。
在处理复杂的系统时,大多数开发人员可能会遇到一些一致的问题:
在Airwallex,领域驱动设计(DDD)方法被用来指导我们的工程师如何解决复杂的业务问题和系统建模。
然而,DDD只是各种模式的集合,很难将其应用于系统设计。在这篇博客中,我们提供了一个全面的工作流程,介绍了我们是如何在Airwallex应用领域驱动设计的,从中得到的经验教训,以及我们接下来要做什么。
领域驱动设计(由Eric Evans提出)是一组帮助基于业务领域的底层模型设计软件系统的思想、原则和模式。DDD有两个不同的空间,问题空间和解决方案空间。
在问题空间中,您使用战略模式定义系统的顶层的系统层次,这些战略模式关注域、子域和通用语言的分析。
在解决方案空间中,采用战术模式来提供一组设计模式,您可以使用这些设计模式创建领域模型。这些模式包括有界上下文、上下文映射、实体、聚合、领域事件、领域服务、应用程序服务和基础设施。这些战术模式将帮助您设计既松散耦合又具有内聚性的微服务。
下面是一个常见的案例:
一位顾客想在该商家的网站上购买一件价格为10美元的t恤。顾客可以用多种支付方式来支付这件t恤,比如Visa卡或微信钱包。在客户支付后,商家会从支付网关收到一个通知,显示客户的支付已经成功。然后,商家可以在Airwallex webapp中查看支付细节,包括购买价格、商家费用以及资金将何时进入Airwallex Global Account钱包。
下面是分析结果。
支付系统
付款处理:商家可以通过各种付款方式接受客户的付款。
金融:清算和解决商家的付款资金。
付款意向:商家创建的订单的价格,产品,客户等。
付款尝试:商家创建的交易以获得订单的客户。
付款方式:客户支付产品的方式。
付款结算:付款之 后钱进入商家钱包。
付款视图:汇总付款详细信息视图,包含与一笔付款相关的所有数据。
有界上下文(BC)限定了域模型的范围。根据对问题空间的分析结果,我们可以定义以下边界上下文:
支付网关: API网关,为商家提供restful API来创建或查看支付。
支付核心模块: 支付意图,方法资源管理。
支付适配器: 与一个外部的PSP集成,例如微信,支付宝,Visa,万事达等。
支付结算: 计算并结算商户每次支付的原则和费用。支付融合:支付明细汇总视图。
下面是生成的上下文映射的一个示例:
从上面分析的场景和通用语言中,我们可以确定以下聚合、实体、值对象和域事件:
根据我们的经验,领域服务为单个聚合使用业务逻辑服务,遵循单一责任。通常,我们将封装领域仓储、聚合修改和在领域服务中发布的领域事件。以PaymentAttemptExecutorService为例:
领域事件可以使系统更具有可扩展性,并避免任何耦合,且一个聚合不应该决定其他聚合应该做什么。
例如,当PaymentCaptureCommand命令将支付状态更改为已支付时,会发出领域事件PaymentAttemptCapturedEvent。在PaymentAttemptCapturedEvent的领域事件处理程序(EventHandler)中,我们可以在该业务逻辑上加上你想要的逻辑。例如,通知支付聚合有界上下文更新支付详情,通知支付结算有界上下文计算结算金额和费用。
在DDD模式中,基础设施层作用于将核心业务领域与技术实现细节分开。该层通常采用ACL (anti - corruption-layer)模式。以领域仓储为例:
领域仓储只定义接口功能,但实现细节应该隐藏在基础设施层中,细节上你可以使用PostgreSQL或MongoDB来保存数据。例如,在基础设施层中,PaymentAttemptPgRepository是基于PostgreSQL的特定实现,而toPO是一个转换器,用于将域对象PaymentAttempt转换为持久化对象。
现在,我们已经为支付系统定义了一组有界上下文,并在每个有界上下文中标识了一组实体、聚合和领域事件服务。下一步是从域模型到应用程序微服务设计。这里,我们选择将一个有边界的上下文映射到一个微服务。
采用DDD可以提供许多好处,例如,在所有团队之间进行清晰的沟通,以及在设计系统时使用成熟的模式来管理复杂性并提供更好的可伸缩性。
使用通用语言,我们可以实现更多的自描述类名和函数名。
使用聚合模式,我们可以实现清晰的边界和单一的职责。
使用领域事件模式,我们可以分割核心业务流程,减少聚合之间的耦合。
通过基础设施层和ACL模式,我们可以将核心业务领域模型与技术实现细节分离开来。通过限定上下文模式,我们可以派生出潜在的微服务候选对象。
在实践中应用DDD时,我们想要分享一些挑战和经验教训:
原文地址: https://medium.com/@chaojie.xiao/domain-driven-design-practice-modeling-payments-system-f7bc5cf64bb3
支付系统是指由提供支付服务的中介机构、管理货币转移的法规以及实现支付的技术手段共同组成的,用来清偿经济活动参加者在获取实物资产或金融资产时所承担债务的一种特定方式与安排。因此支付系统是重要的社会基础设施之一。
各种不同的支付系统通常是与各种不同的经济相联系在一起的。经济社会曾经使用过各种形态的货币在商品交换中转移价值。从最初的实物交换发展到商品货币(例如贵金属)标志着社会生产力的进步。
而法定货币的出现则是支付工具发展史上的第一次飞跃,银行存款作为支付手段是货币制度的一大进步。用电子形式的支付工具完全取代纸凭证形式的现金和非现金支付工具在技术上是完全可以实现的。人们把电子支付工具看成是支付工具发展史上第二次飞跃或革命。
网上支付是电子支付系统的发展和创新。传统的银行结算支付指令的传递完全依靠面对面的手工处理和经过邮政、电信部门的委托传递,因而存在着结算成本高、凭证传递时间长、在途资金占压大、资金周转慢等问题。电子资金转账系统缩短了银行之间支付指令的传递时间,并减少了在途资金的占压。
基于互联网的电子交易支付系统由客户、商家、认证中心、支付网关、客户银行、商家银行和金融专用网络七个部分组成。