热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

基础向:从0开始学习支付系统架构

今天为大家带来 Ping++ 高级技术总监——叶波光老师的《支付系统架构详述》。本篇内容由五个部分组成。1. 架构的定义:架构一定是基于业务功能来展开的,主

今天为大家带来 Ping++ 高级技术总监——叶波光老师的《支付系统架构详述》。本篇内容由五个部分组成。

支付系统架构

1. 架构的定义:架构一定是基于业务功能来展开的,主要是制定技术规范、框架,指导系统落地,好的架构是需要不断演变和进化而来的。

2. 架构需要关注的基础核心点主要是:安全、稳定、可扩展。

3. 构建架构时需要关注的点:目标客户是谁、主要场景有哪些、流程是怎样的、模型、职责有哪些、边界在哪里以及设计。其中比较难以理解的点是困难及模型这两块。

4. 架构与业务需求的关系:架构的产生来自于业务需求,业务需求进一步抽象形成架构,架构指导后续研发,研发最终成果解决业务需求的问题。整体是一个正向循环的关系。

支付架构

支付架构

支付流程分析

支付流程

第一步,用户选择支付渠道,进入商户客户端;商户客户端发送支付要素,到商户服务端;第三步,商户服务端发起支付请求到渠道侧(个别渠道如支付宝是不需要此步骤);第四步渠道返回支付凭证到商户服务端;第五步商户服务端返回支付凭证到商户客户端;第六步,用户调用支付宝控件完成支付。

接下来是重点,第七步一般渠道是采用异步通知方法来通知商户,但是有些企业是在第六步支付完成之后,在C端会同步通知支付成功。如果以此结果来判断支付是否成功,其实是不严谨会出问题的,应当调用渠道的支付接口来进行核查,然后以渠道返回的结果为准。

商户关注点

在日常工作中,许多企业在选择第四方服务商或者渠道的时候,会着重关注「并发」这个点,认为并发量需要达到上万级才可以满足日常需求,但实际上这个量级非常大,其实并没有必要的。

渠道要求

若直接对接渠道可能会遇到的问题:

• 接口文档升级、变更能及时得到通知

• 有些业务没有异步通知

• 同一业务在不同渠道表现不一样

• 各种渠道的各自异常

商户的要求:

• 清晰的 API 、SDK 文档

• 安全

• 所有应用接口统一标准的异步通知

• 保证出口 IP 稳定(安全)  

在系统架构设计时需要注意的一些要点:

1. 提供规范的 API、SDK

2. 安全(通讯安全、数据安全)

3. 稳定

4. 异步通知统一

5. 各渠道的异常

6. 及时了解渠道接口调整

API接口设计规范

支付核心逻辑

支付核心逻辑

这里讲一下,支付成功之后,我们会把订单信息同步到财务系统,在账务系统里我们设计了诸如转账、汇款等功能,在前期设计时会设计好账务的生成规则,例如一笔支付的请求会生成多笔账务,对其字段进行区分,这样方便管理和维护。

支付网关

此处特指API网关,支付网关的功能:

支付网关

限流最好不要放到业务流程中做,会影响用户的体验。

支付网关的内容:

• 唯一的请求入口

• 统一的身份认证、签名、加解密、流控

• API 调用计费

• API 的监控、报警分析

• API 发布管理

• 熔断

• API 聚合

• 协议转换

上述内容除了必要意外,其他不放在业务层做,也是为了更好的用户体验。

支付逻辑

主要是根据请求的参数进行静态检验和业务逻辑校验,避免系统异常

• 适配渠道的参数校验:长度、类型、格式

• 订单的支付状态:是否支付

• 订单的有效期等等

要点:

• 一般商户是不需要做支付路由,大部分都是指定了最终的某个支付渠道。

• 但也有些没有指定了某个最终的渠道,比如银行卡的支付可以选择哪个第三方支付来完成支付,还有微信线上线下的封装,这个时候就涉及到支付路由

• 规则配置

• 费率:单笔费率、总额费率、阶梯费率、

• 营销活动:固定时间单笔优惠、单笔满减、单笔这款、直接补贴

• 额度限制:单笔额度、时间范围内总额度

• 服务指标:失败率、平均响应时间、异常率、TPS

• 特殊配置:特殊要求(比如某渠道能快速结算)

支付网关的目的:

省钱

 

支付风控

要点:梳理清楚业务风险,分析风险原因,制定风险防范规则。

风控结果与系统要求

数据来源:

内部数据:

• 用(商)户信息

• 交易数据

• 账户数据

• 黑名单

• 设备、位置信息

• 日志数据

外部数据:

• 第三方购买

• 央行征信

• 芝麻信用

• …

• 合作数据

风控流程:

事前:

• 入网审核

• 风险评估

• 单笔限额设置

• 单日限额设置

• 频次设置

事中:

• 实时分析

• 多维度判断

• 拒绝

• 拦截 – 进一步验证

– 人工介入

• 延迟操作(例如用户大额提现,需要时间段进行复核)

事后:

• 数据分析

• 巡查、警告

• 降低评级

• 升级防范措施

• 逻辑完善

• 反馈至事前、事中规则中

账务系统

• 账务生成

• 内部对账

• 原始账单下载

• 生成标准账单

• 对账

• 差错处理

账务生成后首先进行内部对账,一直后进行原始账单下载,再生成标准账单,进行对账之后进行差错处理。

 

内部流程如图:

账务系统架构

• 订阅交易信息

• 根据交易事件查询生成账务的规则

  交易事件:支付、退款、转账等等

• 根据规则生成账务明细

• 将账务明细落地

对账流程(实现方式之一)

内部对账:

• 保证账务和交易信息配对

• 一条交易信息有多条账务信息

渠道账单下载:

• 下载

• 账单标准化(对账字段统一)

• 落地标准化账单

对账:

• 账务和标准账单对账

• 双向对账

• 差错处理

账单下载:

账单下载

这里提一句,在做异常处理这部分工作时,有的研发朋友写代码时遇到过类似的问题,例如订单在周末下单,但账单周一才能查询;等到周一时发现查询不到,选择立即重试 + X 分钟后重试就结束了。这样是不行的,因为银行有的是 8 点之后可以查询到,有的是 9 点之后,所以要选择递增时间重试,然后标记人工处理。

对账:

对账部分:

  1. 获取核对文件
  2. 以账务系统为准来逐笔比对(以某个字段为准进行比对)
  3. 数据一致标记成功,数据不一致标记差错

反向操作:

  1. 以渠道账单为准来逐笔比对;
  2. 数据一致标记成功,数据不一致标记差错

差错处理

本地丢失:渠道账单的数据未在账务中查找到。

渠道丢失:账务中的数据未在渠道账单中查找到。

数据差错:账务与渠道某些对账字段未能对上。

此处需要注意的是

针对差错都需要向渠道查询每笔订单信息再次确认。

同时:有些渠道的交易成功时间本来就是有错误的。一般来说是件不会差错很大,一般出现在跨日交易中。例如当天交易无账单,先标记为差错,第二天再改正。

支付基础服务

• Webhook

• 公共推送服务

• 主动查询

• 补偿

• 链路监控

Webhook

webhook

webhook

公共推送服务

公共推送服务

主动查询

异步延时调用

场景:

1、订单创建成功的时候会向服务推送主动查询信息,如果订单支付成功会通知服务取消后续的主动查询,否则在过期时间点向渠道主动查询订单是否支付目的是避免渠道异步通知服务的异常。

2、退款创建成功的时候会向服务推送主动查询信息,该服务会在一定的时间范围内多次查询渠道直到有明确的结果返回(有些渠道没有异步通知)。

3、转账也是类似的逻辑,但某些渠道只提供重试的功能,要注意幂等性。

……

补偿

• 协调保证各模块间数据的一致性

• 一般会跟重试、回滚、兜底来协调使用

• 使用条件

     – 系统异常

     – 业务异常

• 补偿失败报警人工干预

链路监控

 

链路监控

展示信息:应用、URL、调用方、调用时间、调用次数、调用失败次数、本地平均耗时、总平均耗时、调用失败平均耗时 、错误率、依赖度

关注:Cache、SQL、HTTP、TCP

基本信息:

链路监控基本信息

依赖度:

链路监控依赖度

支付安全

数据安全:

– 防窃听    – 防越权

– 防抵赖    – 防破坏

– 防篡改    – 防重放

– 防泄漏

使用范围:网络、系统、应用、业务等

数据安全要点:

• 加密通讯(防窃听)

• 双向签名(防抵赖、防篡改)

• 敏感数据加密存储(防泄漏)

• 密钥管理(通过认证接口获取,只允许加载到内存,不允许直接写入配置文件)

• 权限控制(防越权-非法访问)

• 数据的完整性(放篡改- 数据被恶意修改、非法篡改)

其他

• 内部接口认证

• 避免内部代码未经审核发布到托管平台!!!

• 数据异常分析

• 安全机构合作

注意点

• 使用 HTTPS 加密传输

• 传输的数据使用签名

• 提交的数据是符合规则并且是不存在或者是未支付的

• 支付成功以服务端异步通知为准


推荐阅读
  • 本文通过思维导图的形式,深入解析了大型网站技术架构的核心原理与实际案例。首先,探讨了大型网站架构的演化过程,从单体应用到分布式系统的转变,以及各阶段的关键技术和挑战。接着,详细分析了常见的大型网站架构模式,包括负载均衡、缓存机制、数据库设计等,并结合具体案例进行说明。这些内容不仅有助于理解大型网站的技术实现,还能为实际项目提供宝贵的参考。 ... [详细]
  • 深入探索HTTP协议的学习与实践
    在初次访问某个网站时,由于本地没有缓存,服务器会返回一个200状态码的响应,并在响应头中设置Etag和Last-Modified等缓存控制字段。这些字段用于后续请求时验证资源是否已更新,从而提高页面加载速度和减少带宽消耗。本文将深入探讨HTTP缓存机制及其在实际应用中的优化策略,帮助读者更好地理解和运用HTTP协议。 ... [详细]
  • 掌握PHP编程必备知识与技巧——全面教程在当今的PHP开发中,了解并运用最新的技术和最佳实践至关重要。本教程将详细介绍PHP编程的核心知识与实用技巧。首先,确保你正在使用PHP 5.3或更高版本,最好是最新版本,以充分利用其性能优化和新特性。此外,我们还将探讨代码结构、安全性和性能优化等方面的内容,帮助你成为一名更高效的PHP开发者。 ... [详细]
  • MySQL性能优化与调参指南【数据库管理】
    本文详细探讨了MySQL数据库的性能优化与参数调整技巧,旨在帮助数据库管理员和开发人员提升系统的运行效率。内容涵盖索引优化、查询优化、配置参数调整等方面,结合实际案例进行深入分析,提供实用的操作建议。此外,还介绍了常见的性能监控工具和方法,助力读者全面掌握MySQL性能优化的核心技能。 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 如何利用Java 5 Executor框架高效构建和管理线程池
    Java 5 引入了 Executor 框架,为开发人员提供了一种高效管理和构建线程池的方法。该框架通过将任务提交与任务执行分离,简化了多线程编程的复杂性。利用 Executor 框架,开发人员可以更灵活地控制线程的创建、分配和管理,从而提高服务器端应用的性能和响应能力。此外,该框架还提供了多种线程池实现,如固定线程池、缓存线程池和单线程池,以适应不同的应用场景和需求。 ... [详细]
  • 在探讨Hibernate框架的高级特性时,缓存机制和懒加载策略是提升数据操作效率的关键要素。缓存策略能够显著减少数据库访问次数,从而提高应用性能,特别是在处理频繁访问的数据时。Hibernate提供了多层次的缓存支持,包括一级缓存和二级缓存,以满足不同场景下的需求。懒加载策略则通过按需加载关联对象,进一步优化了资源利用和响应时间。本文将深入分析这些机制的实现原理及其最佳实践。 ... [详细]
  • 探究大数据环境下Kafka实现高性能的几个关键因素
    在大数据环境下,Kafka能够实现高性能的关键因素在于其独特的设计和优化策略。尽管Kafka的消息存储在磁盘上,这通常被认为会降低性能,但通过高效的文件管理和批量处理机制,Kafka能够在高吞吐量和低延迟之间取得平衡。此外,Kafka还利用了零拷贝技术、压缩算法和异步IO等手段,进一步提升了系统的整体性能。这些技术不仅保证了数据的可靠性和持久性,还使得Kafka成为处理大规模实时数据流的理想选择。 ... [详细]
  • 在GitHub上克隆vue-element-admin项目时遇到依赖安装错误
    在 GitHub 上克隆 vue-element-admin 项目后,使用 `npm install` 安装依赖时遇到了未知的 Git 错误。具体错误信息为 `npm ERR! code 128`,提示命令执行失败。这可能是由于网络问题、Git 配置不正确或某些依赖包的仓库地址无效导致的。建议检查网络连接、更新 Git 版本并确保所有依赖项的 URL 正确无误。 ... [详细]
  • CentOS 7环境下Jenkins的安装与前后端应用部署详解
    CentOS 7环境下Jenkins的安装与前后端应用部署详解 ... [详细]
  • 在过去,我曾使用过自建MySQL服务器中的MyISAM和InnoDB存储引擎(也曾尝试过Memory引擎)。今年初,我开始转向阿里云的关系型数据库服务,并深入研究了其高效的压缩存储引擎TokuDB。TokuDB在数据压缩和处理大规模数据集方面表现出色,显著提升了存储效率和查询性能。通过实际应用,我发现TokuDB不仅能够有效减少存储成本,还能显著提高数据处理速度,特别适用于高并发和大数据量的场景。 ... [详细]
  • 基于域名、端口和IP的虚拟主机构建方案
    本文探讨了在单台物理服务器上构建多个Web站点的虚拟主机方案,详细介绍了三种主要的虚拟主机类型:基于域名、基于IP地址和基于端口的虚拟主机。每种类型的实现方式及其优缺点均进行了深入分析,为实际应用提供了全面的技术指导。 ... [详细]
  • 在Android平台上利用FFmpeg的Swscale组件实现YUV与RGB格式互转
    本文探讨了在Android平台上利用FFmpeg的Swscale组件实现YUV与RGB格式互转的技术细节。通过详细分析Swscale的工作原理和实际应用,展示了如何在Android环境中高效地进行图像格式转换。此外,还介绍了FFmpeg的全平台编译过程,包括x264和fdk-aac的集成,并在Ubuntu系统中配置Nginx和Nginx-RTMP-Module以支持直播推流服务。这些技术的结合为音视频处理提供了强大的支持。 ... [详细]
  • 构建和优化自定义Python模块并不复杂,因为每个Python程序本质上都是一个模块。通过合理的设计和优化,可以提高模块的可重用性和可维护性。本文将详细介绍如何创建自定义模块,并提供实用的优化技巧,帮助开发者提升代码质量和开发效率。 ... [详细]
  • 利用 React Hooks 实现随机颜色生成的详细指南 ... [详细]
author-avatar
会唱歌的高跟鞋
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有