如何解决支付接口回调重复,处理业务重复问题?

8 篇文章 0 订阅
1 篇文章 0 订阅

前言

当订单的状态发生改变后,支付宝通常会以异步的方式通知商家服务器。
商家服务器需要返回success这 7 个字符,如果不是,则支付宝则会不断重复通知商家服务器。
微信支付也是如此,必须需要得到商家服务器的正确响应。既然这样,支付回调接口就需要进行幂等性处理。

解决方案

1、什么是幂等?

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

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

1)查看订单是否存在。
2)修改订单状态。
3)如果是支付成功状态,则进行发货。

这种逻辑本身是没有什么问题的,但是它不是一个幂等接口,如果收到好几次订单1001支付成功的请求,则会对订单1001的商品多次发货,这就导致了一个订单多次发货的现象,这种在电商开发时是灾难性的 bug。
因此,我们需要对此回调接口做一个处理,这样即使有很多重复请求都告诉商户服务器订单1001支付成功,商户也只发一次货。

2、如何进行幂等处理

具体实现方式如下:

1)订单表t_order存在订单号1001的订单是未支付状态。
2)支付宝转账成功之后,通知商家服务器订单1001转账成功。
3)商家服务器进行验签。
4)查看订单是否存在,以及基本信息是否一致。
5)修改此订单状态。通过update t_order set 状态=已支付 where order_id=1001 and 状态=未支付
6)通过以上 SQL 乐观锁的思想对发货进行控制,只有 SQL 执行修改成功才进行发货,否则不发货。

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值