小程序对接停车场支付流程思考

2023-11-04

前言

        最近一直在做公司的小程序对接停车场的需求。结果遇到了并发问题,出现一笔订单,用户支付两次的情况。现在对整个支付流程进行梳理。下面讨论的A用户和B用户都是对于同一订单处理的场景,对于不同订单,则没有并发问题。

一、查询停车费接口

业务流程

在停车缴费页面,可以手输车牌,因此可以多个用户查询同一个车牌的停车费。此时需要保证系统停车费只有一笔。

  1. 根据车牌调第三方停车场费用查询接口;
  2. 查询停车费账单表中同一车牌,同一入场时间,状态为查询完成,支付中,微信支付中的数据;
  3. 如果存在,则更新表数据中的费用;
  4. 如果不存在,则插入表数据。
流程图

在这里插入图片描述

思考

        在上述查询账单表数据过程中,需要以车牌做key值,加上分布式锁。因为可能存在并发,同时有多个用户查询表数据,当表中没数据时,则会插入多条表数据。当A用户对A数据支付,B用户对B数据支付,则会支付两次。

二、余额支付接口

业务流程

在用户缴费时,当只选择使用账户余额付款时,则可以直接调标准的余额支付接口去付款。

  1. 调用标准余额支付接口进行余额支付;
  2. 当余额支付成功,更新停车费账单表数据为支付完成;
  3. 1至2操作成功,异步通知停车场缴费完成;
  4. 1至2操作失败,则进行事务回滚;
  5. 3操作失败则间隔1s进行重试,共重试3次,直至成功。
流程图

在这里插入图片描述

思考

        余额支付接口,需要以停车费订单号为key值,加上分布式锁。如果存在多个用户同时进行费用支付,则会因为锁进行排队,无法一起支付。当其中一个用户支付完成后,更新订单状态,则排队的其他用户无法进行支付。

三、券与积分支付接口

业务流程

当用户缴费时,有选择券或积分,则可以使用券或积分去抵扣停车费用。

  1. 抵扣券或积分,校验券状态以及积分是否充足;
  2. 如果券和积分校验通过,进行券核销和积分扣除;
  3. 如果还需要支付,返回状态为支付中;
  4. 如果不需要继续支付,返回状态为支付完成,异步通知停车场缴费完成。
流程图

在这里插入图片描述

思考

        券与积分支付接口需要以停车费订单号为key值,加上分布式锁。如果存在多个用户同时进行费用支付,则会因为锁进行排队,无法一起支付。当其中一个用户支付完成后,更新订单状态,则排队的其他用户无法进行券与积分支付。

四、微信支付流程

业务流程

当用户缴费时,仅选择微信支付时,则需要用标准的微信预下单接口在微信服务器下单。等前端调用wx.requestpayment组件支付完成,后端收到微信回调结果,则支付完成。

  1. 前端调用后台微信预下单接口,设置订单过期时间为60s;
  2. 下单成功,更新订单状态为微信支付中,等待用户在微信小程序支付;
  3. 创建70s后执行延迟任务,当用户过期未支付,更新订单状态为已过期;
  4. 前端调用wx.requestpayment进行支付,微信返回支付结果;
  5. 如果用户叉掉密码输入框,撤销支付,前端通知后台订单已取消,更新订单状态为已取消;
  6. 微信如果返回前端支付失败,前端通知后台订单支付失败,更新订单状态为微信支付失败;
  7. 如果支付成功,微信异步通知后台服务器支付成功,更新订单状态为支付完成;
流程图

在这里插入图片描述

思考

微信支付流程包含多个接口

  1. 后台微信预下单接口,进行微信预下单,绑定微信订单号,更新订单状态为微信支付中;
  2. 后台延迟任务,当订单过期未支付,更新订单状态为已过期;
  3. 前端wx.requestpayment组件进行微信支付,中途退出或支付失败调4;
  4. 后端更新订单状态为已取消或支付失败接口;
  5. 微信回调通知接口,接受微信支付成功通知,更新订单状态为支付完成。

        其中微信预下单接口、后台延迟任务、后端更新订单接口,都需要以订单号为key值,加上分布式锁。
        当多个用户同时预下单时,通过分布式锁,使其排队。当其中一个用户下单成功,更新订单状态为微信支付中,则排队的其他用户无法下单。
        当多个用户同时调用更新订单状态接口,通过分布式锁使其排队。当其中一个用户执行成功,排队执行的其他用户查询订单状态是已取消或支付失败,则不会执行。
        后台延迟任务同时触发,道理同上。
        当A用户预下单,B用户同时更新订单状态。由于都持有以订单号为key的分布式锁,会形成排队。此时订单状态应该为微信支付中,因为B用户调更新订单状态接口,说明B用户取消微信支付或微信支付失败。
