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

控制器中如下:

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

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

分享到: