点击上方“朱小厮的博客”,选择“设为星标”

后台回复"书",获取

后台回复“k8s”,可领取k8s资料

概述

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

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

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

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

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

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

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

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

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

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

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

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

附上微信支付最佳实践:

来源:cnblogs.com/cjsblog/p/14516909.html

想知道更多?扫描下面的二维码关注我后台回复"技术",加入技术群
后台回复“k8s”,可领取k8s资料【精彩推荐】
  • ClickHouse到底是什么?为什么如此牛逼!

  • 原来ElasticSearch还可以这么理解

  • 面试官:InnoDB中一棵B+树可以存放多少行数据?

  • 架构之道:分离业务逻辑和技术细节

  • 星巴克不使用两阶段提交

  • 面试官:Redis新版本开始引入多线程,谈谈你的看法?

  • 喜马拉雅自研网关架构演进过程

  • 收藏:存储知识全面总结

  • 微博千万级规模高性能高并发的网络架构设计

解决支付订单,重复提交问题!相关推荐

  1. 支付系统流程以及防止订单重复提交

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

  2. java服务端实践:防止订单重复提交支付

    来源:cnblogs.com/cjsblog/p/14516909.html 概述 为了防止掉单,这里可以这样处理: 为了防止订单重复提交,可以这样处理: 附上微信支付最佳实践: 概述 如图是一个简化 ...

  3. 防止订单重复提交策略方案

    一.什么是接口幂等性 接口幂等性就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用:比如说支付场景,用户购买了商品支付扣款成功,但是返回结果的时候网络异常,此 ...

  4. 简单介绍redis分布式锁解决表单重复提交的问题

    在系统中,有些接口如果重复提交,可能会造成脏数据或者其他的严重的问题,所以我们一般会对与数据库有交互的接口进行重复处理.本文就详细的介绍一下redis分布式锁解决表单重复提交,感兴趣的可以了解一下 假 ...

  5. springboot 订单重复提交_防止表单重复提交(springboot,redis)

    我们在web项目中经常需要在后台对用户提交的表单进行校验防止重复提交.下面通过springboot的aop.redis来解决表单重复提交的问题. 通过在controller加上CheckSubmitF ...

  6. php mysql 重复提交数据_如何真正解决表单重复提交问题php代码

    如何真正解决表单重复提交问题php代码 过去一切时代的精华尽在书中.以下是小编为大家搜索整理的如何真正解决表单重复提交问题php代码,希望能给大家带来帮助!更多精彩内容请及时关注我们应届毕业生考试网! ...

  7. java订单重复提交_java表单重复提交常用解决办法

    最近在看些基础的东西,顺便做下笔记.相信大家在平时网页使用中,经常会有按钮重复点击,然后点不动刷新,还有当网络延时比较厉害点了没反应在点击的重复提交.为了避免这种情况,总结了一下4点处理方案 表单重复 ...

  8. 分布式锁防止订单重复提交_防止表单重复提交看这里!!!

    要解决重复提交这事,先要知道什么是重复提交 假如用户的网速慢,用户点击提交按钮,却因为网速慢,而没有跳转到新的页面,这时的用户会再次点击提交按钮,举个例子:用户点击订单页面,当点击提交按钮的时候,也许 ...

  9. springboot 订单重复提交_Spring Boot (一) 校验表单重复提交

    一.前言 在某些情况下,由于网速慢,用户操作有误(连续点击两下提交按钮),页面卡顿等原因,可能会出现表单数据重复提交造成数据库保存多条重复数据. 存在如上问题可以交给前端解决,判断多长时间内不能再次点 ...

  10. springboot 订单重复提交_瞬间几千次的重复提交,我用Spring Boot+Redis扛住了

    在实际的开发项目中,一个对外暴露的接口往往会面临,瞬间大量的重复的请求提交,如果想过滤掉重复请求造成对业务的伤害,那就需要实现幂等! 我们来解释一下幂等的概念: 任意多次执行所产生的影响均与一次执行的 ...

最新文章

  1. win10终端仿真程序_win10下子系统的使用
  2. 垃圾回收器机制(三):正确姿势解读GC日志
  3. 无限极分类,子集跟着父集排列,用于后台显示菜单管理
  4. 《此生未完成》痛句摘抄(3)
  5. Java 10:“ var”关键字
  6. Effective C++学习第十天
  7. UVA----10082 WERTYU【字符串】
  8. 使用saltstack编译安装nginx
  9. 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
  10. 哪个服务器可以玩无限火力,lol无限火力2018开放时间 国服测试服已登录 网友:希望这次不要骗人!...
  11. http中响应状态码表示的意义?
  12. 陈绪:3月21日阿里云北京峰会专场出品人
  13. php 61850,IEC61850客户端
  14. 微软在线笔试题2015
  15. Linux GDB的实现原理
  16. 手把手调参最新 YOLOv7 模型 训练部分 - 最新版本(二)
  17. 视频加水印,怎么给视频加水印?
  18. 深信服 2019校园招聘 研发试卷-2018.09.21
  19. excel2016 android,Excel2016试用心得。
  20. 2018 iPad pro 11停用,DFU模式刷机指南

热门文章

  1. icem密度盒怎么设置_使用ICEM绘制非结构网格时,如何提高网格质量?
  2. ZooKeeper作为注册中心
  3. 【ZZULIOJ】1000: 从今天开始入坑C语言
  4. 特殊三角函数求导 和差化积
  5. 谷歌浏览器fash弹框的设置
  6. 说说DBA职责和目标
  7. 双11还没完,商家已经被退货“逼疯”了
  8. OpenHarmony代码操作总结
  9. 手机邮件html样式,iPhone技巧篇 如何添加HTML风格邮件签名
  10. python序列类型映射_python学习笔记(基础:变量,序列,映射) | 学步园