relatedModel = $relatedModel; } /** * Status Values * * @return array */ public static function statusValues(): array { return [ null => '-', self::PENDING => __('Pending'), self::PAID => __('Paid'), self::FAILED => __('Cancelled'), ]; } /** * Generate order number for payment */ public function generateOrderNumber(): string { return date('dmyHis'); } /** * Payment provder */ public function paymentProvider(PaymentProviderContract $provider): self { $this->provider = $provider; return $this; } /** * If payment has been successfull */ public function successful(): bool { return $this->successful; } /** * If payment has been a failure */ public function failed(): bool { return $this->failed; } /** * Set respond results */ public function setResponseResults(bool $result): void { $this->successful = $result; $this->failed = ! $result; } /** * Send request via provider */ public function sendRequest(): self { $this->response = $this->provider->sendRequest(); $this->failed = $this->response->failed(); $this->successful = $this->response->successful(); if ($this->response['errorCode'] != 0) { $this->setResponseResults(false); } if ($this->successful) { $this->orderId = string($this->response['orderId']); $this->paymentLink = string($this->response['formUrl']); $this->createHistory(); } return $this; } /** * Check payment */ public function checkPayment(string $orderId) { // Find payment order from history $paymentHistory = OnlinePayment::where('orderId', $orderId)->first(); // Find related resource $resource = (new $paymentHistory->online_paymantable_type)->find(id: $paymentHistory->online_paymantable_id); // If resource could not be found or does not exist, then inform it via logs if (! $resource) { return [ 'success' => false, 'title' => __('Payment has failed').' '.'(RESOURCE NOT FOUND)', 'pnr' => '', 'branch_name' => '', 'price_amount' => '', 'return_url' => url('/'), 'bank_branch' => null, 'resource' => null, 'paymentHistory' => null, ]; } $resource->load('branch'); $bank_branch = $resource->branch; if (! $bank_branch) { return [ 'success' => false, 'title' => __('Payment has failed').' '.'(BRANCH NOT FOUND)', 'pnr' => '', 'branch_name' => '', 'price_amount' => '', 'return_url' => url('/'), 'bank_branch' => null, 'resource' => null, 'paymentHistory' => null, ]; } try { $response = Http::asForm()->post('https://mpi.gov.tm/payment/rest/getOrderStatus.do', [ 'language' => 'ru', 'orderId' => $orderId, 'userName' => $bank_branch->billing_username, 'password' => $bank_branch->billing_password, ]); } catch (Exception $e) { return [ 'success' => false, 'title' => __('Payment has failed').' '.'(REQUEST FAILURE)', 'pnr' => '', 'branch_name' => '', 'price_amount' => '', 'return_url' => url('/'), 'bank_branch' => null, 'resource' => null, 'paymentHistory' => null, ]; } $payment_status = $response['ErrorCode'] == '0'; $returnURL = '/'; if ($payment_status) { $resource->update([ 'paid' => true, ]); $paymentHistory->update([ 'paymentStatus' => OnlinePaymentRepository::PAID, ]); return [ 'success' => true, 'title' => __('Payment is successful'), 'pnr' => $paymentHistory->orderNumber, 'branch_name' => $bank_branch->name, 'price_amount' => $paymentHistory->amount.' TMT', 'return_url' => $returnURL, 'bank_branch' => $bank_branch, 'resource' => $resource, 'paymentHistory' => $paymentHistory, 'response' => $response, ]; } $paymentHistory->update([ 'paymentStatus' => OnlinePaymentRepository::FAILED, ]); return [ 'success' => false, 'title' => __('Payment has failed'), 'pnr' => $paymentHistory->orderNumber, 'branch_name' => $bank_branch->name, 'price_amount' => $paymentHistory->amount.' TMT', 'return_url' => $returnURL, 'paymentHistory' => $paymentHistory, 'bank_branch' => $bank_branch, 'response' => $response, ]; } /** * Payment link */ public function paymentLink(): string { return $this->paymentLink; } /** * Create online payment history */ public function createHistory(): void { $data = [ 'amount' => $this->provider->amount(), 'orderNumber' => $this->provider->orderNumber(), 'description' => $this->provider->description(), 'orderId' => $this->orderId, 'formUrl' => $this->paymentLink, 'successUrl' => $this->provider->returnUrl(), 'errorUrl' => $this->provider->returnUrl(), 'username' => $this->provider->username(), 'paymentStatus' => self::PENDING, ]; if ($this->relatedModel) { $data['online_paymantable_id'] = $this->relatedModel->id; // @phpstan-ignore-line $data['online_paymantable_type'] = $this->relatedModel::class; } OnlinePayment::create($data); } /** * Show payment status */ public function paymentStatusView(array $data): View { info($data); return view('module.online-payment::payment-status', compact('data')); } }