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

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 结合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的安全审计。
相关文章
|
JavaScript 前端开发 测试技术
Angular 与 Node.js 无缝对接简直太牛啦!前后端分离最佳实践,开启高效开发新时代!
【8月更文挑战第31天】随着互联网技术的发展,前后端分离模式日益受到开发者青睐。本文综述了 Angular 与 Node.js 的优势及无缝对接技术,探讨了前后端分离的最佳实践。Angular 以其组件化开发、双向数据绑定等特性成为优秀的前端框架;Node.js 则依靠高并发处理能力和全栈 JavaScript 开发的优势在后端大放异彩。两者结合通过 HTTP 请求实现高效通信,并可通过数据库实现数据共享。此外,文章还强调了接口设计、代码分离、测试及部署等方面的最佳实践,为开发者提供了全面的指导。
444 0
|
关系型数据库 MySQL 数据安全/隐私保护
mysql密码正确但无法连接【彻底解决方案】
mysql密码正确但无法连接【彻底解决方案】
1833 0
mysql密码正确但无法连接【彻底解决方案】
|
存储 移动开发 编解码
html5的新特性详解
HTML5是构建和呈现互联网内容的语言描述方式,HTML5在HTML4的基础上增加了许多新特性,使其更具语义化、更加标准化,同时也提高了用户体验和开发效率。以下是HTML5的部
通用电气 IS200WROBH1A 用于PDIO离散输入/输出模块
通用电气 IS200WROBH1A 用于PDIO离散输入/输出模块
104 0
通用电气 IS200WROBH1A 用于PDIO离散输入/输出模块
|
消息中间件 NoSQL Java
体系化学习Java(面试专题)
tip: 此贴为目录贴,定期更新,一起学习 Java 生态!!! toNew: 时间是最好的答案,它能解决所有问题。坚持!!! 本文章旨在总结 Java 的知识生态以及帮助需要学习者和求职者,本人有5年面试官经验,资深Javaer,有技术相关问题和面试相关问题均可以留言讨论。
223 0
体系化学习Java(面试专题)
|
负载均衡 网络协议 算法
haproxy是干什么的?底层原理是什么?
haproxy是干什么的?底层原理是什么?
577 0
|
存储 索引
使用双指针方法来判断链表是否是一个会问链表
使用双指针方法来判断链表是否是一个会问链表
230 0
使用双指针方法来判断链表是否是一个会问链表
|
SQL 数据库连接 数据库
PB数据库搭建
PB数据库搭建
552 0
PB数据库搭建
|
测试技术
测试思想-测试执行 测试过程中的用例维护
测试思想-测试执行 测试过程中的用例维护
180 0
|
XML 前端开发 JavaScript
Markdown 拓展-Docsify 构建接口文档
优点:使用 markdown 编写,docsify 作为支撑。快速高效,若搭载搜索功能,功能较为完善。且可部署在内网环境。 缺点:不支持直接点击按钮进行 HTTP 请求,需要手动粘贴参数到 POSTMAN 等工具。 Docsify 初始化 & 运行
236 0
Markdown 拓展-Docsify 构建接口文档