当在微信预下单后才会可以取消支付或微信支付失败。(1)当A用户先抢到锁,预下单失败。B用户后抢到锁,更新订单为已取消或支付失败。(2)当B用户先抢到锁,更新订单为已取消或支付失败。A用户后抢到锁,预下单失败,提示用户重新查询费用。
        A用户预下单,B用户延迟任务使订单过期。由于都持有以订单号为key的分布式锁,会形成排队。因为有延迟任务,所以订单在此之前有进行微信预下单,订单状态为微信支付中或已取消或支付失败或支付成功。上述状态,A用户下单一定失败。B用户触发的延迟任务更新订单为已过期或不处理(状态为支付成功、已取消、支付失败)。

五、券与积分以及余额组合支付流程

业务流程

当用户支付时,可以选择优惠券核销和积分抵扣,以及余额付款。包含如下几个接口:

  1. 券与积分支付接口(一个接口处理优惠券核销与积分抵扣,更新订单状态为支付中)
  2. 余额付款接口
  3. 券与积分回滚接口(余额付款失败,回滚优惠券和积分,回滚订单状态为查询完成)

前端判断用户是否有使用券和积分,在用户点击余额付款时,调券与积分支付接口,后台判断如果足够抵扣全部费用,则更新订单状态为支付完成,如果不足够抵扣全部费用,则更新订单状态为支付中,前端调余额付款接口,进行余额付款。

流程图

在这里插入图片描述

思考

        券与积分支付接口需要核销优惠券与积分,更新订单状态为支付中,需要增加事务,当其中一步失败就回滚。同时接口需要加上以订单号为key的分布式锁,当同时两个用户核销券或积分时,会排队处理。当其中一个用户核销券或积分成功后,订单状态为支付中。其他用户则不允许核销券或积分,提示用户订单支付中。
        余额付款接口进行余额付款,需要添加事务以及以订单号为key值的分布式锁。当同时两个用户进行余额付款时,则会排队处理。当第一个用户支付成功,则更新订单状态为支付完成,其他用户无法进行余额支付。当第一个用户支付失败,还没调回滚券与积分及订单状态接口时,第二个用户不是同一用户支付,则余额支付失败。
        当余额付款失败,调回滚券与积分以及订单状态接口。需要添加事务以及订单号为key值的分布式锁。防重放攻击。当回滚券积分后,更新订单状态为查询完成,则无法重复回滚券与积分。
        当A用户进行券与积分支付,B用户进行余额支付。由于两个接口都是以订单号为key作为分布式锁。(1)A用户先抢到锁,则扣券与积分,并更新订单状态为支付中。B用户后持有锁,判断不是同一用户支付,则不会进行余额付款。(2)B用户先抢到锁,则扣除余额,并更新订单状态为支付完成。A用户无法进行券与积分支付。
        当A用户进行券与积分支付,B用户调用券与积分回滚接口。由于两个接口都是以订单号为key作为分布式锁。(1)A用户先抢到锁,则判断订单为支付中,无法进行券与积分支付。因为B用户是余额付款失败,才会调用券与积分回滚接口。也就是B用户在此之前成功进行券与积分支付,订单被更新成了支付中。B用户后持有锁,可正常进行券与积分回滚,并更新订单状态为查询完成。(2)B用户先持有锁,可正常回滚券与积分,并更新订单状态为查询完成,A用户后持有锁,可正常进行余额付款,并更新订单状态为支付完成。
        当A用户进行余额支付,B用户调用券与积分回滚接口。由于两个接口都是以订单号为key。(1)A用户先抢到锁,则判断支付不是同一用户或费用不等于券金额+积分抵现金额+支付余额,则不能进行余额支付,提示用户重新查询费用。B用户后持有锁,正常回滚券与积分以及订单状态。(2)B用户先抢到锁,可正常回滚券与积分以及订单状态。A用户后持有锁,如果金额正确,可正常进行余额支付。
        当三个接口同时发生,则是由上述所说的情况可处理。

