结合msyql事务完美实现第三方退款接口示例

本文探讨了在PHP中如何使用MySQL事务确保订单退款操作的原子性。通过示例代码展示了如何在尝试退款前先记录订单日志,如果日志插入失败则回滚事务,否则继续执行退款操作。退款接口调用后,根据返回结果决定是否提交事务。强调了在处理涉及第三方接口的业务逻辑时,应将接口调用放在事务的最后,以避免因后续代码异常导致不期望的事务状态。
摘要由CSDN通过智能技术生成

1.mysql的事务可以实现,要么事务块内代码全部执行,要么全部都不执行。如果都是自己写sql实现,是完全没有任何问题的。

2.如果要实现第三方支付的退款,比如微信支付订单,退款微信支付的金额,那么该怎么实现呢?代码如下

 

 

      // 启动事务

       Db::startTrans();

       try {

            //订单日志

            $order_log['order_sn'] = time();

            $order_log['action_user'] = '前台客户';

            $order_log['action_note'] = '客户取消已付款订单,返还到账户余额';

            $order_log['add_time'] = time();

            $order_log['merchantkeynum'] = "3333";

            $order_log['clientkeynum'] = "4444";

            $log_id = Db::table( 'client_order_log' )->insertGetId( $order_log );

            if(!$log_id){

                throw new \Exception( 'insert  log失败!'); 

            }

 

             //退款操作,如果退款失败,则回滚上面的sql 

            $rt=onecard_refund ("AE2C976E79ABBF1C8BAFB19A3A78723A");

            if($rt['sta']!=1){

                     throw new \Exception( '调用扣款接口失败'.$rt['msg'] ); 

            }

           // 提交事务

           Db::commit();

           echo  "成功!";

       } catch ( \Exception $e ) {

           // 回滚事务

           Db::rollback();

           echo "失败!". $e->getMessage();

       }

3.像订单日志,修改订单状态(示例里面没有)等这些代码块放到退款处理的上面,并且可以根据条件手动抛出异常,为什么要把退款的代码块放到最后呢?原因是如果订单日志代码块失败,则直接到捕获异常里下面的代码就不执行了。如果订单日志执行成功,那么看退款的代码块,如果退款代码块手动抛出了异常,证明退款失败,则整体回滚,如果退款代码块没有异常,则全部提交sql。也就是说这种调用第三方接口的地方一定要放到代码块最底部,如果放到最顶部,会出现,退款接口成功,但是下面的自己业务逻辑代码抛出了异常,导致了所有sql的回滚!最终钱还是退款了~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值