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

简介: 在订单的状态发生改变后,支付宝会通过异步方式同志商家服务器。商家服务器需要返回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 主站示例程序
743 0
|
存储
若依框架 --- pdf文件上传预览功能实现
若依框架 --- pdf文件上传预览功能实现
1211 0
LaTeX中定义新命令和环境
LaTeX中定义新命令和环境
1152 0
LaTeX中定义新命令和环境
小知识 .rp文件用什么打开
rp 文件可以通过 Axure8 导入打开,具体方式如下:
5017 0
小知识 .rp文件用什么打开
|
7月前
|
存储 弹性计算 数据库
阿里云服务器购买流程:四种主要购买方式图文教程详解与选择参考
阿里云服务器如何购买?当前阿里云提供了自定义购买、快速购买、通过活动购买和通过镜像市场购买四大主流购买模式,本文将通过图文方式为您展示每种购买方式的具体流程与适用场景,以供选择参考。
|
消息中间件 存储 监控
MQ线上大规模消息堆积问题处理及使用场景详解
【11月更文挑战第21天】在如今的高并发互联网应用中,消息队列(Message Queue,简称MQ)扮演着至关重要的角色
977 1
|
8月前
|
安全 API Python
详解手机状态查询API实战指南
手机状态查询API是一款高效接口,可实时识别手机号状态(实号、空号、风险号等),帮助企业筛选有效号码,提升业务触达率与客户体验。
1062 0
|
9月前
|
消息中间件 监控 Cloud Native
量贩零食上云,原生的最划算
鸣鸣很忙集团作为中国最大的休闲食品饮料连锁零售商,旗下“零食很忙”和“赵一鸣零食”两大品牌已覆盖全国28个省份,门店数量超14000家。通过数字化转型,集团在4年内完成了传统企业10多年的数字化进程,实现了人、货、场的全面数字化管理。借助阿里云的全栈云原生方案,集团构建了弹性计算、大数据分析及智能监控体系,保障日均超430万级交易数据的一致性与稳定性,同时优化IT成本并提升运营效率。
|
算法 Java
JVM进阶调优系列(4)年轻代和老年代采用什么GC算法回收?
本文详细介绍了JVM中的GC算法,包括年轻代的复制算法和老年代的标记-整理算法。复制算法适用于年轻代,因其高效且能避免内存碎片;标记-整理算法则用于老年代,虽然效率较低,但能有效解决内存碎片问题。文章还解释了这两种算法的具体过程及其优缺点,并简要提及了其他GC算法。
 JVM进阶调优系列(4)年轻代和老年代采用什么GC算法回收?