六、券与积分以及微信组合支付流程

业务流程

当用户支付时,可以选择优惠券核销和积分抵扣,以及微信支付。包含如下几个接口:

  1. 券与积分支付接口(一个接口处理优惠券核销与积分抵扣,更新订单状态为支付中)
  2. 微信预下单接口(60s订单过期,下单失败执行4,下单成功,执行5)
  3. 前端调wx.requestpayment组件进行微信支付(撤销支付,支付失败执行4)
  4. 券与积分回滚接口(微信下单失败时,回滚优惠券和积分,更新订单为支付失败。撤销微信支付时,回滚优惠券和积分,更新订单状态为已取消。微信支付失败,回滚优惠券和积分,更新订单状态为支付失败)
  5. 回滚券与积分延迟任务(预下单70s后,用户一直不支付,订单过期,未收到微信回调通知,查询微信订单状态,如果已支付,更新订单为支付完成,如果已过期,回滚券与积分,更新订单状态为已过期)
  6. 微信回调通知接口(微信支付成功,回调后端服务通知支付成功,更新订单状态为支付完成)
方案一流程图

在这里插入图片描述

方案二流程图在这里插入图片描述
思考

        券与积分支付接口,微信预下单接口,券与积分回滚接口,延迟任务,微信回调通知接口都以订单号为key,添加分布式锁。
        上述接口,当同一种接口发生并发会因为分布式锁进行排队。排队后执行的接口会因为订单状态修改而执行失败。
        当两种接口发生并发的场景,【三、券与积分支付接口】和【四、微信支付流程】中已经分析大部分了。下面只阐述券与积分支付接口和微信支付流程中的接口的并发场景。
        当A用户进行券与积分支付,B用户进行微信预下单。由于两个接口都是以订单号为key作为分布式锁。(1)A用户先抢到锁,当订单是查询完成状态时,A用户核销券,抵扣积分成功,更新订单状态为支付中。B用户后持有锁,进行微信预下单,不是同一用户支付,无法进行微信下单。当订单是支付中时,A用户先抢到锁,无法核销券与积分,B用户后持有锁,金额正确,则微信下单成功。(2)B用户先抢到锁,当订单是查询完成状态时,下单成功,更新订单状态为微信支付中。A用户后持有锁,因为状态为微信支付中,无法进行券与积分支付。当订单状态是支付中,B用户先抢到锁,如果金额正确,则正常微信预下单,更新订单状态为微信支付中。如果金额不正确,无法微信预下单。A用户后持有锁,由于状态是支付中或微信支付中状态,无法进行券和积分支付。
        当A用户进行券与积分支付,B用户进行wx.requestpayment微信支付时。没有分布式锁,但可以根据状态(乐观锁)来锁住。B用户进行微信组件的支付,说明订单状态已经是微信支付中,因此A用户无法核销券和积分。B用户正常进行微信支付。
        当A用户进行券和积分支付,B用户微信回调通知。在微信回调通知前,订单状态已经是微信支付中,因此A用户无法进行券和积分支付。
        当A用户进行券和积分支付时,B用户执行延迟任务。此时订单为支付中以后的状态,无法进行券和积分支付,券和积分支付只能是查询完成的状态才能正常执行。
        当A用户进行接口方式的券和积分回滚,B用户进行微信预下单。因为都是以订单为key作为分布式锁,两个排队执行。由于其中一个接口是券和积分回滚,因此订单状态是支付中或微信支付中。(1)当A用户先抢到锁,券和积分回滚成功,订单状态更新为支付失败,B用户后持有锁,微信预下单失败,提示用户重新查询费用。(2)当B用户抢到锁,如果是支付中,判断不是同一用户支付,则B用户微信预下单失败,A用户正常回滚券和积分。如果是微信支付中,B用户无法预下单,A用户正常回滚券和积分。
        当A用户进行接口方式的券和积分回滚,B用户进行wx.requestpayment微信支付时。此场景不存在,因为这两个情况发生在A用户券和积分支付成功,B用户微信预下单成功的情况下。在上面已经分析不会同时成功。除非发生在模拟桩场景,总费用10元,券支付1元,积分抵现1元,通过模拟桩模拟微信预下单8元。此种情况要杜绝的话,需要在券和积分支付后,存用户id到表中,当其他用户进行支付时,判断是否是当前用户操作。
        当A用户进行接口方式的券和积分回滚,B用户进行微信回调通知。此场景不存在,因为已经控制了两个用户不会同时进入支付中的状态。
        当A用户进行延迟任务的券和积分回滚,B用户进行微信预下单。因为有延迟任务,此时订单为支付中、微信支付中、支付失败、已取消,支付成功的状态。当为支付中时,判断金额不正确,B用户微信预下单失败。当为微信支付中、支付失败、已取消、支付成功场景时,B用户微信预下单失败。
        当A用户进行延迟任务的券和积分回滚,B用户进行wx.requestpayment微信支付时。
        当A用户进行延迟任务的券和积分回滚,B用户进行微信回调通知接口。一般不会出现,如果出现,则在延迟任务中,判断订单为微信支付中时,调用微信服务器查询订单状态是已过期还是支付成功,做对应处理。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

