首先新建控制器Pay继承基础控制器 { // 前置方法 protected $beforeActionList = [ 'checkExclusiveScope'=>['only'=>'getPreOrder'] ]; // 新建方法getPreOrder($id='') { // 传递一个能够代替用户订单的消息 // 验证id是否是正整数 } } 在service 里面建立Pay { // 定义成员变量 private $orderID; private $orderNO; // 定义构建函数 function __construct($orderID) { // 判断id不能为空 if(!$orderID) { } } // 引用微信的SDK // extend/WxPay/WxPay.Api.php Loader::import('WxPay.WxPay',EXTEND_PATH,'.Api.php') // 定义支付主方法 Pay() { // 检查库存的 核心方法是 getOrderStatus() 需要的参数是oProduct 和 Product 在Order里面新建一个方法接收 $orderID 在service 里面创建pay方法 { // 订单号 可能根本就 不存在 // 订单号和当前用户不匹配 // 订单 是否已经被支付了 // 进行库存量 检查 $orderService = new Order(); $orderService->checkOrderStock($this->orderID); if($status['pass']){ return $status; } return $this->makeWxPreOrder($status['orderPrice']); } // 微信 预订单 生成 private function makeWxPreOrder() { // 代表用户的openID $openid = Token::getCurrentTokenVar('openid'); if(!$openid){ throw new TokenException(); } // 新建一个对象 实例化 统一下单对象 $wxOrderData = new \WxPayUnifiedOrder(); // 把参数赋值给新建的这个对象,然后调用这个对象的方法,传递给微信的服务器 $wxOrderData->SetOut_trade_no($this->orderNO); $wxOrderData->SetTrade_type('JSAPI'); $wxOrderData->SetTotal_fee($totalPrice*100); $wxOrderData->SetBody('食品小吃'); $wxOrderData->SetOpenid($openid); // 微信 回调地址 $wxOrderData->SetNotify_url(''); return $this->getPaySignature($wxOrderData); } // 发送 微信预定义 订单 private function getPaySignature($wxOrderData) { // 微信 接口 调用 $wxOrder = \WxPayApi::unifiedOrder($wxOrderData); if($wxOrder['return_code']!='SUCCESS'|| $wxOrder['result_code']!='SUCCESS'){ Log::record($wxOrder,'error'); Log::record('获取预支付订单失败','error'); } $this->recordPreOrder($wxOrder); return null; } // 定义一个校验签名的函数 sign() private function sign($wxOrder) { $jsApiPayData = new \WxPayJsApiPay(); // 传入appID $jsApiPayData->SetAppid(config('wx.app_id')); $jsApiPayData-> } // 更新订单表 加入prepay_id private function recordPreOrder($wxOrder) { OrderModel::where('id','=',$this->orderID) ->update(['prepay_id'=>$wxOrder['prepay_id']]); } private function checkOrderValid() { $order = OrderModel::where() ->find(); if(!$order){ throw new OrderException(); } // 判断订单号的的用户ID是否和内存中的ID一致 $oID = $order->user_id; $uID = Token::getCurrentTokenVar("uid"); if($oID!=$uID){ throw new TokenException([ 'msg'=>'订单与用户不匹配', 'errorCode'=>10003 ]); } // 判断用户是否已经支付 if($order->status>OrderStatusEnum::UNPAID){ throw new OrderException([ 'msg'=>'订单已经支付过了', 'errorCode'=>80003, 'code'=>400 ]); } $order-> return } 在Order 里面新建 checkOrderStock($orderID) { $oProducts = OrderProduct::where('order_id','=',$orderID) ->select(); $this->oProducts = $oProducts; $this->products = $this->getProductsByOrder(); } } }
微信支付流程介绍
最新推荐文章于 2022-09-28 14:03:03 发布
