*/ public static function statusValues(): array { return [ null => '-', self::PENDING => __('Pending'), self::PAID => __('Paid'), self::FAILED => __('Cancelled'), ]; } /** * Tailwind * * @return array */ public static function statusClasses(): array { return [ null => '-', self::PENDING => 'warning', self::PAID => 'success', self::FAILED => 'danger', ]; } /** * Status icons * * @return array */ public static function statusIcons(): array { return [ null => '-', 'success' => 'check-circle', 'info' => 'information-circle', 'primary' => 'clipboard-list', 'danger' => 'ban', 'warning' => 'exclamation-circle', ]; } /** * Set price */ public function getPrice(int|float|string $price): string { return number_format(floatval($price), 2, '', ''); } /** * Pay card order * * @param mixed $resource * @return array */ public function payCardOrder(mixed $resource): array { $orderNumber = $this->generateOrderNumber($resource); $paymentResponse = Http::get('https://mpi.gov.tm/payment/rest/register.do', [ 'orderNumber' => $orderNumber, 'amount' => $this->getPrice($resource->priceAmount()), 'currency' => 934, 'language' => 'ru', 'userName' => $resource->branch->billing_username, 'password' => $resource->branch->billing_password, 'returnUrl' => route('online-payment-store'), 'pageView' => 'DESKTOP', 'description' => 'Kart tölegi', ])->onError(function ($response) { Log::channel('halkbank_payment_error') ->error('Payment error', [ 'response' => [ 'body' => $response->body(), ], ]); }); if ($paymentResponse->failed()) { return [ 'status' => 'failed', 'url' => '', ]; } $onlinePaymentHistory = new OnlinePaymentHistory; $onlinePaymentHistory->online_paymantable_id = $resource->id; $onlinePaymentHistory->online_paymantable_type = $resource::$model; $onlinePaymentHistory->amount = $resource->priceAmount(); $onlinePaymentHistory->orderNumber = $orderNumber; $onlinePaymentHistory->description = 'Kart tölegi'; $onlinePaymentHistory->orderId = $paymentResponse['orderId']; $onlinePaymentHistory->formUrl = $paymentResponse['formUrl']; $onlinePaymentHistory->successUrl = route('online-payment-store'); $onlinePaymentHistory->errorUrl = route('online-payment-store'); $onlinePaymentHistory->api_client = 'billing_username'; $onlinePaymentHistory->username = $resource->branch->billing_username; $onlinePaymentHistory->paymentStatus = self::PENDING; $onlinePaymentHistory->save(); return [ 'status' => 'success', 'url' => $paymentResponse['formUrl'], ]; } /** * Generate order number for payment */ public function generateOrderNumber(mixed $resource): string { return date('dmyHis'); } /** * Status view */ public static function statusView(): string { return 'orders.cards.online-payment.status'; } public static function checkPayment(Request $request) { // Find order from history $paymentHistory = OnlinePaymentHistory::where('orderId', $request->orderId)->first(); // Find related resource $resource = VisaMasterPaymentOrderItem::where('online_payment_history_id', $paymentHistory->id)->first(); // If resource could not be found or does not exist, then inform it via logs if (! $resource) { static::logResourceNotFound($request, $paymentHistory); return static::resourceNotFound(); } $resource->load('branch'); $response = Http::asForm()->post('https://mpi.gov.tm/payment/rest/getOrderStatus.do', [ 'language' => 'ru', 'orderId' => $request->orderId, 'userName' => $resource->branch->billing_visa_master_username, 'password' => $resource->branch->billing_visa_master_password, ]); $payment_status = $response['ErrorCode'] == '0'; if ($payment_status) { $resource->update([ 'paid' => true, ]); $paymentHistory->update([ 'paymentStatus' => OnlinePaymentRepo::PAID, ]); } else { $paymentHistory->update([ 'paymentStatus' => OnlinePaymentRepo::FAILED, ]); } return [ 'success' => $payment_status, 'title' => $payment_status ? __('Payment is successful') : __('Payment has failed'), 'pnr' => $paymentHistory->orderNumber, 'branch_name' => $resource->branch->name, 'price_amount' => $paymentHistory->amount, 'return_url' => $resource->panelUrl('index'), ]; } protected static function logResourceNotFound($request, $paymentHistory): void { Log::channel('halkbank_payment_check_error') ->error('Related resource not found', [ 'orderId' => $request->orderId, 'onlinePaymentHistory_id' => $paymentHistory->id, 'related_resource' => [ 'type' => $paymentHistory->online_paymantable_type, 'id' => $paymentHistory->online_paymantable_id, ], ]); } protected static function resourceNotFound(): array { return [ 'success' => false, 'title' => __('Payment has failed').' '.'(RESOURCE NOT FOUND)', 'pnr' => '', 'branch_name' => '', 'price_amount' => '', 'return_url' => url('/'), ]; } }