
【电商吧 - 2】涨见识!支付回调特有的幂等处理方式
发布日期:2021-05-10 01:14:46
浏览次数:17
分类:精选文章
本文共 773 字,大约阅读时间需要 2 分钟。
文章目录
前言
在订单的状态发生改变后,支付宝会通过异步方式同志商家服务器。商家服务器需要返回success
这7个字符,如果不是,则会不断重复发送。微信也是如此,必须需要商家服务器的正确反馈。既然这样,在回调接口就需要进行幂等处理。
一、什么是幂等?
幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。
细想一下回调接口一般会这样处理:
- 查看订单是否存在。
- 修改订单状态。
- 如果是支付成功状态,则进行发货。
这种逻辑本身是没有什么问题的,但是它不是一个幂等接口,如果收到好几次订单1001
支付成功的请求,则会对订单1001
的商品多次发货,这就导致了一个订单多次发货的现象,这种在电商开发时是灾难性的bug。因此,我们需要对此接口做一个处理,使得即使有很多请求都告诉商户服务器订单1001
支付成功的请求,商户也只发货一次。
二、如何进行幂等处理
对于这种接口的幂等处理,我也是思量许久,最终决定再生使用修改状态的方式。具体实现方式如下:
- 订单表
t_order
存在订单号1001
的订单是未支付
状态。 - 支付宝转账成功,告诉商家服务器订单
1001
的订单转账成功。 - 商家服务器验签。
- 查看订单是否存在,基本信息是否一致。
- 修改此订单状态。通过
update t_order set 状态=已支付 where order_id=1001 and 状态=未支付
- 通过如上sql乐观锁的思想对发货进行控制,只有sql执行的时候有修改成功,则进行发货,修改失败则不发货。
通过乐观锁可以有效的控制发货次数。不管几次回调通知,只有当前订单是未支付状态并且成功修改成已支付状态之后才进行发货。如下图,两个sql一起执行修改订单状态,但是肯定只会有一个sql修改成功。修改成功的线程进行发货即可。

如果思路有什么缺点,或者您还有更好的实现方式,请留言点评。
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2025年04月22日 00时27分25秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
图文追踪PlusToken资产转移行踪(一): BTC部分有1,203个流入交易所
2021-05-09
stm32h743iit6 cubmex 配置QSPI w25128模式问题
2021-05-09
让nginx支持文件上传的几种模式
2021-05-09
快上车!Java技术开发大厂直通车马上启动!
2021-05-09
photon磁力下载工具
2021-05-09
LeetCode 637 二叉树的层平均值-简单
2021-05-09
Java虚拟机结构(内存,类加载器,执行引擎)
2021-05-10
制作横版游戏KillBear第9课:暂停层+屏蔽下层监听
2021-05-10
Redis-day2-五种数据结构类型与数据持久化AOF+RDB
2021-05-10
IOS开发Swif笔记13-初始化
2021-05-10
IOS开发Swift笔记16-错误处理
2021-05-10
【电商吧 - 4】电商场景数值计算那些坑
2021-05-10
Java 天气预报WebService
2021-05-10
Spring中bean的加载过程
2021-05-10
mysql里Date类型的处理
2021-05-10
MySQL索引实现
2021-05-10
redis中RDB和AOF的区别
2021-05-10
内核线程、轻量级进程、用户线程的区别和联系
2021-05-10