订单接入支付宝流程实战与优化

news2024/11/16 15:29:22

概述

  • 了解支付宝支付能力接入方式。
  • 电商项目如何对支付流程进行设计及优化。
  • 基于 RocketMQ 事务消息实现的订单确认机制,来完成订单超时回退功能。

支付宝接入流程简介

国内目前有支付牌照的公司总共只有两百来家,比如支付宝、云闪付、和包支付、翼支付等。

支付宝支付场景

支付宝提供了两个重要的服务开放平台,对外开放自己的核心支付能力。第三方企业都可以通过这两个服务开放平台接入支付宝,借助支付宝开发自己的支付场景。
面向商家的支付宝商家中心:https://b.alipay.com/page/portal/home;
面向开发者的支付宝开放平台:https://open.alipay.com;
我们这次更关心的是在技术层面如何快速接入支付宝,所以更关心的是后面的支付宝开放平台,后面简称支付宝平台。
支持的支付类型如下:
image.png

沙箱环境介绍

沙箱环境提供了一系列开发调试所需要的帐号以应用信息,这些测试帐号会定期改变。这里最重要的是 PID 和 APPID 两个参数。沙箱环境直接给出了对应的尝试数据,正式环境都需要向支付宝进行申请才能获取。
参数说明:
其中,PID 表示商家账户 ID,在正式环境中,需要由商户登录支付宝商家中心后获取。
而 APPID 表示在支付宝上注册的第三方应用的 ID。需要由开发者创建应用获取。
开发者登录支付宝开放平台后,进入控制台,需要在控制台创建对应的应用。
创建应用后还不算完,需要商户绑定应用,这样的 PID 和 APPID 才可以一起使用。商户登录商家平台后,在账户中心,选择 APPID 绑定,设置绑定开发者创建的应用。
沙箱环境还提供了一个沙箱版本的支付宝 APP,用于模拟正式支付宝 APP 进行相应测试。

支付宝的正式环境和沙箱环境的接口并不完全一样。真实应用在沙箱环境调试成功后,并不能保证在正式环境就一定没有问题,还需要迁移到正式环境重新测试验收。

优化订单支付流程

支付宝当面付预下单流程

流程说明:

  1. 用户在电商上选好商品,从购物车开始选择下单。
  2. 电商后台记录用户的订单数据后,会往支付宝进行一次预下单,可以理解为申请一个支付订单。
  3. 如果预下单没有问题的话,支付宝会给电商后台同步返回一个二维码图片。
  4. 电商后台将二维码图片保存到本地服务器上,并与自己的业务订单建立绑定关系。
  5. 电商系统将二维码图片展现给用户,用户使用自己的支付宝扫描二维码,完成登录、支付的一系列操作。
  6. 支付完成后,支付宝会给电商后台发送一个异步通知,告知订单支付完成。电商后台接收到这个通知,就可以完成订单后续的业务操作。

主流程是没有什么问题,基本上就照搬刚才的流程就可以了。但是,就按照这个流程实现订单管理,你会发现有个小问题,对于订单取消操作还没有进行设计。用户下完订单后是需要及时进行支付的,电商项目在用户下单时就需要锁定商品库存,如果用户长期不支付,锁定的商品就无法正常销售。

所以,通常对于订单都会设定一个支付时间,比如五分钟内需要完成支付。如果没有支付,就需要取消订单,释放库存。那应该如何设计订单的超时判断流程?

使用延迟任务实现支付超时判断

做个定时任务,五分钟后去支付宝查一下订单是否完成了支付。

流程说明:

  1. 下单时增加一个定时任务,在五分钟后对订单进行超时判断。
  2. 超时判断时,可以先去支付宝上查询订单支付状态。

如果已支付,则判断订单是否正常结束,这是因为在用户完成扫码支付后,支付宝正常会往电商后台发送支付成功的通知。但是这个通知是没有事务保证的,所以是非常有可能失败的,这时就需要在订单超时判断时对状态进行对齐。
如果未支付,则需要释放库存,取消本地订单,然后通知支付宝取消支付订单。

