完整的支付系统整体架构

转载自 【干货】完整的支付系统整体架构!

 

  从产品分类、模块功能和业务流程,了解支付产品服务的设计。

  支付产品模块是按照支付场景来为业务方提供支付服务。这个模块一般位于支付网关之后,支付渠道之前。 它根据支付能力将不同的支付渠道封装成统一的接口,通过支付网关来对外提供服务。所以,从微服务的角度来说,支付产品本身也是一个代理模式的微服务,它透过支付网关响应业务方请求, 进行一些统一处理后,分发到不同的支付渠道去执行,最后将执行结果做处理后,通过支付网关再回传给业务方。支付产品在支付系统架构图中的位置,如下图所示:

产品分类

  在不同的公司由于接入渠道和应用的差异,对支付产品分类略有不同。综合支付场景和流程,支付产品可以分为如下几类:

  支付产品是由支付系统对支付渠道进行封装而对业务方提供的支付能力。整体上来说,可以提供如下支付产品:

1. 快捷支付

  用户在完成绑卡之后,在支付的时候,不需要再输入卡或者身份信息,仅需要输入支付密码就可以完成支付。对于小额度的支付,甚至可以开通小额免密,直接完成支付。 这种支付方式不会打断用户的体验,是目前主要的在线支付方式。一般快捷支付产品是通过封装银行或者第三方支付平台提供的快捷支付接口或者代付接口来实现的。

2. 网银支付

  用户在支付的时候,需要跳转到银行网银页面来完成支付。在网银页面,需要输入用户的卡号和身份信息。这种支付方式会中断用户当前的体验,一般仅用于 PC Web 上的支付。 网银支付是封装银行提供的网银支付来实现。

3. 协议支付

  协议支付也称代收或者代扣,代收指渠道授权商户可以从用户的银行账户中扣款,一般用于定期扣款,不用于日常消费。比如水电煤气、有线电视费。协议支付是通过封装银行、第三方支付提供的代扣或者快捷接口来实现。

4. 平台支付

  使用微信、支付宝等第三方支付平台来完成支付。使用时,一般需要用户预先安装支付平台系统(手机上),注册并登录到第三方支付平台,并且已经在该平台上完成绑卡等操作。 由于微信、支付宝已经被大量使用,用户也产生对这些平台的信任,平台支付往往是电商公司的主要支付方式。

5. 外卡支付

  对于由海外支付的需求,还需要提供外卡支付支持。 国内不少支付渠道都能支持外卡支付,如支付宝全球购等。直接对接 Paypal,也是目前用的最多的外卡支付渠道。

6. 话费支付

  对于有包月小额类型的支付,手机话费也是一个不错的选择。目前也有一些平台可以支持话费支付,比如虹软、联动优势等。

7. 虚币支付

  不少公司会有自己的虚拟币,比如京豆、Q币等。这些虚币也可以作为一种支付方式。

8. 账户支付

  也称为余额支付、零钱支付等。 指为用户建立本地账户, 支持充值,之后可以使用这个账户来完成支付。

9. 信用支付

  如京东的白条,蚂蚁花呗等,指使用信用账户进行透支,类似信用卡支付。

10. 代付

  和代扣相反,代付是平台将钱打给用户。

模块功能

  支付产品根据其支付能力,对外提供不同的功能。整体上来说,一般支付产品需要提供如下接口:

1. 签约和解约

  在快捷支付、代扣等产品中,用户在使用前,需要先完成签约。签约可以在渠道侧进行,一般第三方支付采用这种方式,当电商需要接入时,让第三方给授权。 银行和银联的签约一般是在电商侧进行, 电商侧负责收集用户的信息,调用银行和银联的接口进行签约。签约后,后续的支付行为就使用签约号来进行,无需再输入个人信息。 和签约相对应,解约则是取消签约关系。

2. 支付

  支付是少不了的操作。 不同产品中支付行为不一样。快捷支付是在电商服务器上发起,请求渠道进行支付;网银支付则是跳转到银行支付网关上进行; 而账户支付、虚币支付,则是在本地进行的。

3. 撤销和退款

  有些渠道区分撤销和退款,比如银联、农行等,撤销指取消当天在渠道侧未结算的交易; 而退款仅针对已经结算的交易。有些渠道则不作区分。

