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

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

相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
相关文章
|
Java Docker 容器
Java Exception异常信息怎么打印、记录,几种方式自己选
Java Exception异常信息怎么打印、记录,几种方式自己选
1175 0
Java Exception异常信息怎么打印、记录,几种方式自己选
|
4月前
|
存储 消息中间件 API
订单退款自动化接口:高效处理退款流程的技术实现
本文介绍如何设计并实现高效的订单退款自动化接口,基于RESTful API与Python Flask框架,涵盖核心流程、关键技术、代码示例及最佳实践,提升电商系统退款效率与准确性。
405 0
|
JavaScript 前端开发 测试技术
Angular 与 Node.js 无缝对接简直太牛啦!前后端分离最佳实践,开启高效开发新时代!
【8月更文挑战第31天】随着互联网技术的发展,前后端分离模式日益受到开发者青睐。本文综述了 Angular 与 Node.js 的优势及无缝对接技术,探讨了前后端分离的最佳实践。Angular 以其组件化开发、双向数据绑定等特性成为优秀的前端框架;Node.js 则依靠高并发处理能力和全栈 JavaScript 开发的优势在后端大放异彩。两者结合通过 HTTP 请求实现高效通信,并可通过数据库实现数据共享。此外,文章还强调了接口设计、代码分离、测试及部署等方面的最佳实践,为开发者提供了全面的指导。
594 0
|
Java
SpringBoot下国际化配置
SpingBoot实现国际化配置步骤
2311 0
SpringBoot下国际化配置
|
存储 移动开发 编解码
html5的新特性详解
HTML5是构建和呈现互联网内容的语言描述方式,HTML5在HTML4的基础上增加了许多新特性,使其更具语义化、更加标准化,同时也提高了用户体验和开发效率。以下是HTML5的部
|
IDE Java 开发工具
灵活配置 Spring 集合:List、Set、Map、Properties 详解
使用<property>标签的value属性配置原始数据类型和ref属性配置对象引用的方式来定义Bean配置文件。这两种情况都涉及将单一值传递给Bean
622 1
|
XML Java 数据格式
SpringMVC中类型转换器Converter<S,T>详解
SpringMVC中类型转换器Converter<S,T>详解
855 1
|
负载均衡 定位技术 Nacos
Nacos 高级玩法:深入探讨分布式配置和服务发现
Nacos 高级玩法:深入探讨分布式配置和服务发现
1108 0