服务端如何防止订单重复支付!

喜欢吃鱼的青年 2021-04-02 14:05:46 ⋅ 692 阅读

如图是一个简化的下单流程,首先是提交订单,然后是支付。支付的话,一般是走支付网关(支付中心),然后支付中心与第三方支付渠道(微信、支付宝、银联)交互,支付成功以后,异步通知支付中心,支付中心更新自身支付订单状态,再通知业务应用,各业务再更新各自订单状态。

这个过程中经常可能遇到的问题是掉单,无论是超时未收到回调通知也好,还是程序自身报错也好,总之由于各种各样的原因,没有如期收到通知并正确的处理后续逻辑等等,都会造成用户支付成功了,但是服务端这边订单状态没更新,这个时候有可能产生投诉,或者用户重复支付。

由于③⑤造成的掉单称之为外部掉单,由④⑥造成的掉单我们称之为内部掉单

为了防止掉单,这里可以这样处理:

1、支付订单增加一个中间状态“支付中”,当同一个订单去支付的时候,先检查有没有状态为“支付中”的支付流水,当然支付(prepay)的时候要加个锁。支付完成以后更新支付流水状态的时候再讲其改成“支付成功”状态。

2、支付中心这边要自己定义一个超时时间(比如:30秒),在此时间范围内如果没有收到支付成功回调,则应调用接口主动查询支付结果,比如10s、20s、30s查一次,如果在最大查询次数内没有查到结果,应做异常处理

3、支付中心收到支付结果以后,将结果同步给业务系统,可以发MQ,也可以直接调用,直接调用的话要加重试(比如:SpringBoot Retry)

4、无论是支付中心,还是业务应用,在接收支付结果通知时都要考虑接口幂等性,消息只处理一次,其余的忽略

5、业务应用也应做超时主动查询支付结果

对于上面说的超时主动查询可以在发起支付的时候将这些支付订单放到一张表中,用定时任务去扫

为了防止订单重复提交,可以这样处理:

1、创建订单的时候,用订单信息计算一个哈希值,判断redis中是否有key,有则不允许重复提交,没有则生成一个新key,放到redis中设置个过期时间,然后创建订单。其实就是在一段时间内不可重复相同的操作

附上微信支付最佳实践:

 


全部评论: 0

    我有话说:

    【开源资讯】WinSCP 5.17.8 发布,Windows 图形化 SFTP 客户

    WinSCP 是一个 Windows 环境下使用的 SSH 的开源图形化 SFTP 客户,同时支持 SCP 协议,它的主要功能是在本地与

    Redisson 3.13.6 发布,官方推荐的 Redis 客户

    Redisson 3.13.6 已发布,这是一个 Java 编写的 Redis 客户,具备驻内存数据网格(In-Memory Data Grid)功能,并获得了 Redis 的官方推荐

    服务化改造实践 | 如何在 Dubbo 中支持 REST

    随着微服务的流行以及多语言互操作诉求的日益增多,在 Dubbo 中暴露 REST 服务变成了一个不容忽视的诉求。

    【开源资讯】JWCloud 专业版 v1.0.0 发布,基于 SpringCloud 研发的微服务框架

    简介 JavaWeb_Cloud 微服务平台是一款基于 SpringCloud 框架研发的分布式微服务框架,主要使用技术栈包括: SpringCloud、Vue、ElementUI

    「转载」微服务分布式架构中,如何实现日志链路跟踪?

    背景 开发排查系统问题用得最多的手段就是查看系统日志,在分布式环境中一般使用ELK来统一收集日志,但是在并发大时使用日志定位问题还是比较麻烦,我们来看下面的图     上图一个用户请求一个url,整个链路如图,每个处理层...

    你的老板逼你上微服务了吗?

    “ 这些年软件的设计规模越来越庞大,业务需求也越来越复杂,针对系统的性能、高吞吐率、高稳定性、高扩展等特性提出了更高的要求。   图片来自 Pexels可以说业务需求是软件架构能力的第一推动力,由于这些因素导致了软件架构思想和相关技...

    「强烈推荐」这是我看过最接“地气”的代码问题与重构实践

      写这个文章是因为前段时间确实因为公司的业务开发太忙太紧,所有开发都处在于加班赶项目,并且加入的新人较多造成了一系列代码不可控的质量问题。 文章针对这段时间代码出现的各种各样的问题进行了一个概况和整理,主要集中在代码编码的问题,抽...

    Coder如何做好代码设计?

    来源:http://r6d.cn/C5Ja 说明:生鲜电商属于一个软件的产品,那么如何做好代码设计呢?代码设计,是程序员做项目时,在coding之前非常重要的一个步骤,可以说关系到整个系统

    服务架构学习笔记(一):重新认识微服务

    服务(Microservice)是服务化思路的一种最佳实践方向,遵循SOA的思路,各个企业在服务化治理的道路上走的时间长了,踩的坑多了,整个软件交付链路上各个环节的基础设施逐渐成熟了,微服务

    小型系统如何“微服务”开发

    提到“微服务”,我相信网上各种“微服务”的演变案例都会给人一种“因大而分”的前提错觉,这可能会导致许多的“小白”产生没有机会接触“大项目”而对“微服务”可望而不可及也。

    Logstash 7.9.2 发布,开源服务数据处理流程

    Logstash 是开源的服务器数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到你最喜欢的“存储库”中。目前,Logstash 7.9.2 已正式发布,该版本更新内容如下

    「轻阅读」Dubbo 如何成为连接异构微服务体系的最佳服务开发框架

    要实现异构微服务体系间的共存或迁移,关键点在打通异构体系间的协议与服务发现,得益于 Dubbo 自身对多协议、多注册模型的支持

    MySql实战篇:写一个简单的存储过程,完成订单定时任务

    前言之前我们分享了MySql的性能优化、索引详解等内容,本篇文章主要是针对想要入门MySql存储过程的读者,主要实现的业务是订单库里面的超过30分钟没有支付订单全部置为失效订单......

    「轻阅读」如何设计移动屏适配方案

    在众多的移动设备中,前端开发人员如何在不同屏幕大小,不同程度的高清屏下去百分百的还原设计稿,从来都不

    BAT大牛Redis客户服务交互原理

    Redis实例运行在单独的进程中,应用系统(Redis客户)通过Redis协议和Redis Server

    QQ停止为欧洲用户提供服务/哈罗单车获7亿美元融资,共享单车三足鼎立已成/快手们被中央点名,融资前景如何?

    QQ停止为欧洲用户提供服务;哈罗单车获7亿美元融资,共享单车三足鼎立已成;快手们被中央点名,融资前景如何?

    精品推荐:大神总结的十大 JavaScript 错误及如何规避

    通过统计数据库中的1000多个项目,我们发现在 JavaScript 中最常出现的错误有10个。下面会向大家介绍这些错误发生的原因以及如何防止

    DDD 微服务落地实战

    PS:让我们把DDD的思想真正落地,从数据库设计到代码实战演练,从电商、在线订餐 到智慧医疗全方位展示如何运用DDD 在微服务+人工智能、嵌入式+物联网的项目中进行业务建模、系统规划与设计实践。

    创业团队如何设计支撑百万并发的数据库架构?

    我们来聊一下对于一个支撑日活百万用户的高并系统,他的数据库架构应该如何设计?