这种设计方式很自然,但是会有一个小问题,就是对订单状态的判断会不及时。订单支付状态只有在五分钟后的超时判断时才能最终确定,这就不太及时。这样对于一些并发量比较高的场景就不太合适,比如在 12306 抢火车票,是不是你一支付完成,12306 马上就知道了?就给你发火车票了?或者你回顾一下日常使用支付宝进行支付的场景,是不是你一支付,商家马上就知道了?更别说对于秒杀等超高并发的场景了。
那要如何优化呢?通常企业中的做法并不会等到订单超时时才去查询订单状态,而是在后台会多次频繁查询支付宝支付状态,这样可以更及时的获得支付结果。例如五分钟超时时间,至少需要半分钟或者一分钟去查一次支付宝订单状态,如果支付成功了,就及时结束后续等待处理过程。如果没有完成支付,就再开启下一个定时任务,等待下次检查。
比如通过定时扫描定时任务表,会存在几个问题,设置多久扫描一次比较合适?表记录变多时如何保证查询性能?
这样一分析,你会不会觉得这个定时任务光是流程控制就有点麻烦了?再跟业务逻辑绑定在一起,这个任务的逻辑会变得非常复杂。有没有现成的框架可以帮我们来优化这个复杂的定时任务逻辑,让我们只要专心关注业务逻辑呢?有,RocketMQ 的事务消息就是一个比较好的工具。

RocketMQ 事务消息改造支付超时

RocketMQ 事务消息机制的核心是对消息状态进行不断的确认。循环确认的过程就正好可以用来改造,解决上面说的频繁任务调度的问题。这样就可以专注于开发业务逻辑,而不用关注频繁复杂的任务调度逻辑。
image.png
在向支付宝进行预下单时,发送一条事务消息。只不过这里发送的消息,是用来通知下游服务进行本地订单取消的。

核心流程:

  1. 支付宝预下单成功后发送事务消息。
  2. 发送消息后,就会先执行本地事务。下单成功返回 RocetMQ 服务端 UNKOWN 状态,这样 RocketMQ 会在之后进行状态回查。
  3. 事务状态回查。回查逻辑会记录回查次数,超过最大次数就直接取消订单。

注意,这里最大回查次数需要根据业务要求进行定制。RocketMQ 的事务消息回查间隔可以通过参数 transactionCheckInterval 定制。
如果没有超过最大次数,并且本地支付状态未确定,就可以去支付宝中查询订单支付状态。
如果已经支付完成,则返回 ROLLBACK 状态,事务消息取消,后续就不会再进行本地订单取消了。
如果未支付,则记录回查次数后,返回 UNKNOWN 状态,等待下次回查。

  1. 如果事务消息最终发送出去,也就是订单已经超时,就会将消息发送到 RocketMQ 的指定 Topic 下。下游的消费者就会完成取消本地订单,释放库存等操作。

在这个流程中,表面上利用 RocketMQ 的事务消息机制将频繁的定时任务拆解成事务回查的过程,实际上是通过不断的事务回查来确保分布式事务的最终一致性。
这里要加一个设计点,在下单时要加一个分布式锁(可以用 redis 实现),后续取消订单时需要能拿到锁(redis 中的锁过期了)才能取消,防止并发。

流程扩展:

  • 通过聚合支付进行分布式事务控制

当前电商项目,只完成了与支付宝的对接,而在对接过程中,是直接使用支付宝的二维码通知用户进行当面支付。而用户使用支付宝扫码支付的过程,电商系统都是完全不知道的,也就没有办法对用户的支付动作进行控制。比如如果电商系统本地的订单已经超时,就要阻止用户进行扫码支付。当前项目的处理方式是在支付宝的回调接口判断订单状态,如果订单已关闭,则发起订单回退。这样显然效率是不高的。
在很多电商项目中,会采用聚合支付的方式,统一对接多个第三方支付方。用户的支付动作就不是直接与支付宝这样的第三方支付公司交互完成,而是要经过电商后台转发请求完成。这时,就可以通过添加一些分布式锁机制,保证整个支付业务是串行执行的,以防止在电商进行订单超时回退后,用户再次扫码支付。

  • 正向通知与反向通知

