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

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
18天前
|
SQL 安全 NoSQL
DMS产品常见问题之DMS提示校验失败如何解决
DMS(数据管理服务,Data Management Service)是阿里云提供的一种数据库管理和维护工具,它支持数据的查询、编辑、分析及安全管控;本汇总集中了DMS产品在实际使用中用户常遇到的问题及其相应的解答,目的是为使用者提供快速参考,帮助他们有效地解决在数据管理过程中所面临的挑战。
单笔转账报错PAYEE_NOT_EXIST(收款账户不存在)-排查方案
报错原因 接口中用户账户参数设置存在问题,导致显示用户收款账户不存在。 排查方案 1、检查payee_account, payee_type是否匹配,如匹配,请检查payee_account是否存在; (1)payee_type设置要求 ALIPAY_USERID:支付宝账号对应的支付宝唯一用户号。
3485 0
|
18天前
|
物联网 API 网络性能优化
MQTT常见问题之没有权限查询如何解决
MQTT(Message Queuing Telemetry Transport)是一个轻量级的、基于发布/订阅模式的消息协议,广泛用于物联网(IoT)中设备间的通信。以下是MQTT使用过程中可能遇到的一些常见问题及其答案的汇总:
|
11月前
|
Linux API PHP
php定时将API中的数据每N分钟同步录入数据库的解决方案
php定时将API中的数据每N分钟同步录入数据库的解决方案
68 0
|
11月前
|
存储 监控 安全
转账通缩功能开发实例源码规则解析
转账通缩功能开发实例源码规则解析
|
缓存 NoSQL Redis
twemproxy安装问题与不支持的操作明细
twemproxy安装问题与不支持的操作明细
79 0
|
Oracle 关系型数据库 MySQL
不用一行代码,用 API 操作数据库,你信吗(上)
数据库的重要性不言而喻,但是数据库操作起来却不容易,需要用到各种管理工具,各种不同的连接方式,如果有方便的,屏蔽不同数据库细节的工具该多好,功夫不负有心人,我还真找了这样一个工具,不仅支持多种数据库,更厉害的是,不用为适配写一行代码,来了解下吧
208 0
不用一行代码,用 API 操作数据库,你信吗(上)
|
JSON 前端开发 API
不用一行代码,用 API 操作数据库,你信吗(下)
数据库的重要性不言而喻,但是数据库操作起来却不容易,需要用到各种管理工具,各种不同的连接方式,如果有方便的,屏蔽不同数据库细节的工具该多好,功夫不负有心人,我还真找了这样一个工具,不仅支持多种数据库,更厉害的是,不用为适配写一行代码,来了解下吧
122 0
|
Web App开发 测试技术 API
记录一次用 curl 测试账户登录服务接口
问题 后台开发服务接口时,经常会用到很多测试工具,比如 Postman、Apipost、Jmeter 等。这些都是带有图形用户界面的工具,有没有一些显得高大上的方法呢?嗯,是有的。 比如今天开发某个账户登陆服务接口时,就想到了先用命令行来测试一下服务接口是否好用。
289 0
|
存储 SQL 关系型数据库
msyql存储过程实现唯一不会重复订单号最佳实践
msyql存储过程实现唯一不会重复订单号最佳实践
274 0
msyql存储过程实现唯一不会重复订单号最佳实践

热门文章

最新文章