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

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
支付系统40------定时查单-订单未创建,支付宝登陆前在支付宝端创建还是没有创建,不知道,之所以打印警告日志,是因为创建的时候更容易看到它
支付系统40------定时查单-订单未创建,支付宝登陆前在支付宝端创建还是没有创建,不知道,之所以打印警告日志,是因为创建的时候更容易看到它
支付系统35-----支付成功异步通知----数据锁,微信那边是有一个服务器集群的,不单单是有一个通知发送过来,有可能有两台更多台的服务器发送过来,把锁加到我们处理通知里面,在对业务数据进行状态检查和
支付系统35-----支付成功异步通知----数据锁,微信那边是有一个服务器集群的,不单单是有一个通知发送过来,有可能有两台更多台的服务器发送过来,把锁加到我们处理通知里面,在对业务数据进行状态检查和
|
SQL 关系型数据库 MySQL
MySql数据一致性核对MD5脚本 高级命令使用汇总
MySql数据一致性核对MD5脚本 高级命令使用汇总
110 0
|
Linux API PHP
php定时将API中的数据每N分钟同步录入数据库的解决方案
php定时将API中的数据每N分钟同步录入数据库的解决方案
108 0
|
存储 监控 安全
转账通缩功能开发实例源码规则解析
转账通缩功能开发实例源码规则解析
|
存储 SQL 关系型数据库
msyql存储过程实现唯一不会重复订单号最佳实践
msyql存储过程实现唯一不会重复订单号最佳实践
323 0
msyql存储过程实现唯一不会重复订单号最佳实践
|
JSON PHP 数据格式
PHP原生服务端签名生成请求订单信息「orderString」
PHP原生服务端签名生成请求订单信息「orderString」仅供参考 接口文档:[url]https://docs.open.alipay.com/204/105465/[/url] 第一步:配置开发者信息「私钥」And「App_id」 复制代码 * 配置信息 */ // 支付宝分配给开发者的应用ID $app_id=''; // 开发者私钥,为这里填入方便,去头、去尾、去换行 字符串私钥,私钥处理放在签名方法内。
752 12
|
XML 算法 关系型数据库
rds 签名机制事例及补充说明
本篇主要是对官网rds签名机制的补充说明,以简单的代码实例来解释下每个步骤的含义,尽量会按照官方文档的描述举例
rds 签名机制事例及补充说明
|
安全
云支付商户授权报错“授权回调处理失败,请确认”-排查方案
云支付商户授权报错“授权回调处理失败,请确认”-排查方案
1836 0
云支付商户授权报错“授权回调处理失败,请确认”-排查方案
创建、修改门店接口常见错误返回
1、Q:创建店铺场景下营业执照主体信息不一致        A:营业执照的名称和支付宝实名认证名称不一样,确保一致,需要上传授权涵。  2、Q:支付接口如果store_id和alipay_store_id都传了,支付宝会验证这两个参数的合法性吗?        A:均会进行检测两者是否匹配。
771 0