首页
技术博客
PHP教程
数据库技术
前端开发
HTML5
Nginx
php论坛
新用户注册
|
会员登录
PHP教程
技术博客
编程问答
PNG素材
编程语言
前端技术
Android
PHP教程
HTML5教程
数据库
Linux技术
Nginx技术
PHP安全
WebSerer
职场攻略
JavaScript
开放平台
业界资讯
大话程序猿
登录
极速注册
取消
热门标签 | HotTags
httpclient
cookie
dagger
random
schema
flutter
emoji
require
scala
javascript
node.js
post
ascii
controller
web
ip
bitmap
merge
grid
nodejs
int
email
php
text
config
httprequest
io
object
window
perl
range
future
dockerfile
audio
rsa
go
header
substring
join
plugins
web3
triggers
tree
dll
js
import
typescript
bytecode
iostream
timezone
timestamp
stream
default
shell
yaml
python
md5
hash
get
foreach
php5
数组
solr
byte
python2
cSharp
hashset
request
bit
fetch
process
java
spring
uml
netty
filter
callback
php7
format
当前位置:
开发笔记
>
编程语言
> 正文
干货丨服务端如何防止重复支付?
作者:时间证明一2602891163 | 来源:互联网 | 2023-09-07 13:45
服务
关注我,为你分享更多Java干货
来源:cnblogs.com/cjsblog/p/14516909.html
概述:
如图是一个简化的下单流程,
首先是提交订单,然后是支付。
支付的话,一般是走支付网关(支付中心),然后支付中心与第三方支付渠道(微信、支付宝、银联)交互,支付成功以后,异步通知支付中心,
支付中心更新自身支付订单状态,再通知业务应用,各业务再更新各自订单状态。
这个过程中经常可能遇到的问题是掉单
,无论是超时未收到回调通知也好,还是程序自身报错也好,
总之由于各种各样的原因,没有如期收到通知并正确的处理后续逻辑等等,都会造成用户支付成功了,但是服务端这边订单状态没更新,这个时候有可能产生投诉,或者用户重复支付。
由于③⑤造成的掉单称之为外部掉单,由④⑥造成的掉单我们称之为内部掉单
为了防止掉单,这里可以这样处理:
1、支付订单增加一个中间状态“支付中”,当同一个订单去支付的时候,先检查有没有状态为“支付中”的支付流水,当然支付(prepay)的时候要加个锁。
支付完成以后更新支付流水状态的时候再讲其改成“支付成功”状态。
2、支付中心这边要自己定义一个超时时间(比如:30秒),在此时间范围内如果没有收到支付成功回调,则应调用接口主动查询支付结果,
比如10s、20s、30s查一次,如果在最大查询次数内没有查到结果,应做异常处理
3、支付中心收到支付结果以后,将结果同步给业务系统,可以发MQ,也可以直接调用,直接调用的话要加重试(比如:SpringBoot Retry)
4、无论是支付中心,还是业务应用,在接收支付结果通知时都要考虑接口幂等性,消息只处理一次,其余的忽略
5、业务应用也应做超时主动查询支付结果
对于上面说的超时主动查询可以在发起支付的时候将这些支付订单放到一张表中,用定时任务去扫
为了防止订单重复提交,可以这样处理:
1、创建订单的时候,用订单信息计算一个哈希值,判断redis中是否有key。
有则不允许重复提交,没有则生成一个新key,放到redis中设置个过期时间,然后创建订单。
其实就是在一段时间内不可重复相同的操作
附上微信支付最佳实践:
PS:如果觉得我的分享不错,欢迎大家随手点赞、在看。
课程咨询
:课程试听、资料领取添加小暖
小暖微信:xhlxnt666
数据库
java
js
html
微信
支付宝
mq
spring
redis
写下你的评论吧 !
吐个槽吧,看都看了
会员登录
|
用户注册
推荐阅读
config
Redis API
安装启动最简启动命令行输入验证动态参数启动配置文件启动常用配置通用命令keysbdsize计算key的总数exists判断是否存在delkeyvalue删除指定的keyvalue成 ...
[详细]
蜡笔小新 2023-12-09 18:01:55
io
无处不在,详解iOS集成第三方登录(SSO授权登录<无需密码>)
1.前言 不多说,第三登录无处不在!必备技能,今天以新浪微博为例。这是上次写的iOS第三方社交分享:http:www.cnblogs.comqingchep3727559.html ...
[详细]
蜡笔小新 2023-10-17 16:54:56
io
缓存 分布式锁 Redis
分布式锁现在Redis基本上没家公司都在使用,只是各自使用的场景不以,但Redis最出名的还是做为缓存服务器,提搞服务器的的吞吐量,下面我们来围绕这个作为缓存做一个总结今天的目标其 ...
[详细]
蜡笔小新 2023-10-17 11:51:10
php
Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ...
[详细]
蜡笔小新 2023-12-14 12:01:13
io
SpringBoot集成前端模版(thymeleaf)的配置步骤
本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ...
[详细]
蜡笔小新 2023-12-14 10:11:46
text
java 线程死锁模拟
1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ...
[详细]
蜡笔小新 2023-12-13 19:12:25
object
Redis底层数据结构之压缩列表的介绍及实现原理
本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ...
[详细]
蜡笔小新 2023-12-12 16:06:05
object
一次上线事故,30岁+的程序员踩坑经验之谈
本文主要介绍了一位30岁+的程序员在一次上线事故中踩坑的经验之谈。文章提到了在双十一活动期间,作为一个在线医疗项目,他们进行了优惠折扣活动的升级改造。然而,在上线前的最后一天,由于大量数据请求,导致部分接口出现问题。作者通过部署两台opentsdb来解决问题,但读数据的opentsdb仍然经常假死。作者只能查询最近24小时的数据。这次事故给他带来了很多教训和经验。 ...
[详细]
蜡笔小新 2023-12-10 17:25:31
object
2021最新总结网易/腾讯/CVTE/字节面经分享(附答案解析)
本文分享作者在2021年面试网易、腾讯、CVTE和字节等大型互联网企业的经历和问题,包括稳定性设计、数据库优化、分布式锁的设计等内容。同时提供了大厂最新面试真题笔记,并附带答案解析。 ...
[详细]
蜡笔小新 2023-12-09 19:11:31
php
Redis的默认端口、数据库使用和多端口配置
本文介绍了Redis的默认端口、数据库使用和多端口配置的方法。通过选择不同的数据库和使用flushdb命令可以实现对不同数据库的访问和清除数据。同时,本文还介绍了在同一台机器上启用多个Redis实例的方法,并讨论了配置认证密码的步骤和注意事项。 ...
[详细]
蜡笔小新 2023-12-09 08:27:30
object
浅析对象 VO、DTO、DO、PO 概念
作者|CatQi链接|cnblogs.comqixuejiap4390086.html前言由于此订阅号换了个皮肤,导致用户接受文章不及时。读者可以打开订阅号「Web项 ...
[详细]
蜡笔小新 2023-10-17 16:38:56
io
来吹下汽车
最近帮同事的一个朋友选车,最后他决定了一汽大众的迈腾,也就是海外版(欧洲为主)的帕萨特B8,国内如果加长过的话,应该叫B8L吧。基于大众最新的通用MQB平台(模块化横置发动机平台) ...
[详细]
蜡笔小新 2023-10-17 11:56:45
window
DOM应用遍历网页中的元素
在我们编写的程序中,如果想要实现对浏览器打开的网页进行监视、模拟操纵、动态提取用户输入、动态修改等功能,那么请你抽出宝贵的时间,继续往下阅读。本文介绍的知识和示例程序都 ...
[详细]
蜡笔小新 2023-10-15 11:56:57
io
知识图谱——机器大脑中的知识库
本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ...
[详细]
蜡笔小新 2023-12-14 10:06:19
object
celery 爬虫使用
简介celery是一个基于分布式消息传输的异步任务队列,它专注于实时处理,同时也支持任务调度。它由三部分组成,消息中间件, ...
[详细]
蜡笔小新 2023-10-16 09:07:46
时间证明一2602891163
这个家伙很懒,什么也没留下!
Tags | 热门标签
httpclient
cookie
dagger
random
schema
flutter
emoji
require
scala
javascript
node.js
post
ascii
controller
web
ip
bitmap
merge
grid
nodejs
int
email
php
text
config
httprequest
io
object
window
perl
RankList | 热门文章
1
Android文字识别之tesseract的使用
2
spring3.1.1入门讲解二(注解篇)
3
np读取csv文件_[记录]Pytorch利用图片数据和csv标签文件建立Dataset
4
从NuGet包安装N2 - 下一步是什么? - N2 Installation from NuGet Packages - What's Next?
5
axios拦截器的介绍
6
计算机网络地址书写,计算机网络——IP编址、子网掩码和特殊的IP地址
7
WNM2030单N沟道20V0.95A功率MOSFET场效应晶体管WNM20303/TR
8
Plymouth文本模式启动画面修改
9
java wait 和await_java多线程中Object.wait()和Condition.await()是否会释放当前线程锁占有的锁...
10
Redis服务器设置密码后,使用service redis stop 会出现以下信息:Waiting for Redis to shutdown ......
11
ASP.NET 使用TTS 实现语音合成,生成的文件为零 如何解决?
12
svn打分支与分支合并回主干
13
mysql版本年代_MySQL之SQL基础
14
VC/MFC 固定窗口大小、居中显示
15
python怎么把输入变成列表_Python键盘输入转换为列表的实例
PHP1.CN | 中国最专业的PHP中文社区 |
DevBox开发工具箱
|
json解析格式化
|
PHP资讯
|
PHP教程
|
数据库技术
|
服务器技术
|
前端开发技术
|
PHP框架
|
开发工具
|
在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved |
京公网安备 11010802041100号
|
京ICP备19059560号-4
| PHP1.CN 第一PHP社区 版权所有