欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-29 12:38:10
小程序之后的异步验证和订单处理

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

<?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的异步通知及验证处理订单方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。