DUBBO之家 2023-01-10 14:01 发表于北京

点击上方 "DUBBO之家" 关注公众号

终身学习  技术干货 及时送达

往期回顾

这次彻底读透 Redis

Java回调机制

概述

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

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

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

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

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

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

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

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

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

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

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

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

附上微信支付最佳实践:

来源:http://985.so/bcduv

精彩推荐 

你项目中怎么处理重复请求(并发请求)

并发请求下,如何让业务优雅地处理重复请求

京东面试:MQ 消息丢失、重复、积压问题,如何解决?

感谢关注,分享不易,希望提升自己,惠泽他人

微信支付最佳实践-服务端如何防止重复支付相关推荐

  1. java服务端如何防止重复支付

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

  2. 淘宝面试:服务端如何防止重复支付?懵B了...

    点击上方蓝色字体,选择"标星公众号" 优质文章,第一时间送达 关注公众号后台回复pay或mall获取实战项目资料+视频 作者:废物大师兄 cnblogs.com/cjsblog/p ...

  3. 腾讯应用宝米大师直购模式支付流程以及服务端php回调校验

    一. 米大师简介 1.米大师(Midas)为腾讯官方唯一虚拟支付平台. 2.YSDK已经内置了米大师(Midas)支付模块,游戏开发者接入YSDK后,可以通过相应的配置开启米大师的支付功能,并调用YS ...

  4. 浅谈对腾讯云微信小程序解决方案服务端的理解(主要针对信道服务)

    浅谈对腾讯云微信小程序解决方案服务端的理解(主要针对信道服务) 参考文章: (1)浅谈对腾讯云微信小程序解决方案服务端的理解(主要针对信道服务) (2)https://www.cnblogs.com/ ...

  5. 【Python】基于 Flask 框架,模拟微信朋友圈的服务端

    [Python]基于 Flask 框架,模拟微信朋友圈的服务端 一.目的:模拟微信朋友圈的服务端,需要满足以下场景: 1.发表内容时带上图片信息,内容包括(具体内容和id,id指定全局唯一标识),客户 ...

  6. 小程序PHP CGI,微信小程序php服务端nginx配置

    微信小程序php服务端nginx配置 微信小程序server端如果选择自己部署的话,可以选择java或者php的,为了省事我选择了php的,腾讯是用CodeIgniter框架做的demo,由于CI框架 ...

  7. 支付宝手机网站支付,app支付,PC端支付流程以及服务端php支付下单,回调流程详解

    一.支付宝支付相关文档地址: 支付宝支付相关的文档地址:https://open.alipay.com/api 电脑网站支付:https://opendocs.alipay.com/open/270/ ...

  8. 研究微信即时通讯的服务端、朋友圈、红包、推送等方案

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 即时通信:前端获得消息发送到服务端,服务端处理后通过推送的方式,发给接收方:Android使用长连机 ...

  9. Semgrep结合GitLab实现代码审计实践-服务端

    一.背景 前段时间在做代码审计,发现很多项目都存在安全隐患,大多数是来自于参数未过滤所造成的:为了解决这个问题,我将Web安全开发规范手册V1.0进行了培训,但是效果并不是太理想,原因是培训后开发者的 ...

最新文章

  1. [POJ2104]K-th Number(区间第k值 记录初始状态)
  2. 卡耐基梅隆大学专家谈核心技术市场化:「AI 周边相关机遇最大」
  3. GitHub 上值得关注的 iOS 开源项目
  4. 2018视频人物识别挑战赛冠军经验分享:在现有机器资源条件下更快速验证是关键...
  5. AB1601GPIO不支持较高频率的脉冲中断
  6. C++子对象和堆对象
  7. 垃圾分类急上头?物联网卡来消愁
  8. python实现【国家统计局】三级区划代码和城乡划分代码爬取
  9. 【youcans 的 OpenCV 学习课】10. 图像复原与重建
  10. ShadowGun Shader学习
  11. 第一章 MapReduce概述
  12. FiddlerScript实现对QQ空间账号密码获取
  13. Windows MinWG 编译 thrift
  14. 硬盘分区怎么分?新手该如何操作?
  15. (详解)区间DP —— 平行四边形优化
  16. C#Winform 实现控件自适应父容器大小
  17. Smalltalk的变量
  18. 2.9.1 Packet Tracer - Basic Switch and End Device Configuration(作业)
  19. mysql服务器默认使用用户_在Windows下配置MySql服务器默认使用的用户是
  20. 也许有那么一天你会发现原来自己是个怪人

热门文章

  1. WPF 实现 RichTextBox 关键字查询高亮
  2. 用好大数据须有大智慧
  3. 数字化转型中的人才技能重建
  4. exec 与 exec sp_executesql 的用法及比较
  5. Numpy入门[16]——choose函数实现条件筛选
  6. 中职计算机应用基础课程考试,计算机应用基础课标考试试题
  7. Archlinux+Dwm关闭笔记本触摸板
  8. 通过bat批处理修改代理服务器设置及主页
  9. 第五 字符串和格式化输入/输出
  10. DXF00-00 时间:2021.11.30-2021.11.30 关键词1:Autodesk CAD 关键词2:脱机帮助文档 关键词3:下载及使用