支付系统该怎么设计、怎么做、如何做?

2024-04-06
来源:网络整理

这几年我一直在和支付打交道。 通过skr-shop项目,跟大家分享一下如何设计和实现支付系统。 我们首先通过分析一些常见的支付流程来找出这些支付的共性,然后讨论抽象后具体的数据库设计和代码结构设计。

相关项目:

整体的支付流程是:向第三方发起一笔交易,用户通过第三方完成支付,第三方告诉我支付成功,我把用户购买的产品给用户。

看似简单的流程,但是不同的支付机构这里的流程是不一样的。下面是我接触过的一些支付的总结:

国内支付

国内典型的支付代表有:支付宝、微信、银行(以招商银行为例)。 由于国内支付支持多种支付渠道,为简单起见,我们以PC端支付为例。

支付宝

我认为支付宝是最简单的支付方式。 对于PC端支付功能,支付宝提供【电脑支付】。 用户下单后,商户系统根据支付宝的规则构造一个URL。 用户跳转到该URL并进入支付宝支付页面,然后完成支付流程。

支付成功后,支付宝会通过同步通知和异步通知两种方式通知商户系统支付成功。 两种通知方式的结果都是可信的,并且异步通知的消息延迟也很短。

对于退款流程,支付宝支持全额退款和部分退款。 并且可以根据商家的退款单号区分是否是同一次退款,避免重复退款的可能。 支付的退款是调用后同步返回的结果,不会异步通知。

微信支付

微信不提供真正的电脑支付功能,但是我们可以通过【扫码支付】来达到电脑支付的目的。 扫码支付有两种方式。 这里我们以模式2为例。

微信调用点餐接口获取二维码链接,然后用户扫码进入支付流程。 支付完成后,微信会异步通知你,但这里没有同步通知。 因此,前端页面只能通过定时轮换的方式检查交易是否支付,直到查询成功或者用户主动关闭页面。

退款流程与支付宝最大的区别在于,有一个异步通知,需要商户系统处理。

第一个区别:

异步通知的接口需要处理多种不同类型的异步消息

招商银行

随着我国在线支付的蓬勃发展,各银行不断推出自己的在线支付功能。 其中的佼佼者无疑是招商银行。 这个支付方式在滴滴上就有,大家也经常使用,大家可以尝试一下。

招商支付使用银行卡,首次使用的用户必须绑定银行卡。 因此,这里可能还有一个额外的过程。 首先,必须记录用户是否绑定了卡。 那么用于签名的公钥就会发生变化,需要定期更新。

招商银行各平台支付体验一致。 会跳转到招商银行的H5页面,完成逻辑。 支付成功后,不会自动跳转回商户。 也就是说,没有同步通知。 其支付结果只会经过异步通知流程。 延迟时间非常短。

退款流程与支付宝相同。 退款结果同步返回,无需异步通知。

第二个区别:

付款前需要检查用户是否已签订合同,是否有签订合同的流程。

概括

国内在线支付流程比较完善,接入也非常方便。 需要注意的是,退款后,之前支付的订单仍处于支付成功状态,不会变成退款状态。 因为退款和付款是不同的交易。

这基本上是国内在线支付的常见做法。

国际支付

包括支付宝、微信在内的许多国际支付平台也在拓展这个市场。 我根据我接触过的支付服务做一个简单的总结。

这是一家比较知名的国际支付公司。 主要涉及银行卡支付。 该公司总部位于英国。

在支付过程中,按照规则构造好请求的URL后,会直接跳转到通过信用卡完成支付的页面。 这里比较麻烦的处理机制是:支付成功后,他第一次给你的异步/同步消息通知不能作为支付成功的依据。 只有银行确认转账成功后,才会发出真正的付款成功通知。 还可能有异步通知告诉你支付请求被拒绝。最麻烦的是,不同状态下异步消息的时间间隔是按照分钟甚至更长的延迟来计算的。

退款流程方面,状态与微信相同,需要通过异步消息确认退款状态。 其次,它的不同之处在于,无法根据商户的退款单号来确认是否发起退款。 因此,只要请求一次退款接口,就会默认发起退款。

第三和第四个区别:

支付成功后的通知状态有多种,涉及到商户系统业务流程的特殊处理。

退款不支持商户退款单号,不支持防重复退款,需商户自行办理。

这是俄罗斯的一家支付公司。 也是一个杀人不偿命的公司。 请看下面的介绍。

其付款启动需要构建一个表单并向其发布与付款相关的数据。 成功后会跳转到其支付页面,用户即可完成支付。 对于同步通知,则需要用户手动触发跳转回商户,这与招商的逻辑非常相似。 同步只是返回,并不真正告知支付结果。 异步通知才是真正通知付款状态的方式。 更恶心的是,支付时必须传入指定格式的商品信息,这些信息将用于部分退款。

现在说到退款,退款也是同样的道理。 不支持商户的退款单号,所以在防修方面,我们可能会设计自己的系统。 而如果是部分退款,则需要传入指定的退款产品,这会导致一种非常尴尬的情况:部分退款的金额与任何产品的金额都不对应,退款会失败。

第五个区别:

部分退款时,需要传入部分退款的商品信息,且金额必须一致。

多库

接下来我们来说说印尼的支付机构doku。 由于信用卡在印尼的普及程度不高,其在线支付提供了超市支付方式。

什么是超市支付? 即用户在网上完成订单后,将获得一个二维码或条形码。 用户携带该条码到超市(711、全家等)与收银员扫码,然后向超市支付现金,完成支付流程。

这种方式带来的问题是用户长时间不付款,导致订单超时,未付款就关闭订单。 它给整个业务流程和用户体验带来了很大的危害。

我们来谈谈退款的事。 由于超市支付方式的存在,此类支付无法支持在线自动退款。 需要手动采集用户银行卡信息,然后完成转账操作。 很痛苦。

第六个区别:

没有在线支付,只获取支付码,退款需要手动操作。

由亚马逊出品,与支付宝非常相似。 提供的是集成的钱包流程。

支付时,直接构造一个URL,然后跳转到亚马逊即可完成支付。 还提供了授权模式,可以在商户端完成支付,无需跳转。

支付成功后,也会同步跳转。 同步通知的内容可以作为判断支付是否成功的依据。 经过实际检查,异步通知的到达会略有延迟,大概在10秒之内。

退款方面,也支持商户退款单号,可据以防止欺诈。 但退款状态也是基于异步的。

总结

还有一些国际支付,比如: 、 、 、 等知名支付机构就不介绍了,因为他们的流程基本都是上面的模式。 我们后续的代码结构设计和数据库设计都是基于满足上述各种支付模型。

最后给大家一张思维导图。 这是连接支付公司时必须澄清的问题列表。

下一篇文章预览:《支付数据库及代码结构设计》

这是我们几个朋友利用业余时间思考的一些商业设计。 如果写的有什么错误或者不完善的地方,希望大家多多评论,互相学习,互相提高~

项目地址:

skr-shop项目成员介绍

排名不分先后,字典顺序

昵称介绍 个人博客

毕业生创业者,目前就职于小米科技海外商城团队从事商城后端研发

--------

大禹

开源作者、服务器开发人员

曾就职于百度/融360,现就职于小米科技海外商城团队从事商城后端研发。

--------

PHP框架作者,有A/B/C轮电商创业公司工作经验,目前在小米科技海外商城团队从事商城后端研发。

分享