小程序对接停车场支付流程思考 的相关文章

  • Java中ArrayList的交集和并集

    有什么方法可以做到这一点吗 我正在寻找 但没有找到 另一个问题 我需要这些方法 以便我可以过滤文件 有些是AND过滤器 有些是OR过滤器 就像集合论中的那样 所以我需要根据所有文件和保存这些文件的联合 相交 ArrayList 进行过滤 我
  • 为什么 JTables 使 TableModel 在呈现时不可序列化?

    所以最近我正在开发一个工具 供我们配置某些应用程序 它不需要是什么真正令人敬畏的东西 只是一个具有一些 SQL 脚本生成功能并创建几个 XML 文件的基本工具 在此期间 我使用自己的 AbstractTableModel 实现创建了一系列
  • .properties 中的通配符

    是否存在任何方法 我可以将通配符添加到属性文件中 并且具有所有含义 例如a b c d lalalala 或为所有以结尾的内容设置一个正则表达式a b c anything 普通的 Java 属性文件无法处理这个问题 不 请记住 它实际上是
  • 动态选择端口号?

    在 Java 中 我需要获取端口号以在同一程序的多个实例之间进行通信 现在 我可以简单地选择一些固定的数字并使用它 但我想知道是否有一种方法可以动态选择端口号 这样我就不必打扰我的用户设置端口号 这是我的一个想法 其工作原理如下 有一个固定
  • 如何使用assertEquals 和 Epsilon 在 JUnit 中断言两个双精度数?

    不推荐使用双打的assertEquals 我发现应该使用带有Epsilon的形式 这是因为双打不可能100 严格 但无论如何我需要比较两个双打 预期结果和实际结果 但我不知道该怎么做 目前我的测试如下 Test public void te
  • 在 Jar 文件中运行 ANT build.xml 文件

    我需要使用存储在 jar 文件中的 build xml 文件运行 ANT 构建 该 jar 文件在类路径中可用 是否可以在不分解 jar 文件并将 build xml 保存到本地目录的情况下做到这一点 如果是的话我该怎么办呢 Update
  • 来自 dll 的 Java 调用函数

    我有这个 python 脚本导入zkemkeeperdll 并连接到考勤设备 ZKTeco 这是我正在使用的脚本 from win32com client import Dispatch zk Dispatch zkemkeeper ZKE
  • 从最终实体获取根证书和中间证书

    作为密码学的菜鸟 我每天都会偶然发现一些简单的事情 今天只是那些日子之一 我想用 bouncy castle 库验证 java 中的 smime 消息 我想我几乎已经弄清楚了 但此时的问题是 PKIXparameters 对象的构建 假设我
  • 无法创建请求的服务[org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]-MySQL

    我是 Hibernate 的新手 我目前正在使用 Spring boot 框架并尝试通过 hibernate 创建数据库表 我知道以前也问过同样的问题 但我似乎无法根据我的环境找出如何修复错误 休眠配置文件
  • 在 junit 测试中获取 javax.lang.model.element.Element 类

    我想测试我的实用程序类 ElementUtils 但我不知道如何将类作为元素获取 在 AnnotationProcessors 中 我使用以下代码获取元素 Set
  • Java ResultSet 如何检查是否有结果

    结果集 http java sun com j2se 1 4 2 docs api java sql ResultSet html没有 hasNext 方法 我想检查 resultSet 是否有任何值 这是正确的方法吗 if resultS
  • 如何对不同的参数类型使用相同的java方法?

    我的问题 我有 2 个已定义的记录 创建对象请求 更新对象请求 必须通过实用方法进行验证 由于这两个对象具有相同的字段 因此可以对这两种类型应用相同的验证方法 现在我只是使用两种方法进行重载 但它很冗长 public record Crea
  • 为什么 Java 8 不允许非公共默认方法?

    让我们举个例子 public interface Testerface default public String example return Hello public class Tester implements Testerface
  • 不接受任何内容也不返回任何内容的函数接口[重复]

    这个问题在这里已经有答案了 JDK中是否有一个标准的函数式接口 不接受也不返回任何内容 我找不到一个 像下面这样 FunctionalInterface interface Action void execute 可运行怎么样 Functi
  • 关键字“table”附近的语法不正确,无法提取结果集

    我使用 SQL Server 创建了一个项目 其中包含以下文件 UserDAO java public class UserDAO private static SessionFactory sessionFactory static se
  • 最新的 Hibernate 和 Derby:无法建立 JDBC 连接

    我正在尝试创建一个使用 Hibernate 连接到 Derby 数据库的准系统项目 我正在使用 Hibernate 和 Derby 的最新版本 但我得到的是通用的Unable to make JDBC Connection error 这是
  • Eclipse 启动时崩溃;退出代码=13

    I am trying to work with Eclipse Helios on my x64 machine Im pretty sure now that this problem could occur with any ecli
  • 包 javax.el 不存在

    我正在使用 jre6 eclipse 并导入 javax el 错误 包 javax el 不存在 javac 导入 javax el 过来 这不应该是java的一部分吗 谁能告诉我为什么会这样 谢谢 米 EL 统一表达语言 是 Java
  • 如何防止在Spring Boot单元测试中执行import.sql

    我的类路径中有一个 import sql 文件 其中包含一些 INSERT 语句 当使用 profile devel 运行我的应用程序时 它的数据被加载到 postgres 数据库中 到目前为止一切正常 当使用测试配置文件执行测试时 imp
  • Spring Boot 无法更新 azure cosmos db(MongoDb) 上的分片集合

    我的数据库中存在一个集合 documentDev 其分片键为 dNumber 样本文件 id 12831221wadaee23 dNumber 115 processed false 如果我尝试使用以下命令通过任何查询工具更新此文档 db

