lockKey = ApiRedisKey::payLock($this->userId); } /** * @return array * @throws ContainerExceptionInterface * @throws NotFoundExceptionInterface */ public function handle(): array { if (0 == ($this->redisCache->addLock($this->lockKey,5))) { throw new ErrException('请勿重复点击'); } $this->orderId = (int)$this->request->input('order_id'); $this->orderType = (int)$this->request->input('order_type'); $this->payType = (int)$this->request->input('pay_type'); $this->orderModel = (new OrderTypeFactory)->getPayOrderModel($this->payType); $this->checkOrder(); $this->setPayInfo(); $rechargeService = match ($this->payType) { PayCode::ALIPAY => $this->setAliPayOrder(), PayCode::WECHAT_PAY => $this->setWechatPayOrder(), }; $rechargeService->setConfig(); $rechargeService->setNotify(); $payData = $rechargeService->pay( (float)$this->orderInfo->actual_price, $this->request->input('body','订单支付'), $this->orderInfo->order_no, $this->userId ); $res = [ 'orderId' => $this->orderId, ]; //返回支付数组 match ($this->payType) { PayCode::WECHAT_PAY => $res['weixin'] = $payData, PayCode::ALIPAY => throw new ErrException('暂不开放') }; $this->redisCache->delLock($this->lockKey); return $this->return->success('success', $res); } private function setAliPayOrder(): null { return null; } /** * @return WxJsRechargeOrderService */ private function setWechatPayOrder(): WxJsRechargeOrderService { $rechargeService = new WxJsRechargeOrderService(); if (empty($rechargeService)) { throw new ErrException('充值异常'); } $rechargeService->openId = '123'; return $rechargeService; } /** * @var PayOrder */ #[Inject] protected PayOrder $payOrderModel; /** * @return void */ private function setPayInfo(): void { if (!empty($this->payInfo)) return; $this->payInfo = new PayOrder(); $this->payInfo->user_id = $this->userId; $this->payInfo->order_id = $this->orderId; $this->payInfo->order_type = $this->orderType; $this->payInfo->order_no = $this->orderInfo->order_no; $this->payInfo->pay_money = $this->orderInfo->actual_price; $this->payInfo->recharge_type = $this->payType; $this->payInfo->status = PayCode::WAIT_PAY; $this->payInfo->save(); } /** * @return void */ private function checkOrder(): void { if (empty($this->orderModel)) throw new ErrException('order type不对'); $this->orderInfo = $this->orderModel->where('id',$this->orderId)->first(); if (empty($this->orderInfo)) throw new ErrException('该订单为空'); if ($this->orderInfo->user_id != $this->userId) throw new ErrException('该订单不属于你'); if ($this->orderInfo->status != OrderCode::WAIT_PAY) throw new ErrException('该订单已支付或已取消,请确认后重试'); $this->payInfo = $this->payOrderModel->getInfoByOrderIdAndType($this->orderId,$this->orderType); if (empty($this->payInfo)) return; if ($this->payInfo->status == PayCode::FINISH_PAY) throw new ErrException('该订单已支付,请确认后重试'); if ($this->payInfo->recharge_type != $this->payType) throw new ErrException('该订单调起支付失败'); if ($this->payInfo->order_type != $this->orderType) throw new ErrException('传值错误'); } }