찾다

 >  Q&A  >  본문

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

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

高洛峰高洛峰2784일 전668

모든 응답(4)나는 대답할 것이다

  • 伊谢尔伦

    伊谢尔伦2017-04-10 16:10:14

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

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

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

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

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

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

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

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

    회신하다
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-10 16:10:14

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

    회신하다
    0
  • 怪我咯

    怪我咯2017-04-10 16:10:14

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

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

    회신하다
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-10 16:10:14

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

    회신하다
    0
  • 취소회신하다