当前电商项目中,是通过事务消息通知下游服务订单取消,这其实就是一种反向通知的方式。但是其实最直观的方式还是使用正向通知,即通过事务消息通知下游服务进行订单支付确认,这样这个下单的消息就容易扩展更多的下游消费者。结合电商系统,订单下单确认是用户完成支付后,支付宝发起的通知来确认的。这时,如果订单确认的下游服务实现了幂等控制,就完全可以将事务消息机制改为正向通知。即在事务消息回查过程中,确认用户已经完成了支付,就发送消息通知下游服务订单支付成功。这样也可以防止支付宝通知丢失造成的订单状态缺失。
而用户订单超时判断,则可以在事务消息状态回查过程中,通过记录回查次数判断。如果已经超时,则返回 Rollback。同时启动另外一个消息生产者,往下游服务发送一个订单取消的消息,这样也是可以的。

  • 兜底补偿机制

例如在当前电商项目中,对于订单超时后的回退处理,不光通过 RocketMQ 的事务消息进行了通知,另外也部署了一个定时任务,批量回退超时的订单。在设计金融相关业务时,这种兜底策略会显得尤为重要。

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

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

相关文章

el-table的复选框占满全格

el-table的复选框格子很小每次点击都点不到&#xff0c;又不想设置行点击&#xff0c;因为每次复制内容都会选中&#xff0c;实现效果是点击el-table的复选框单元格就可以选中 <template><div style"width: 60vw; margin: 10px;"><el-table :data&quo…

金蝶云星空审核使用了基础资料的属性字段报错:表达式计算出错

文章目录 金蝶云星空审核使用了基础资料的属性字段报错&#xff1a;表达式计算出错报错内容解决方案 金蝶云星空审核使用了基础资料的属性字段报错&#xff1a;表达式计算出错 报错内容 表达式计算出错: F_XXXX_MaterialId.FIsSNManage true and F_XXXX_ProductLibraryId 0 …

Cython笔记:基本使用方法

1 Cython 介绍 Cython 是一种编程语言&#xff0c;用于编写 C 扩展的 Python 模块。它结合了 Python 的易用性和 C 的执行效率&#xff0c;旨在提高特定类型的任务的性能&#xff0c;特别是涉及大量数值计算的任务。 1.2 几个特征 1.2.1 Python 语法的基础 Cython 的大部分语…

市场全局复盘 20231208

一、板块成交额排名&#xff1a; 资金流入前三个板块K 线&#xff1a; 行业成交额排名&#xff1a; 个股资金流入排名&#xff1a; select 成交额排名 ,近日指标提示 ,短线主题 ,涨停分析,CODE,名称,DDE大单净量,现价,量比,连板天,周涨停,月涨停,年涨停天,连涨天,…

【Nacos】在Windows环境下搭建Nacos服务与Python开发示例

在Windows环境下搭建Nacos服务与Python开发示例 Nacos是一个开源的动态服务发现、配置和服务管理平台。本文将介绍在Windows环境下搭建Nacos服务&#xff0c;并提供一个简单的Python示例&#xff0c;演示如何通过Nacos实现服务注册与发现。 官方提示&#xff1a;Nacos定义为一…

软件开发流程分析

软件开发流程分析 相关概念1 原型设计2 产品设计3 交互设计4 代码实现详细步骤 相关概念 前端&#xff1a;自研API&#xff0c;调用第三放API 后端&#xff1a;自研API&#xff0c;第三方API 数据库&#xff1a;Mysql&#xff0c;数据采集&#xff0c;数据迁移 服务器&#xf…

优势怪代码

#include <stdio.h> int main() { int t; scanf("%d", &t); // 读取测试用例的数量 while (t--) { // 对每个测试用例进行处理 int n, max1 0, max2 0, k 0; scanf("%d", &n); // 读取数组的大小 in…

瑞萨RZ/G2L核心板Linux Log目录文件详解

为了排除系统问题&#xff0c;监控系统健康状况以及了解系统与应用程序的交互方式&#xff0c;我们需要了解各log文件的作用&#xff0c;以G2L中yocto文件系统为例&#xff0c;在系统/var/log/目录下会存放记录系统中各个部分的log文件作用如下&#xff1a; 1. 文件详情 下图…

decomposition-based multi-objective algorithm4SPDPTW

关键词 文章概述 研究背景 多目标选择性接送和配送问题&#xff08;PDPs&#xff09;&#xff1a;研究涉及多目标选择性接送和配送问题&#xff0c;这些问题传统上从单一目标角度进行探讨&#xff0c;以寻找最具盈利性的请求集合&#xff0c;同时遵守一系列限制条件。 经济和…

