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

  • 内容
  • 评论
  • 相关

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的回滚!最终钱还是退款了~


本文标签:

版权声明:若无特殊注明,本文皆为《菜鸟站长》原创,转载请保留文章出处。

本文链接:结合msyql事务完美实现第三方退款接口示例 - https://wlphp.com/?post=274

发表评论

电子邮件地址不会被公开。 必填项已用*标注