涨见识!支付回调特有的幂等处理方式

简介: 在订单的状态发生改变后,支付宝会通过异步方式同志商家服务器。商家服务器需要返回success这7个字符,如果不是,则会不断重复发送。微信也是如此,必须需要商家服务器的正确反馈。既然这样,在回调接口就需要进行幂等处理。

前言

在订单的状态发生改变后,支付宝会通过异步方式同志商家服务器。商家服务器需要返回success这7个字符,如果不是,则会不断重复发送。


微信也是如此,必须需要商家服务器的正确反馈。既然这样,在回调接口就需要进行幂等处理。


一、什么是幂等?

幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。


细想一下回调接口一般会这样处理:


查看订单是否存在。

修改订单状态。

如果是支付成功状态,则进行发货。

这种逻辑本身是没有什么问题的,但是它不是一个幂等接口,如果收到好几次订单1001支付成功的请求,则会对订单1001的商品多次发货,这就导致了一个订单多次发货的现象,这种在电商开发时是灾难性的bug。


因此,我们需要对此接口做一个处理,使得即使有很多请求都告诉商户服务器订单1001支付成功的请求,商户也只发货一次。


二、如何进行幂等处理

对于这种接口的幂等处理,我也是思量许久,最终决定再生使用修改状态的方式。


具体实现方式如下:


订单表t_order存在订单号1001的订单是未支付状态。

支付宝转账成功,告诉商家服务器订单1001的订单转账成功。

商家服务器验签。

查看订单是否存在,基本信息是否一致。

修改此订单状态。通过update t_order set 状态=已支付 where order_id=1001 and 状态=未支付

通过如上sql乐观锁的思想对发货进行控制,只有sql执行的时候有修改成功,则进行发货,修改失败则不发货。

通过乐观锁可以有效的控制发货次数。不管几次回调通知,只有当前订单是未支付状态并且成功修改成已支付状态之后才进行发货。


如下图,两个sql一起执行修改订单状态,但是肯定只会有一个sql修改成功。


修改成功的线程进行发货即可。


image.png


如果思路有什么缺点,或者您还有更好的实现方式,请留言点评。



相关文章
|
传感器 算法 API
ESP-IDF Modbus 主站示例程序
ESP-IDF Modbus 主站示例程序
552 0
|
应用服务中间件 API Apache
Springboot----项目整合微信支付(处理微信支付回调通知)
Springboot----项目整合微信支付(处理微信支付回调通知)
2067 0
Springboot----项目整合微信支付(处理微信支付回调通知)
LaTeX中定义新命令和环境
LaTeX中定义新命令和环境
970 0
LaTeX中定义新命令和环境
小知识 .rp文件用什么打开
rp 文件可以通过 Axure8 导入打开,具体方式如下:
4795 0
小知识 .rp文件用什么打开
|
5月前
|
安全 API Python
详解手机状态查询API实战指南
手机状态查询API是一款高效接口,可实时识别手机号状态(实号、空号、风险号等),帮助企业筛选有效号码,提升业务触达率与客户体验。
600 0
|
消息中间件 存储 监控
MQ线上大规模消息堆积问题处理及使用场景详解
【11月更文挑战第21天】在如今的高并发互联网应用中,消息队列(Message Queue,简称MQ)扮演着至关重要的角色
855 1
|
11月前
|
消息中间件 NoSQL 架构师
招行面试:亿级秒杀,超卖问题+少卖问题,如何解决?(图解+秒懂+史上最全)
45岁资深架构师尼恩在读者交流群中分享了如何系统化解决高并发下的库存抢购超卖少买问题,特别是针对一线互联网企业的面试题。文章详细解析了秒杀系统的四个阶段(扣库预扣、库存扣减、支付回调、库存补偿),并通过Redis分布式锁和Java代码示例展示了如何防止超卖。此外,还介绍了使用RocketMQ延迟消息和xxl-job定时任务解决少卖问题的方法。尼恩强调,掌握这些技术不仅能提升面试表现,还能增强实际项目中的高并发处理能力。相关答案已收入《尼恩Java面试宝典PDF》V175版本,供后续参考。
|
NoSQL 算法 Unix
解决主从架构的redis分布式锁主节点宕机锁丢失的问题
解决主从架构的redis分布式锁主节点宕机锁丢失的问题
479 1
|
Docker 容器
Docker Hub镜像公共仓库使用
这篇文章介绍了如何使用Docker Hub公共仓库进行镜像的创建、上传、下载和管理。
6325 8