新工科:数据科学与大数据技术实验中心解决方案,赋能高校新工科数智人才培养

随着数字经济蓬勃发展&#xff0c;数字化产业和产业数字化成为就业增长新动能。据人瑞人才与德勤调研显示&#xff0c;未来3年&#xff0c;数字产业化企业最需要运营人员和开发人员&#xff08;包括大数据开发工程师、数据建模开发工程师等&#xff09;&#xff0c;其次是数据分…

一、微前端目标、前端架构的前生今世、微前端架构优势和劣势、软件设计原则与分层

1、目标 2、前端架构的前世今生 ① 初始&#xff1a;无架构&#xff0c;前端代码内嵌到后端应用中 ② 后端 MVC 架构&#xff1a;将视图层、数据层、控制层做分离 缺点&#xff1a;重度依赖开发环境&#xff0c;代码混淆严重&#xff08;在调试时&#xff0c;需要启动后端所有…

【VRTK】【VR开发】【Unity】14-移动倍增

课程配套学习资源下载 https://download.csdn.net/download/weixin_41697242/88485426?spm=1001.2014.3001.5503 【背景】 本篇介绍最后一个VRTK提供的Locomotion特性,移动倍增器。提供这个特性的原因,是为了让实际有限的物理空间(比如说我的小房间)能够在游戏中提供大范…

[c++]—vector类___基础版(带你了解vector熟练掌握运用)

&#x1f469;&#x1f3fb;‍&#x1f4bb;作者:chlorine 目录 &#x1f393;标准库类型vector &#x1f393;定义和初始化vector的对象 &#x1f4bb;列表初始化vector对象 &#x1f4bb;创建指定数量的元素 &#x1f576;️值初始化 ❗列表初始化还是值初始化&#xf…

软件设计师——软件工程(一)

&#x1f4d1;前言 本文主要是【软件工程】——软件设计师——软件工程的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304…

JavaFX的对话框

JavaFX的对话框主要分为提示对话框&#xff08;Alert&#xff09;和文件对话框两类&#xff0c;其中提示对话框又分作消息对话框、警告对话框、错误对话框、确认对话框四种。这四种对话框都使用Alert控件表达&#xff0c;并通过对话框类型加以区分。 AlertType.NONE&#xff1…

件夹和文件比较软件VisualDiffer mac功能介绍

VisualDiffer mac是一款运行在MacOS上的文件夹和文件快速比较工具。VisualDiffer可以对不同文件夹中文件或文档做出比较或者比较两个文件的路径。还可以通过UNIS diff命令快速、标准和可靠的比较出各类不同的文件夹和文件结果&#xff0c;使用不同的颜色直观地显示。 VisualDif…

基于单片机智能浇花控制系统设计

**单片机设计介绍&#xff0c;基于单片机智能浇花控制系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的智能浇花控制系统可以通过水泵、传感器和单片机等硬件组件实现自动浇水&#xff0c;减轻人工浇花的工作…

酷滴科技出席浦发银行第七届国际金融科技创新大赛

12月7日&#xff0c;浦发银行全球金融科技创新大赛在上海展开决赛。本届大会以“科技金融&#xff0c;激发创新力量”为主题&#xff0c;聚焦金融行业数字化转型过程中的痛点与难点&#xff0c;旨在探讨新时代下金融科技的新角色、新机遇以及新挑战。酷滴科技CEO张沈分享了酷滴…

网络基础(七):传输层协议介绍

目录 一、TCP协议&#xff08;传输控制协议&#xff09; 1、TCP协议介绍 2、TCP协议特性 3、TCP报文格式 4、TCP的三次握手 4.1TCP三次握手的概念 4.2TCP三次握手流程图 4.3 TCP三次握手阐释说明 5、TCP的四次挥手 5.1TCP四次挥手的概念 5.2TCP四次挥手的流程图 5.…

MySQL数据库——锁-表级锁(表锁、元数据锁、意向锁)

目录 介绍 表锁 语法 特点 元数据锁 介绍 演示 意向锁 介绍 分类 演示 介绍 表级锁&#xff0c;每次操作锁住整张表。锁定粒度大&#xff0c;发生锁冲突的概率最高&#xff0c;并发度最低。应用在MyISAM、InnoDB、BDB等存储引擎中。 对于表级锁&#xff0c;主要…