当前位置:首页 > PHP教程 > php应用 > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2021-08-26 10:25:30 浏览: 评论:0 

下面小编就为大家分享一篇微信小程序之支付后调用SDK的异步通知及验证处理订单方法,具有很好的参考价值,希望对大家有所帮助。

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

  1. <?php 
  2. /** 
  3.  * Created by YuanPan. 
  4.  * User: YuanPan 
  5.  * Date: 2017/12/21 
  6.  * Time: 15:15 
  7.  */ 
  8.  
  9. namespace app\api\service; 
  10.  
  11. use app\api\model\Product; 
  12. use app\lib\enum\OrderStatusEnum; 
  13. use think\Db; 
  14. use think\Exception; 
  15. use think\Loader; 
  16. use app\api\model\Order; 
  17.  
  18. //在这里依然引入WxPay.API.php即可完成引入 
  19. Loader::import('WxPay.WxPay',EXTEND_PATH,'.Api.php'); 
  20.  
  21. class WxNotify extends \WxPayNotify 
  22.   //继承了父类,所以直接重写方法 
  23.   public function NotifyProcess($data, &$msg
  24.   { 
  25.     //如果返回支付成功信息 
  26.     if($data['return_code'] = 'SUCCESS'){ 
  27.       $orderNo = $data['out_trade_no']; 
  28.       Db::startTrans(); 
  29.       try 
  30.       { 
  31.         //判断订单状态 
  32.         //在这里可以进行对数据库进行所机制 
  33.         //简单说,当一个执行sql语句的事务想要操作表记录之前,先向数据库发出请求,对你访问的记录集加锁 
  34.         //在这个事务释放这个锁之前,其他事务不能对这些数据进行更新操作 
  35.         Order::where(['order_no'=>$orderNo])->lock(true)->find(); 
  36. //        $order = Order::get(['order_no'=>$orderNo]); 
  37.         //如果未支付 
  38.         if ($order->status == 1) { 
  39.           $service = new \app\api\service\Order(); 
  40.           //查询到该订单号的商品和库存量信息 
  41.           $stockStatus = $service->checkOrderStock($order->id); 
  42.           //如果库存量有,更新订单状态,以及减去商品库存 
  43.           if ($stockStatus['pass']) { 
  44.             $this->updateOrderStatus($order->id, true); 
  45.             $this->reduceStock($stockStatus); 
  46.             //如果没有库存,订单状态修改为已支付,但订单未处理 
  47.           } else { 
  48.             $this->updateOrderStatus($order->id, false); 
  49.           } 
  50.         } 
  51.         Db::commit(); 
  52.         //返回给微信 
  53.         return true; 
  54.       }catch (Exception $e){ 
  55.         Db::rollback(); 
  56.         return fasle; 
  57.       } 
  58.     }else
  59.       //如果微信返回失败的处理信息,那我们这里依然返回true,向微信表明态度 
  60.       return true; 
  61.     } 
  62.   } 
  63.  
  64.   //支付成功,减去商品库存 
  65.   private function reduceStock($stockStatus
  66.   { 
  67.     //遍历减去 
  68.     foreach ($stockStatus['pStatusArray'as $v) { 
  69.       //使用tp5的setDec方法 
  70.       Product::where(['id'=>$v['id']])->setDec('stock',$v['count']); 
  71.     } 
  72.   } 
  73.  
  74.   //success为真,则订单修改为PAID,如果为假则修改为已支付,但订单未处理的状态,对应枚举信息修改 
  75.   private function updateOrderStatus($orderID,$success
  76.   { 
  77.     $status = $success?OrderStatusEnum::PAID:OrderStatusEnum::PAID_BUT_OUT_OF; 
  78.     Order::where(['id'=>$orderID])->update(['status'=>$status]); 
  79.   } 

控制器中如下:

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

Tags: 微信小程序支付 SDK异步通知

分享到: