概述

如图是一个简化的下单流程,首先是提交订单,然后是支付。

支付的话,一般是走支付网关(支付中心),然后支付中心与第三方支付渠道(微信、支付宝、银联)交互。

支付成功以后,异步通知支付中心,支付中心更新自身支付订单状态,再通知业务应用,各业务再更新各自订单状态。

这个过程中经常可能遇到的问题是掉单,无论是超时未收到回调通知也好,还是程序自身报错也好。

总之由于各种各样的原因,没有如期收到通知并正确的处理后续逻辑等等,都会造成用户支付成功了,但是服务端这边订单状态没更新。

这个时候有可能产生投诉,或者用户重复支付。

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

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

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

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

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

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

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

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

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

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

其实就是在一段时间内不可重复相同的操作

附上微信支付最佳实践:

作者:狂乱的贵公子

https://www.cnblogs.com/cjsblog/p/14516909.html

公众号“Java精选”所发表内容注明来源的,版权归原出处所有(无法查证版权的或者未注明出处的均来自网络,系转载,转载的目的在于传递更多信息,版权属于原作者。如有侵权,请联系,笔者会第一时间删除处理!
最近有很多人问,有没有读者交流群!加入方式很简单,公众号Java精选,回复“加群”,即可入群!Java精选面试题(微信小程序):3000+道面试题,包含Java基础、并发、JVM、线程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架构设计等,在线随时刷题!
------ 特别推荐 ------特别推荐:专注分享最前沿的技术与资讯,为弯道超车做好准备及各种开源项目与高效率软件的公众号,「大咖笔记」,专注挖掘好东西,非常值得大家关注。点击下方公众号卡片关注。点击“阅读原文”,了解更多精彩内容!文章有帮助的话,点在看,转发吧!

支付宝:服务端如何防止订单重复支付?相关推荐

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

    点击关注公众号,Java干货及时送达 作者:废物大师兄 www.cnblogs.com/cjsblog/p/14516909.html 如图是一个简化的下单流程,首先是提交订单,然后是支付.支付的话, ...

  2. 在线支付——如何防止订单重复支付?

    看看订单支付流程 我们来看看,电商订单支付的简要流程: image.png 订单钱包支付流程 从下单/计算开始: 下单/结算:这一步虽然不是直接的支付起点,但是支付相关的金额等等信息都来自结算,此时订 ...

  3. 如何防止订单重复支付

    想必大家对在线支付都不陌生,今天和大家聊聊如何防止订单重复支付. 看看订单支付流程 我们来看看,电商订单支付的简要流程: 订单钱包支付流程 从下单/计算开始: 下单/结算:这一步虽然不是直接的支付起点 ...

  4. 如何防止订单重复支付?

    大家好,我是磊哥,想必大家对在线支付都不陌生,今天和大家聊聊如何防止订单重复支付. 看看订单支付流程 我们来看看,电商订单支付的简要流程: 订单钱包支付流程 从下单/计算开始: 下单/结算:这一步虽然 ...

  5. 服务端给手机APP写支付接口(微信)

    本文主要介绍怎么在服务端给手机APP写支付接口:以POST的方式. 需要引用第三方. using Senparc.Weixin.MP.TenPayLibV3; 整体来说就是写一个方法罢了. /// & ...

  6. java 支付宝服务端,支付宝app支付服务端的实现-Java版

    前言 最近在工作中需要使用支付宝app支付,在初次使用过程中也不可避免的出现了一些问题,那么本次随笔主要是概述支付宝app支付服务端的整个实现过程以及就服务端出现的一些问题做一些总结. 1.准备工作 ...

  7. 如何避免订单重复支付?

    咖友提问: 如何设计避免订单出现重复支付的逻辑? 问题补充:假设有这么一种情况: 订单已下单成功并且正处于支付页面,用户调起支付网关进行支付.支付成功了一次,但是由于某种情况导致未接收到银行返回的[支 ...

  8. 支付宝小程序服务器要求,支付宝小程序:支付宝服务端SDK

    支付宝 OpenAPI SDK Yet Another Alipay OpenAPI Smart Development Kit 主要功能 OOP风格化的,可弹性扩容的,支付宝OpenAPI SDK ...

  9. 服务端判断苹果内容是否支付完成(二)

    1. 从Transaction 的TransactionReceipt属性中得到接收的数据,并以base64编码: 2.创建JSON对象,字典格式,单键值对,键名为"receiptdata& ...

最新文章

  1. Spring MVC集成Spring Data Reids和Spring Session实现Session共享
  2. java使用gridview,网格控件GridView在Android中的使用
  3. elasticsearch 索引_Elasticsearch系列---索引管理
  4. 2017双11技术揭秘—TDDL/DRDS 的类 KV 查询优化实践
  5. Python与机器视觉(一)安装与环境
  6. 吴恩达深度学习 —— 2.8 计算图的导数计算
  7. 中国大妈也不带钱包了!支付宝春节60后境外支付人数增长130%
  8. Centos中关闭tty以及禁止ipv6
  9. 花瓣长度和花瓣宽度散点图鸢尾花_[创意榫卯结构] 形如花瓣的燕尾榫,不但美,而且非常牢固...
  10. D3D学习摘记(I)上
  11. OpenGL学习(八)phong光照模型
  12. Twaver-HTML5基础学习(9)HTML节点(HTMLNode)
  13. MySQL常用的关键字查询用法
  14. python中fabs函数_Python fabs() 函数 - Python 教程 - 自强学堂
  15. Unity粒子系统基本
  16. win7自动关机方法
  17. 第七十篇:从ADAS到自动驾驶(三):车道检测
  18. python安装setuptools_python安装setuptools的方法
  19. Mogrt模板 电影追灯光线特效字幕条PR模板下载
  20. 新企业会计准则与企业会计制度的科目设置异同

热门文章

  1. ege管理系统_希力科技后台管理日志过滤及留存系统
  2. 为什么说云正在改变制造业和分销商流程
  3. 中文版30种濒危动物碎片拼图
  4. java每个类都定义构造方法吗,Java中的每个类都至少有一个构造方法,一个类中如果没有定义构造方法,系统会自动为这个类创建一个默认的构造方法。()...
  5. ceph集群状态检查常用命令
  6. 三坐标测量机的工作环境
  7. 将文字拆成拼音得到首字母(返回多音字)
  8. hive hql 普通查询 练习
  9. 微信v3支付签名 java main方法测试成功
  10. php三级分销无法绑定佣金,2018最新三级分销佣金比例设置方案