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

 更新时间:2018年01月02日 14:03:44   作者:myarche  
下面小编就为大家分享一篇微信小程序之支付后调用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的异步通知及验证处理订单方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • php readfile()修改文件上传大小设置

    php readfile()修改文件上传大小设置

    如果文件上传过大就会产生错误,本篇文章主要介绍了php readfile()修改文件上传大小设置,有兴趣的可以了解一下
    2017-08-08
  • PHP中使用extract函数

    PHP中使用extract函数

    这篇文章主要介绍了PHP中使用extract函数,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • thinkphp3.0输出重复两次的解决方法

    thinkphp3.0输出重复两次的解决方法

    这篇文章主要介绍了thinkphp3.0输出重复两次的解决方法,是ThinkPHP2.x用户转3.x经常会遇到的问题,需要的朋友可以参考下
    2014-12-12
  • CI框架简单邮件发送类实例

    CI框架简单邮件发送类实例

    这篇文章主要介绍了CI框架简单邮件发送类,结合完整实例形式分析了邮件发送类的功能定义与具体使用方法,需要的朋友可以参考下
    2016-05-05
  • ThinkPHP进程计数类Process用法实例详解

    ThinkPHP进程计数类Process用法实例详解

    这篇文章主要介绍了ThinkPHP进程计数类Process用法,以实例形式较为详细的分析了Process类的定义及进程计数的实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-09-09
  • PHP如何防止用户重复提交表单

    PHP如何防止用户重复提交表单

    这篇文章主要介绍了PHP如何防止用户重复提交表单,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-12-12
  • thinkPHP批量删除的实现方法分析

    thinkPHP批量删除的实现方法分析

    这篇文章主要介绍了thinkPHP批量删除的实现方法,结合实例形式分析了thinkPHP实现批量删除数据的数据库及模板操作相关技巧,需要的朋友可以参考下
    2016-11-11
  • laravel实现按月或天或小时统计mysql数据的方法

    laravel实现按月或天或小时统计mysql数据的方法

    今天小编就为大家分享一篇laravel实现按月或天或小时统计mysql数据的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-10-10
  • ThinkPHP中pathinfo的访问模式、路径访问模式及URL重写总结

    ThinkPHP中pathinfo的访问模式、路径访问模式及URL重写总结

    这篇文章主要介绍了ThinkPHP中pathinfo的访问模式、路径访问模式及URL重写总结,是ThinkPHP路由访问的基础知识,在ThinkPHP开发中非常重要,需要的朋友可以参考下
    2014-08-08
  • php实现生成验证码实例分享

    php实现生成验证码实例分享

    由于注册的时候常常会用到注册码来防止机器恶意注册,这里我发表一个产生图片验证码的基本图像,很简陋,有需要的小伙伴可以参考下
    2016-04-04

最新评论