当前位置: 移动技术网 > IT编程>开发语言>PHP > 微信小程序之支付后调用SDK的异步通知及验证处理订单方法

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

2018年01月26日  | 移动技术网IT编程  | 我要评论

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

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网