diff --git a/app/Modules/HalkbankOnlinePayment/Controllers/HalkbankOnlinePaymentController.php b/app/Modules/HalkbankOnlinePayment/Controllers/HalkbankOnlinePaymentController.php index 03e8fa5..33aeed9 100644 --- a/app/Modules/HalkbankOnlinePayment/Controllers/HalkbankOnlinePaymentController.php +++ b/app/Modules/HalkbankOnlinePayment/Controllers/HalkbankOnlinePaymentController.php @@ -3,7 +3,6 @@ namespace App\Modules\HalkbankOnlinePayment\Controllers; use App\Http\Controllers\Controller; -use App\Modules\CardOrder\Models\CardOrder; use App\Modules\HalkbankOnlinePayment\Repositories\HalkbankOnlinePaymentRepository; use App\Modules\OnlinePayment\Repositories\OnlinePaymentRepository; use Illuminate\Contracts\View\View; @@ -22,13 +21,6 @@ class HalkbankOnlinePaymentController extends Controller $paymentStatus = $onlinePaymentRepository->checkPayment($request->string('orderId')); - return $onlinePaymentRepository->paymentStatusView([ - 'success' => $paymentStatus['success'], - 'title' => __('Payment has failed'), - 'pnr' => $paymentStatus['paymentHistory']->orderNumber, - 'branch_name' => $paymentStatus['bank_branch']->name, - 'price_amount' => $paymentStatus['paymentHistory']->amount.' TMT', - 'return_url' => $paymentStatus['return_url'], - ]); + return $onlinePaymentRepository->paymentStatusView($paymentStatus); } } diff --git a/app/Modules/HalkbankOnlinePayment/Repositories/HalkbankOnlinePaymentRepository.php b/app/Modules/HalkbankOnlinePayment/Repositories/HalkbankOnlinePaymentRepository.php index 573a907..823ca64 100644 --- a/app/Modules/HalkbankOnlinePayment/Repositories/HalkbankOnlinePaymentRepository.php +++ b/app/Modules/HalkbankOnlinePayment/Repositories/HalkbankOnlinePaymentRepository.php @@ -56,6 +56,7 @@ class HalkbankOnlinePaymentRepository implements PaymentProviderContract Log::channel('halkbank_payment_error') ->error('Payment error', [ 'response' => [ + 'title' => 'REGISTER', 'error' => $e->getMessage(), 'file_line' => $e->getFile().':'.$e->getLine(), ], @@ -71,9 +72,39 @@ class HalkbankOnlinePaymentRepository implements PaymentProviderContract return $paymentResponse; } - public function checkPayment() + public function checkPayment(string $orderId): Response { - // ... + try { + $paymentCheckResponse = Http::asForm()->post('https://mpi.gov.tm/payment/rest/getOrderStatus.do', [ + 'language' => 'ru', + 'orderId' => $orderId, + 'userName' => $this->username, + 'password' => $this->password, + ]); + } catch (Exception $e) { + Config::set('logging.channels.halkbank_payment_error', [ + 'driver' => 'single', + 'path' => storage_path('logs/halkbank_payment_error.log'), + 'level' => 'debug', + ]); + + Log::channel('halkbank_payment_error') + ->error('Payment error', [ + 'response' => [ + 'title' => 'CHECKING', + 'error' => $e->getMessage(), + 'file_line' => $e->getFile().':'.$e->getLine(), + ], + ]); + + return new Response(new GuzzleResponse( + 503, + ['Content-Type' => 'application/json'], + sprintf('{"ErrorCode":"99","ErrorMessage":"%s"}', $e->getMessage()) + )); + } + + return $paymentCheckResponse; } /** diff --git a/app/Modules/OnlinePayment/Contracts/PaymentProviderContract.php b/app/Modules/OnlinePayment/Contracts/PaymentProviderContract.php index de6ca72..494c691 100644 --- a/app/Modules/OnlinePayment/Contracts/PaymentProviderContract.php +++ b/app/Modules/OnlinePayment/Contracts/PaymentProviderContract.php @@ -8,6 +8,8 @@ interface PaymentProviderContract { public function sendRequest(): Response; + public function checkPayment(string $orderId): Response; + public function orderNumber(): int|string; public function amount(): int|float|string; @@ -17,4 +19,8 @@ interface PaymentProviderContract public function returnUrl(): string; public function username(): string; + + public function setUsername(string $username): self; + + public function setPassword(string $password): self; } diff --git a/app/Modules/OnlinePayment/Repositories/OnlinePaymentRepository.php b/app/Modules/OnlinePayment/Repositories/OnlinePaymentRepository.php index 701966c..3d817a3 100644 --- a/app/Modules/OnlinePayment/Repositories/OnlinePaymentRepository.php +++ b/app/Modules/OnlinePayment/Repositories/OnlinePaymentRepository.php @@ -5,11 +5,9 @@ namespace App\Modules\OnlinePayment\Repositories; use App\Modules\Makeable; use App\Modules\OnlinePayment\Contracts\PaymentProviderContract; use App\Modules\OnlinePayment\Models\OnlinePayment; -use Exception; use Illuminate\Contracts\View\View; use Illuminate\Database\Eloquent\Model; use Illuminate\Http\Client\Response; -use Illuminate\Support\Facades\Http; class OnlinePaymentRepository { @@ -157,107 +155,43 @@ class OnlinePaymentRepository */ public function checkPayment(string $orderId) { - // Find payment order from history + /** @var \App\Modules\OnlinePayment\Models\OnlinePayment 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); + /** @var \App\Modules\CardOrder\Models\CardOrder Find related resource */ + $relatedResource = (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, - ]; + // Check if resource could not be found or does not exist + if (! $relatedResource) { + return $this->paymentFailed('(RESOURCE NOT FOUND)'); } - $resource->load('branch'); + $relatedResource->load('branch'); - $bank_branch = $resource->branch; + /** @var \App\Modules\Branch\Models\Branch */ + $bankBranch = $relatedResource->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, - ]; + if (! $bankBranch) { + return $this->paymentFailed('(BRANCH NOT FOUND)'); } - 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, - ]; + $this->provider->setUsername($bankBranch->billing_username); + $this->provider->setPassword($bankBranch->billing_password); + $response = $this->provider->checkPayment($orderId); + + if ($response['ErrorCode'] == '99') { + return $this->paymentFailed('(REQUEST FAILURE)'); } $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, - ]; + return $this->paymentSuccessful($relatedResource, $paymentHistory, $bankBranch); } - $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, - ]; + return $this->paymentFailed( + title: __('Payment has failed'), + ); } /** @@ -293,8 +227,65 @@ class OnlinePaymentRepository OnlinePayment::create($data); } + public function paymentSuccessful($relatedResource, $paymentHistory, $bankBranch): array + { + $relatedResource->update([ + 'paid' => true, + ]); + + $paymentHistory->update([ + 'paymentStatus' => OnlinePaymentRepository::PAID, + ]); + + return $this->paymentCheckResponseTemplate( + success: true, + pnr: $paymentHistory->orderNumber, + branch_name: $bankBranch->name, + price_amount: $paymentHistory->amount.' TMT' + ); + } + + /** + * Failed payment + */ + public function paymentFailed(string $title = '', $paymentHistory = null): array + { + if ($paymentHistory) { + $paymentHistory->update([ + 'paymentStatus' => OnlinePaymentRepository::FAILED, + ]); + } + + return $this->paymentCheckResponseTemplate(false, $title); + } + + /** + * Check payment response + * + * @return array{success: bool, title: string, pnr: string, branch_name: string, price_amount: string, return_url: string} + */ + public function paymentCheckResponseTemplate( + bool $success, + string $title = '', + string $pnr = '', + string $branch_name = '', + string $price_amount = '', + string $return_url = '' + ): array { + return [ + 'success' => $success, + 'title' => $title !== '' ? $title : ($success ? __('Payment is successful') : __('Payment has failed')), + 'pnr' => $pnr, + 'branch_name' => $branch_name, + 'price_amount' => $price_amount, + 'return_url' => $return_url !== '' ? $return_url : url('/'), + ]; + } + /** * Show payment status + * + * @param array{success: bool, title: string, pnr: string, branch_name: string, price_amount: string, return_url: string} $data */ public function paymentStatusView(array $data): View { diff --git a/app/Modules/OnlinePayment/Resources/Views/payment-status.blade.php b/app/Modules/OnlinePayment/Resources/Views/payment-status.blade.php index 0d54f11..3c9e789 100644 --- a/app/Modules/OnlinePayment/Resources/Views/payment-status.blade.php +++ b/app/Modules/OnlinePayment/Resources/Views/payment-status.blade.php @@ -27,7 +27,7 @@