加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_韶关站长网 (https://www.0751zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2023-02-18 13:30:04 所属栏目:PHP教程 来源:
导读:  小程序之后的异步验证和订单处理

  namespace app\api\service;
  use app\api\model\Product;
  use app\lib\enum\OrderStatusEnum;
  use think\Db;
  use think\Exception;
  use think
  小程序之后的异步验证和订单处理
 
  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]);
  }
  }
 
  控制器中如下:
 
  handle(); }
  以上这篇微信小程序之支付后调用SDK的异步通知及验证处理订单方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持编程之家。
 

(编辑:云计算网_韶关站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!