4. 查询签约状态

  对于需要签约的交易,可以通过这个接口来查询签约状态。

5. 查询订单状态

  通过这个接口来查询支付清单状态以及退款的订单状态。

6. 预授权

  预授权交易用于受理方向持卡人的发卡方确认交易许可。受理方将预估的消费金额作为预授权金额,发送给持卡人的发卡方。

7. 预授权撤销

  对已成功的预授权交易,在结算前使用预授权撤销交易,通知发卡方取消付款承诺。预授权撤销交易必须是对原始预授权交易或追加预授权交易最终承兑金额的全额撤销。

8. 预授权完成交易

  对已批准的预授权交易,用预授权完成做支付结算。

9. 预授权完成撤销

  预授权完成撤销交易必须是对原始预授权完成交易的全额撤销。预授权完成撤销后的预授权仍然有效。

10. 对账

  通过 FTP 或者 HTTP 方式提供对账文件供商户侧对账。

11. 余额查询

  查询商户的交易账户的余额,避免由于余额不足导致交易失败。 注意,不是客户的余额。 当然,不是所有的银行或者第三方支付都提供这个接口。

业务流程

  上述操作,除了对账、查单外,每个操作实现的主流程,一般会包括“参数校验,支付路由,生成订单,风险评估,调用渠道服务,更新订单和发送消息”这 7 步,对于一些比较复杂的服务,还会涉及到异步通知处理的步骤。

1. 执行参数校验

  所有的支付操作,都需要对输入执行参数校验,避免接口受到攻击。验证输入参数中各字段的有效性验证,比如用户ID、商户ID、价格、返回地址等参数。验证账户状态,交易主体、交易对手等账户的状态是处于可交易的状态。验证订单,如果涉及到预单,还需要验证订单号的有效性,订单状态是未支付。为了避免用户缓存某个 URL 地址,还需要校验下单时间和支付时间是否超过预定的间隔。验证签名,签名也是为了防止支付接口被伪造。 一般签名是使用分发给商户的 key 来对输入参数拼接成的字符串做 MD5 Hash 或者 RSA 加密,然后作为一个参数随其他参数一起提交到服务器端,签名验证也可以在网关中统一完成。

2. 根据支付路由寻找合适的支付服务

  根据用户选择的支付方式确定用来完成该操作的合适的支付渠道。用户指定的支付方式不一定是最终的执行支付的渠道。比如用户选择通过工行信用卡来执行支付,但是我们没有实现和工行的对接,而是可以通过第三方支付,比如支付宝、微信支付、易宝支付,或者银联来完成。那如何选择合适的支付渠道,就通过支付路由来实现。支付路由会综合考虑收费、渠道的可用性等因素来选择最优方案。

3. 评估交易风险

  检查本次交易是否有风险。风控接口返回三种结果:阻断交易、增强验证和放行交易。阻断交易,说明该交易是高风险的,需要终止,不执行第 5 个步骤;增强验证,说明该交易有一定的风险,需要确认下是不是用户本人在操作。这可以通过发送短信验证码或者其他可以验证用户身份的方式来做校验,验证通过后,可以继续执行该交易。放行交易,即本次交易是安全的,可以继续往下走。

4. 生成交易订单

  将订单信息持久化到数据库中。当访问压力大的时候,数据库写入会成为一个瓶颈。

5. 调用支付渠道提供的服务

  所有的支付服务都需要第三方通道来完成执行。一般银行渠道的调用比较简单,可以直接返回结果。而一些第三方支付,支付宝,微信支付等,则会通过异步接口来告知支付结果。

6. 更新订单

  对于同步返回的结果,需要在主线程中更新订单的状态,标记是支付成功还是失败。对于异步返回的渠道,需要在异步程序中处理。

7. 发送消息

  通过消息来通知相关系统关于订单的变更。风控,信用 BI 等,都需要依赖这数据做准实时计算。

8. 异步通知

  如上述流程,其中涉及到调用远程接口,其延迟不可控。如果调用方一直阻塞等待,很容易超时。引入异步通知机制,可以让调用方在主线程中尽快返回,通过异步线程来得到支付结果。对于通过异步来获取支付结果的渠道接口,也需要对应的在异步通知中将结果返回给调用方。 异步通知需要调用方提供一个回调地址,一般以 http 或者 https 的方式。这就有技术风险,如果调用失败,还需要重试。而重试不能过于频繁,需要逐步拉大每一次重试的时间间隔。在异步处理程序中,订单根据处理结果变更状态后,也要发消息通知相关系统。

支付系统架构整体设计

  每个公司根据其业务和公司发展的不同阶段,所设计的支付系统也会有所不同。我们先看看互联网公司的一些典型的支付系统架构。

1. 支付宝

  这个整体架构上并没有与众不同之处。在模块划分上,这个图显示的是最顶层的划分,也无法告知更多细节。 但支付宝架构文档有两个搞支付平台设计的人必须仔细揣摩的要点。 一个是账务处理,在记账方面,涉及到内外两个子系统,外部子系统是单边账,满足线上性能需求;内部子系统走复式记账,满足财务需求,如记账、对账和平账。

  另一个是柔性事务处理,利用消息机制来实现跨系统的事务处理,避免数据库锁导致的性能问题。

2. 京东金融

  京东金融是在网银在线的基础上发展起来的。 网银在线的原班技术人员有不少来自易宝公司,在京东收购之后,又引入了支付宝的人才,因而从架构上受这两个公司的影响很大。

3. 去哪儿

  这些架构文档全部来自互联网公开资料, 对于架构是否真实反映实际系统情况,需要大家自行判断。 咱们仅是以这些文档为基础,分析支付系统应有的软件架构。

参考架构

  一般来说,支付系统典型架构会包含如下模块:

支付系统从架构上来说,分为三层;

  • 支撑层: 用来支持核心系统的基础软件包和基础设施, 包括运维监控系统、日志分析系统等。

  • 核心层: 支付系统的核心模块,内部又分为两个部分: 支付核心模块以及支付服务模块。

  • 产品层: 通过核心层提供的服务组合起来,对最终用户、商户、运营管理人员提供的系统。

1. 支撑系统

支撑系统是一个公司提供给支付系统运行的基础设施。 主要包括如下子系统:

  • 运维监控: 支付系统在运行过程中不可避免的会受到各种内部和外部的干扰,光纤被挖断、黑客攻击、数据库被误删、上线系统中有 bug 等等,运维人员必须在第一时间内对这些意外事件作出响应,又不能够一天 24 小时盯着。这就需要一个运维监控系统来协助完成。

  • 日志分析: 日志是支付系统统计分析、运维监控的重要依据。公司需要提供基础设施来支持日志统一收集和分析。

  • 短信平台: 短信在支付系统中有重要作用,如身份验证、安全登录、找回密码、以及报警监控,都需要短信的支持。

  • 安全机制: 安全是支付的生命线。 SSL、证书系统、防刷接口等,都是支付的必要设施。

  • 统计报表: 支付数据的可视化展示,是公司进行决策的基础。

远程连接管理、分布式计算、消息机制、全文检索、文件传输、数据存储、机器学习等,都是构建大型系统所必须的基础软件,这里不再一一详细介绍。

2. 支付核心系统

支付核心系统指用户执行支付的核心流程,包括:

  • 用户从支付应用启动支付流程;

  • 支付应用根据应用和用户选择的支付工具来调用对应的支付产品来执行支付;

  • 支付路由根据支付工具、渠道费率、接口稳定性等因素选择合适的支付渠道来落地支付;

  • 支付渠道调用银行、第三方支付等渠道提供的接口来执行支付操作,最终落地资金转移。

3. 支付服务系统

支持支付核心系统所提供的功能,服务系统又分为基础服务系统、资金系统、风控和信用系统。

基础服务系统提供支撑线上支付系统运行的基础业务功能:

  • 客户信息管理:包括对用户、商户的实名身份、基本信息、协议的管理;

  • 卡券管理: 对优惠券、代金券、折扣券的制作、发放、使用流程的管理;

  • 支付通道管理: 通道接口、配置参数、费用、限额以及 QOS 的管理;

  • 账户和账务系统: 管理账户信息以及交易流水、记账凭证等。这里的账务一般指对接线上系统的账务,采用单边账的记账方式,内部账记录在会计核算系统中。

  • 订单系统: 一般订单系统可以独立于业务系统来实现的,这里的订单,主要指支付订单。

资金系统指围绕财务会计而产生的后台资金核实、调度和管理的系统,包括:

  • 会计核算: 提供会计科目、内部账务、试算平衡、日切、流水登记、核算和归档的功能。

  • 资金管理: 管理公司在各个支付渠道的头寸,在余额不足时进行打款。 对第三方支付公司,还需要对备付金进行管理。

  • 清算分润: 对于有分润需求的业务,还需要提供清分清算、对账处理和计费分润功能。

风控系统是支付系统必备的基础功能,所有的支付行为必须做风险评估并采取对应的措施;信用系统是在风控基础上发展的高级功能,京东的白条,蚂蚁花呗等,都是成功的案例。

4. 支付应用

  支撑系统、核心系统和服务系统,在每个互联网公司的架构上都是大同小异的,都是必不可少的模块。而支付应用是每个公司根据自己的业务来构建的,各不相同。

  总体来说,可以按照使用对象分为针对最终用户的应用、针对商户的应用、针对运营人员的运营管理、BI 和风控后台。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/330737.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Scripting elements ( lt;%!, lt;jsp:declaration, lt;%=, lt;jsp:expression, 错误的解决方法

<% page contentType"text/html;charsetUTF-8" %> <%session.setAttribute("pageContext", "it315"); %> 输出表达式\\${pageContext}的值&#xff1a;<br/> ${pageContext} 【web.xml】错误地在 web.xml中禁用了 jsp脚本元素…

JSP页面

1.jsp概述 JSP&#xff08;全称Java Server Pages&#xff09;&#xff0c;是一种动态网页开发技术。它既可以使用HTML标签来写页面&#xff0c;也可以写Java代码。其本质就是一个Servlet 2.jsp页面的访问过程 当客户端发送请求访问服务端的index.jsp页面服务器内部会把.jsp…

html模板(base标签,meta标签,禁用浏览器缓存)+JSP自定义标签荔枝

【1】html模板 <html> <head><!-- base标签表示uri相对路径的基准路径 --><base href"http://localhost:8080/asite6/chapter6/ex6_11/visitor.html"/><title>html template</title><!-- meta 模拟响应消息头&#xff1a;Co…

5分钟带你理解一致性Hash算法

转载自 5分钟带你理解一致性Hash算法一致性Hash算法背景一致性哈希算法在1997年由麻省理工学院的Karger等人在解决分布式Cache中提出的&#xff0c;设计目标是为了解决因特网中的热点(Hot spot)问题&#xff0c;初衷和CARP十分类似。一致性哈希修正了CARP使用的简单哈希算法带来…

thinking-in-java(10)内部类

【0】开场白1&#xff09;内部类&#xff1a;将一个类的定义放在另一个类的定义内部&#xff0c;这个类就是内部类&#xff1b;2&#xff09;内部类优点&#xff1a;匿名内部类的一个优点就是可以将解决问题的代码隔离&#xff0c;聚拢在一点&#xff1b;【10.1】创建内部类【荔…

金融系统中正确的金额计算及存储方式

转载自 金融系统中正确的金额计算及存储方式经典的精度丢失问题 Java中的类型float、double用来做计算会有精度丢失问题&#xff0c;下面来看下面的示例。 public static void main(String[] args) {test1();test2(); }private static void test1() {double totalAmount 0.09;…

JSTL标签库

1.JSTL介绍 JSTL(Java Server Pages Standarded Tag Library) : JSP标准标签库。主要提供给开发人员一个标准通用的标签库。 开发人员可以利用这些标签取代JSP页面上的Java 代码&#xff0c;从而提高程- 序的可读性&#xff0c;降低程序的维护难度 组成部分如下&#xff1a; …

缓存雪崩,缓存穿透,缓存预热,缓存热备都是什么鬼?

转载自 缓存雪崩&#xff0c;缓存穿透&#xff0c;缓存预热&#xff0c;缓存热备都是什么鬼&#xff1f;缓存雪崩&#xff0c;缓存穿透&#xff0c;缓存预热&#xff0c;缓存热备是在做缓存设计或者缓存应用时经常遇到的概念&#xff0c;也是缓存应用过程中必须熟知及知道 的东…

Multi-catch parameters are not allowed for source level below 1.7 解决方法

转自&#xff1a; https://stackoverflow.com/questions/21778922/eclipse-false-error-with-jdk7 You can solve this by setting up correct JRE environment in Eclipse as below. Go to Project > Properties > Java Build Path Click on Libraries Select JRE Syste…

使用Eclipse构建Maven项目 (step-by-step)

转自&#xff1a; http://blog.csdn.net/qjyong/article/details/9098213 Maven这个个项目管理和构建自动化工具&#xff0c;越来越多的开发人员使用它来管理项目中的jar包。本文仅对Eclipse中如何安装、配置和使用Maven进行了介绍。完全step by step。 如果觉得本文对你有用&a…

字符串substring方法在jkd6,7,8中的差异

转载自 注意&#xff1a;字符串substring方法在jkd6,7,8中的差异 标题中的substring方法指的是字符串的substring(int beginIndex, int endIndex)方法&#xff0c;这个方法在jdk6,7是有差异的。 substring有什么用&#xff1f; substring返回的是字符串索引位置beginIndex开始&…

过滤器五种拦截行为

1.问题&#xff1a;如何使过滤器拦截转发的请求和响应&#xff1f; Filter 过滤器默认拦截的是客户端发送过来的请求&#xff0c;但是在实际开发中&#xff0c;我们还有请求转发&#xff0c;以及由服务器触发调用的全局错误页面。默认情况下过滤器是不参与过滤的&#xff0c;要…

redis的主从数据库复制功能

【0】开场白&#xff1a; redis提供了复制功能&#xff0c; 实现当一台数据库中的数据更新后&#xff0c; 自动将更新的数据同步到其他数据库上&#xff1b; 这样即使一条server 发生故障&#xff0c;其他服务器仍然可以继续提供服务&#xff1b;&#xff08;为数据生成多个副本…

轻松几步搞定SSH连接Git配置

转载自 轻松几步搞定SSH连接Git配置 如果使用ssh的方式管理&#xff0c;需要配置ssh key. 1、打开git bash命令窗口 2、生成ssh key ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" your_emailexample.com为github上你注册的email地址。 如下面完整创建过程…

redis哨兵

【0】redis的主从数据库实现&#xff0c; 参见&#xff1a; redis的主从数据库复制功能 1&#xff09;redis的主从数据库的作用&#xff1a; 在一主多从的redis系统中&#xff0c; 从数据库起到了 数据冗余备份和读写分离的作用&#xff1b; 2&#xff09;redis2.8提供的哨兵…

Git安装及配置5分钟快速教程

转载自 Git安装及配置5分钟快速教程 Git是什么 Git是一款免费、开源的分布式版本控制系统&#xff0c;可以有效、高速的处理从很小到非常大的项目版本管理。 与常用的版本控制工具CVS、Subversion等不同的是它采用了分布式版本库的方式&#xff0c;不必服务器端软件支持&#x…

MySQL基础---增删改查语法

一、DDL-数据定义语言&#xff0c;操作数据库(CRUD)和表(CRUD) 1 创建数据库(指定字符集) create database 数据库名称 character set utf8; 数据库和表修改都是 Alter 查看都是show 删除都是drop2 创建表 create table 表名称(字段名 数据类型,字段名 数据类型,... ...字…

理解水平扩展和垂直扩展

转自&#xff1a; http://yunjiechao-163-com.iteye.com/blog/2126981 当一个开发人员提升计算机系统负荷时&#xff0c;通常会考虑两种方式垂直扩展和水平扩展。选用哪种策略主要依赖于要解决的问题 以及系统资源的限制。在这篇文章中我们将讲述这两种策略并讨论每种策越的…

JavaWeb核心常用API一览

1.核心知识点 2.常用API

Java中的宏变量,宏替换详解。

转载自 Java中的宏变量&#xff0c;宏替换详解。群友在微信群讨论的一个话题&#xff0c;有点意思&#xff0c;特拿出来分享一下。输出true false来看下面这段程序&#xff0c;和群友分享的大致一样。 public static void main(String[] args) {String hw "hello world&q…