欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

mysql - 支付宝及时付款怎么用php事务处理

程序员文章站 2024-01-25 08:19:10
...
如果支付宝付款成功,而数据库插入记录失败了,怎么用事务进行回滚,

回复内容:

如果支付宝付款成功,而数据库插入记录失败了,怎么用事务进行回滚,

以异步通知的支付宝实时到账的SDK支付接口为例,做的时间有点久了,和支付宝交互的过程可能说的不是非常正确,不过不影响处理逻辑:

  1. 支付宝向你的notify_url发起一个post请求,其中包括了各种订单信息和当前的付款状态作为参数

  2. 收到请求后你应该要对此请求进行校验(验签)

  3. 如果一切正常,你开始调用PDO的beginTransaction开启事务写入

  4. 对你的数据库进行正常的操作

  5. 操作的过程中如果有任何异常,自行捕获,调用PDO的rollback进行回滚,然后返回支付宝非success字符串(或者空)

  6. 如果一切正常,调用PDO的commit提交事务,然后返回支付宝success的结果

注意,如果你这里没有正确结束,永远不要向支付宝的异步通知请求返回"success"成功的结果,对于异常的情况支付宝会重复调用7次通知

插入失败就告诉支付宝失败了,支付宝会一直发回调过来,你总有一次插入成功的。

这个问题其实本质上是一个分布式事务的问题,更通用一些的问题是的:
如何保证两个不同系统间数据的一致性?

目前个人感觉比较好的方法是采用消息的方式,通过可靠的消息中间件,将一个大的事务操作,拆分为多个小的本地事务,通过最终一致的方式实现ACID

无法回滚,一个是支付宝接口,一个是本地数据库操作