随机推荐

  • 80%白领危了!OpenAI发布GPT时代就业秘笈:34大铁饭碗保命

    导读 GPT 4发布没几天 OpenAI直接告诉所有人 GPTs是通用技术 80 的美国人的工作受到影响 想要保命 且看这34大 铁饭碗 前脚刚推出GPT 4 OpenAI后脚就发布了35页论文官宣 80 的美国人 都会受到AI的影响 研究
  • STM32“隐藏的定时器”-DWT

    01 前言 在之前的文章在 STM32延时函数的四种方法 使用定时器延时 在 如何测量代码运行时间 中提到使用定时器外设计算代码运行时间 文中提到这种方法的明显缺点就是需要占用一个定时器 一些MCU在特定应用场景下定时器外设资源是十分稀缺的
  • 信息安全大赛出的题目

    今天是信息安全大赛决赛的日期 可惜还要去市里培训 不能去现场观看 听说的做的一塌糊涂 也许是第一次举办这样的比赛 在校内还没有这样的氛围的缘故吧 中午打了电话 得知总分150左右的 最高的得了68分 我在反思 是我们把题目的难度没控制好 还
  • 华为OD机试 C++【最少步数】

    题目 你在一个一维的数轴上 起始位置为0 你每次只能走2步或3步 无论是向左还是向右 有时你可能需要走到负坐标上去 才能最终到达你的目标位置 任务 给定一个坐标点 找出到达那里的最小步数 输入 一个整数 n 表示目标坐标位置 1 lt n
  • Matter Project 入门 – Chip-tool 调试终端设备

    注意 本指南是对 Matter TE7 5 的投诉 请查看芯片工具 GitHub 页面 以获取任何最新更改 如果您没有遵循Matter 构建指南 您应该首先在您的 Raspberry Pi 4 上准备 Matter 环境 然后导航到 con
  • 二货小易有一个W*H的网格盒子,网格的行编号为0~H-1,网格的列编号为0~W-1。每个格子至多可以放一块蛋糕,任意两块蛋糕的欧几里得距离不能等于2。

    二货小易有一个W H的网格盒子 网格的行编号为 0到H 1 网格的列编号为 0到W 1 每个格子至多可以放一块蛋糕 任意两块蛋糕的欧几里得距离不能等于2 对于两个格子坐标 x1 y1 x2 y2 的欧几里得距离为 x1 x2 x1 x2 y
  • Idea: debug 跳出循环

    点击循环下面的某行代码 点击run to cusor按钮
  • RedHat Linux各版本汇总

    Linux的发行版本可以大体分为两类 一类是商业公司维护的发行版本 一类是社区组织维护的发行版本 前者以著名的Redhat RHEL 为代表 后者以Debian为代表 Redhat有两大 Linux产品系列 其一是免费的Fedora Cor
  • 关于tomcat7-maven-plugin插件的使用

    最近在学习黑马的淘淘项目 第一步是使用maven依赖进行环境搭建 其中使用到了tomcat7 maven plugin这个插件 视频中老师给的依赖大致是这样的
  • Java并发编程:Synchronized底层优化(偏向锁、轻量级锁)

    Java并发编程系列 Java 并发编程 核心理论 Java并发编程 Synchronized及其实现原理 Java并发编程 Synchronized底层优化 轻量级锁 偏向锁 Java 并发编程 线程间的协作 wait notify sl
  • sql中的排序函数dense_rank(),RANK()和row_number()

    dense rank RANK 和row number 是SQL中的排序函数 为方便后面的函数差异比对清晰直观 准备数据表如下 1 dense rank 函数语法 dense rank over order by 列名 desc asc D
  • requests 和flask豆瓣安装方法

    pip3 install requests i http pypi douban com simple trusted host pypi douban com pip3 install flask i http pypi douban c
  • SQL中的case when then else end语句的用法示例

    case具有两种格式 简单case函数和case搜索函数 简单case函数 case sex when 1 then 男 when 2 then 女 else 其他 end case搜索函数 case when sex 1 then 男 w
  • 【nginx】配置proxy_pass之后,响应变慢的问题

    背景 netstub项目中 使用openresty作为网关 proxy pass处理 配置如下 access lua中进行一些预处理 然后代理到目标服务 location access by lua file etc nginx conf
  • 第一章 pandas基础-学习笔记

    第一章 pandas基础 首先要导入对应的模块 import pandas as pd import numpy as np 一 文件的读取和写入 1 常见文件类型读取方法 读取之前先了解常用的对应参数 1 header None 表示第一
  • aoa定位算法matlab仿真,基于信号到达角度(AOA)的定位算法研究

    内容摘要 基于信号到达角度 AOA 的定位算法是一种常见的无线传感器网络节点自定位算法 算法通信开销低 定位精度较高 由于各种原因 估测的多个节点位置可能存在不可靠位置 提出了一种改进的基于信号到达角的定位方法 通过过滤误差较大的估计位置
  • 手写Promise核心代码

    1 框架构建 class Promise 定义状态并立即执行excutor函数 constructor 修改状态为fufilled resolve 修改状态为reject reject 根据excutor函数的结果执行对应的回调 then
  • 实战Angular2+web api增删改查 (一)

    Angular2是一个前端开发框架 在引入ts之后使得我们这些C 开发者能够更快的熟悉该框架 angular2开发首先要知道这是一个SPA 单页应用 我们要摆脱以往的asp net中的MVC模式的固有思路 angular2开发重点是组件 C
  • 宝塔面板是干什么的?

    宝塔面板是一款基于 Web 的管理服务器的面板软件 它可以帮助用户方便地管理服务器的各种功能 以下是宝塔面板的 20 个作用 服务器配置管理 可以修改服务器的 IP 地址 DNS 服务器 防火墙设置 系统软件等 数据库管理 可以管理 MyS
  • 小程序对接停车场支付流程思考

    前言 最近一直在做公司的小程序对接停车场的需求 结果遇到了并发问题 出现一笔订单 用户支付两次的情况 现在对整个支付流程进行梳理 下面讨论的A用户和B用户都是对于同一订单处理的场景 对于不同订单 则没有并发问题 一 查询停车费接口 业务流程