• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    微信小程序之支付后调用SDK的异步通知及验证处理订单方法

    小程序之后的异步验证和订单处理

    ?php
    /**
     * Created by YuanPan.
     * User: YuanPan
     * Date: 2017/12/21
     * Time: 15:15
     */
    
    namespace app\api\service;
    
    use app\api\model\Product;
    use app\lib\enum\OrderStatusEnum;
    use think\Db;
    use think\Exception;
    use think\Loader;
    use app\api\model\Order;
    
    //在这里依然引入WxPay.API.php即可完成引入
    Loader::import('WxPay.WxPay',EXTEND_PATH,'.Api.php');
    
    class WxNotify extends \WxPayNotify
    {
      //继承了父类,所以直接重写方法
      public function NotifyProcess($data, $msg)
      {
        //如果返回支付成功信息
        if($data['return_code'] = 'SUCCESS'){
          $orderNo = $data['out_trade_no'];
          Db::startTrans();
          try
          {
            //判断订单状态
            //在这里可以进行对数据库进行所机制
            //简单说,当一个执行sql语句的事务想要操作表记录之前,先向数据库发出请求,对你访问的记录集加锁
            //在这个事务释放这个锁之前,其他事务不能对这些数据进行更新操作
            Order::where(['order_no'=>$orderNo])->lock(true)->find();
    //        $order = Order::get(['order_no'=>$orderNo]);
            //如果未支付
            if ($order->status == 1) {
              $service = new \app\api\service\Order();
              //查询到该订单号的商品和库存量信息
              $stockStatus = $service->checkOrderStock($order->id);
              //如果库存量有,更新订单状态,以及减去商品库存
              if ($stockStatus['pass']) {
                $this->updateOrderStatus($order->id, true);
                $this->reduceStock($stockStatus);
                //如果没有库存,订单状态修改为已支付,但订单未处理
              } else {
                $this->updateOrderStatus($order->id, false);
              }
            }
            Db::commit();
            //返回给微信
            return true;
          }catch (Exception $e){
            Db::rollback();
            return fasle;
          }
        }else{
          //如果微信返回失败的处理信息,那我们这里依然返回true,向微信表明态度
          return true;
        }
      }
    
      //支付成功,减去商品库存
      private function reduceStock($stockStatus)
      {
        //遍历减去
        foreach ($stockStatus['pStatusArray'] as $v) {
          //使用tp5的setDec方法
          Product::where(['id'=>$v['id']])->setDec('stock',$v['count']);
        }
      }
    
      //success为真,则订单修改为PAID,如果为假则修改为已支付,但订单未处理的状态,对应枚举信息修改
      private function updateOrderStatus($orderID,$success)
      {
        $status = $success?OrderStatusEnum::PAID:OrderStatusEnum::PAID_BUT_OUT_OF;
        Order::where(['id'=>$orderID])->update(['status'=>$status]);
      }
    }

    控制器中如下:

      public function receiveNotify()
      {
        //1:检查库存量防止超卖
        //2:更新status状态
        //3:减库存
        //如果成功处理,返回成功处理信息,否则返回没有成功处理信息
        $notify = new WxNotify();
        $notify->handle();
      }

    以上这篇微信小程序之支付后调用SDK的异步通知及验证处理订单方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

    您可能感兴趣的文章:
    • 微信小程序中使用Async-await方法异步请求变为同步请求方法
    • 详解将微信小程序接口Promise化并使用async函数
    • 微信小程序 缓存(本地缓存、异步缓存、同步缓存)详解
    • 详解微信小程序 同步异步解决办法
    • 微信小程序异步处理详解
    • 微信小程序 wx.request方法的异步封装实例详解
    • 微信小程序onLaunch异步,首页onLoad先执行?
    • 微信小程序中使用ECharts 异步加载数据的方法
    • 微信小程序中使用Promise进行异步流程处理的实例详解
    • 微信小程序 es6-promise.js封装请求与处理异步进程
    • 微信小程序利用co处理异步流程的方法教程
    • 微信小程序中使用 async/await的方法实例分析
    上一篇:thinkphp5上传图片及生成缩略图公共方法(分享)
    下一篇:PHP 使用Echarts生成数据统计报表的实现代码
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    微信小程序之支付后调用SDK的异步通知及验证处理订单方法 微信,小,程序,之,支付,后,