error = '很抱歉,当前订单不合法,无法支付'; return false; } if ($this['end_time'] < time()) { $this->error = "很抱歉,预售商品时间已结束"; return false; } if ($this['pay_end_time'] < time()) { $this->error = "很抱歉,超过支付时间"; return false; } $order = OrderModel::detail($this['order_id']); $productList = $order['product']; foreach ($productList as $product) { // 预售商品sku信息 $advanceProductSku = ProductSkuModel::detail($product['sku_source_id'], ['product']); $advanceProduct = $advanceProductSku['product']; // sku是否存在 if (empty($advanceProductSku)) { $this->error = "很抱歉,商品 [{$product['product_name']}] sku已不存在,请重新下单"; return false; } // 判断商品是否下架 if (empty($advanceProduct)) { $this->error = "很抱歉,商品 [{$product['product_name']}] 不存在或已删除"; return false; } // 付款减库存 if ($product['deduct_stock_type'] == DeductStockTypeEnum::PAYMENT && $product['total_num'] > $advanceProductSku['advance_stock']) { $this->error = "很抱歉,商品 [{$product['product_name']}] 库存不足"; return false; } } return true; } /** * 余额支付标记订单已支付 */ public function onPaymentByBalance($orderNo) { // 获取订单详情 $PaySuccess = new FrontPaySuccessService($orderNo); // 发起余额支付 return $PaySuccess->onPaySuccess(OrderPayTypeEnum::BALANCE); } /** * 待支付订单详情 */ public static function getPayDetail($orderNo, $pay_status) { $model = new static(); $model = $model->where('trade_no', '=', $orderNo); if ($pay_status > 0) { $model = $model->where('pay_status', '=', 10); } return $model->with(['user', 'advance', 'orderM'])->find(); } /** * 构建支付请求的参数 */ public static function onOrderPayment($user, $order, $payType, $pay_source) { //如果来源是h5,首次不处理,payH5再处理 // if ($pay_source == 'h5') { // return []; // } if ($payType == OrderPayTypeEnum::WECHAT) { return self::onPaymentByWechat($user, $order, $pay_source); } if ($payType == OrderPayTypeEnum::ALIPAY) { return self::onPaymentByAlipay($user, $order, $pay_source); } return []; } /** * 构建微信支付请求 */ protected static function onPaymentByWechat($user, $order, $pay_source) { return PaymentService::wechat( $user, $order['trade_no'], OrderTypeEnum::FRONT, $pay_source, $order['online_money'], 0 ); } /** * 构建支付宝请求 */ protected static function onPaymentByAlipay($user, $order, $pay_source) { return PaymentService::alipay( $user, $order['trade_no'], OrderTypeEnum::FRONT, $pay_source, $order['online_money'], 0 ); } /** * 订单详情 */ public static function getUserOrderDetail($order_id, $user_id) { $model = new static(); $order = $model->with(['advance', 'orderM.product'])->where(['order_advance_id' => $order_id, 'user_id' => $user_id])->find(); if (empty($order)) { throw new BaseException(['msg' => '订单不存在']); } return $order; } /** * 创建新订单 */ public function OrderPay($params, $order, $user) { $payType = $params['payType']; $payment = ''; $online_money = 0; $order->save(['balance' => 0, 'online_money' => 0, 'trade_no' => $this->orderNo()]); // 余额支付标记订单已支付 if ($params['use_balance'] == 1) { if ($user['balance'] >= $order['pay_price']) { $payType = 10; $order->save(['balance' => $order['pay_price']]); $this->onPaymentByBalance($order['trade_no']); } else { if ($payType <= 10) { $this->error = '用户余额不足'; return false; } $online_money = round($order['pay_price'] - $user['balance'], 2); $order->save(['balance' => $user['balance'], 'online_money' => $online_money]); } } else { if ($payType <= 10) { $this->error = '请选择支付方式'; return false; } $online_money = $order['pay_price']; $order->save(['online_money' => $order['pay_price']]); } $online_money > 0 && $payment = self::onOrderPayment($user, $order, $payType, $params['pay_source']); $result['order_id'] = $order['order_id']; $result['payType'] = $payType; $result['payment'] = $payment; $result['use_balance'] = $params['use_balance']; return $result; } /** * 获取活动订单 * 已付款,未取消 */ public static function getPlusOrderNum($user_id, $product_id) { $model = new static(); return $model->where('user_id', '=', $user_id) ->where('advance_product_id', '=', $product_id) ->where('pay_status', '=', 20) ->where('order_status', '<>', 20) ->count(); } /** * 取消订单 */ public function cancel($user) { if ($this['money_return'] != 1) { $this->error = '订单不允许取消'; return false; } // 订单取消事件 return $this->transaction(function () use ($user) { // 订单是否已支付 $isPay = $this['pay_status']['value'] == OrderPayStatusEnum::SUCCESS; //主商品退回库存 ProductFactory::getFactory($this['orderM']['order_source'])->backProductStock($this['orderM']['product'], $isPay); $data['order_status'] = 20; // 未付款的订单 if ($isPay == true) { // 执行退款操作 (new OrderRefundService)->execute($this); $data['refund_money'] = $this['pay_price']; $data['is_refund'] = 1; } // 更新订单状态 $this['orderM']->save(['order_status' => 20]); return $this->save($data); }); } /** * 设置错误信息 */ protected function setError($error) { empty($this->error) && $this->error = $error; } /** * 是否存在错误 */ public function hasError() { return !empty($this->error); } }