From c95cde5cde631b19d989e359b6d4b378a7fa9dfe Mon Sep 17 00:00:00 2001 From: IceToast Date: Mon, 27 Mar 2023 00:34:32 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20=E2=9C=A8=20Create=20Mollie=20payment?= =?UTF-8?q?=20gateway=20extension?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Mollie/MollieExtension.php | 146 ++++++++++++++++++ .../PaymentGateways/Mollie/MollieSettings.php | 36 +++++ ...23_03_26_215801_create_mollie_settings.php | 18 +++ .../PaymentGateways/Mollie/web_routes.php | 17 ++ app/Listeners/CreateInvoice.php | 4 +- .../PaymentGateways/mollie_logo.png | Bin 0 -> 46530 bytes 6 files changed, 220 insertions(+), 1 deletion(-) create mode 100644 app/Extensions/PaymentGateways/Mollie/MollieExtension.php create mode 100644 app/Extensions/PaymentGateways/Mollie/MollieSettings.php create mode 100644 app/Extensions/PaymentGateways/Mollie/migrations/2023_03_26_215801_create_mollie_settings.php create mode 100644 app/Extensions/PaymentGateways/Mollie/web_routes.php create mode 100644 public/images/Extensions/PaymentGateways/mollie_logo.png diff --git a/app/Extensions/PaymentGateways/Mollie/MollieExtension.php b/app/Extensions/PaymentGateways/Mollie/MollieExtension.php new file mode 100644 index 00000000..4c0920ea --- /dev/null +++ b/app/Extensions/PaymentGateways/Mollie/MollieExtension.php @@ -0,0 +1,146 @@ + "Mollie", + "RoutesIgnoreCsrf" => [ + "payment/MollieWebhook" + ], + ]; + } + + static function pay(Request $request): void + { + $url = 'https://api.mollie.com/v2/payments'; + $settings = new MollieSettings(); + + $user = Auth::user(); + $shopProduct = ShopProduct::findOrFail($request->shopProduct); + $discount = PartnerDiscount::getDiscount(); + + // create a new payment + $payment = Payment::create([ + 'user_id' => $user->id, + 'payment_id' => null, + 'payment_method' => 'mollie', + 'type' => $shopProduct->type, + 'status' => 'open', + 'amount' => $shopProduct->quantity, + 'price' => $shopProduct->price - ($shopProduct->price * $discount / 100), + 'tax_value' => $shopProduct->getTaxValue(), + 'tax_percent' => $shopProduct->getTaxPercent(), + 'total_price' => $shopProduct->getTotalPrice(), + 'currency_code' => $shopProduct->currency_code, + 'shop_item_product_id' => $shopProduct->id, + ]); + + try { + $response = Http::withHeaders([ + 'Content-Type' => 'application/json', + 'Authorization' => 'Bearer ' . $settings->api_key, + ])->post($url, [ + 'amount' => [ + 'currency' => $shopProduct->currency_code, + 'value' => number_format($shopProduct->getTotalPrice(), 2, '.', ''), + ], + 'description' => "Order #{$payment->id}", + 'redirectUrl' => route('payment.mollieSuccess', ['payment' => $payment->id]), + 'cancelUrl' => route('payment.cancel'), + 'webhookUrl' => url('/extensions/payment/MollieWebhook'), + 'metadata' => [ + 'payment_id' => $payment->id, + ], + ]); + + if ($response->status() != 201) { + Log::error('Mollie Payment: ' . $response->json()['title']); + $payment->delete(); + + Redirect::route('store.index')->with('error', __('Payment failed'))->send(); + return; + } + + $payment->update([ + 'payment_id' => $response->json()['id'], + ]); + + Redirect::away($response->json()['_links']['checkout']['href'])->send(); + return; + } catch (Exception $ex) { + Log::error('Mollie Payment: ' . $ex->getMessage()); + $payment->delete(); + + Redirect::route('store.index')->with('error', __('Payment failed'))->send(); + return; + } + } + + static function success(Request $request): void + { + $payment = Payment::findOrFail($request->input('payment')); + $payment->status = 'pending'; + + Redirect::route('home')->with('success', 'Your payment is being processed')->send(); + return; + } + + static function webhook(Request $request): JsonResponse + { + $url = 'https://api.mollie.com/v2/payments/' . $request->id; + $settings = new MollieSettings(); + + try { + $response = Http::withHeaders([ + 'Content-Type' => 'application/json', + 'Authorization' => 'Bearer ' . $settings->api_key, + ])->get($url); + if ($response->status() != 200) { + Log::error('Mollie Payment Webhook: ' . $response->json()['title']); + return response()->json(['success' => false]); + } + + $payment = Payment::findOrFail($response->json()['metadata']['payment_id']); + $payment->status->update([ + 'status' => $response->json()['status'], + ]); + + $shopProduct = ShopProduct::findOrFail($payment->shop_item_product_id); + event(new PaymentEvent($payment, $payment, $shopProduct)); + + if ($response->json()['status'] == 'paid') { + $user = User::findOrFail($payment->user_id); + event(new UserUpdateCreditsEvent($user)); + } + } catch (Exception $ex) { + Log::error('Mollie Payment Webhook: ' . $ex->getMessage()); + return response()->json(['success' => false]); + } + + // return a 200 status code + return response()->json(['success' => true]); + } +} diff --git a/app/Extensions/PaymentGateways/Mollie/MollieSettings.php b/app/Extensions/PaymentGateways/Mollie/MollieSettings.php new file mode 100644 index 00000000..976025d2 --- /dev/null +++ b/app/Extensions/PaymentGateways/Mollie/MollieSettings.php @@ -0,0 +1,36 @@ + 'fas fa-dollar-sign', + 'api_key' => [ + 'type' => 'string', + 'label' => 'API Key', + 'description' => 'The API Key of your Mollie App', + ] + ]; + } +} diff --git a/app/Extensions/PaymentGateways/Mollie/migrations/2023_03_26_215801_create_mollie_settings.php b/app/Extensions/PaymentGateways/Mollie/migrations/2023_03_26_215801_create_mollie_settings.php new file mode 100644 index 00000000..a3b6bfd0 --- /dev/null +++ b/app/Extensions/PaymentGateways/Mollie/migrations/2023_03_26_215801_create_mollie_settings.php @@ -0,0 +1,18 @@ +migrator->addEncrypted('mollie.api_key', null); + $this->migrator->add('mollie.enabled', false); + } + + public function down(): void + { + $this->migrator->delete('mollie.api_key'); + $this->migrator->delete('mollie.enabled'); + } +} diff --git a/app/Extensions/PaymentGateways/Mollie/web_routes.php b/app/Extensions/PaymentGateways/Mollie/web_routes.php new file mode 100644 index 00000000..3d95e4b0 --- /dev/null +++ b/app/Extensions/PaymentGateways/Mollie/web_routes.php @@ -0,0 +1,17 @@ +group(function () { + Route::get('payment/MolliePay/{shopProduct}', function () { + MollieExtension::pay(request()); + })->name('payment.MolliePay'); + + Route::get( + 'payment/PayPalSuccess', + function () { + MollieExtension::success(request()); + } + )->name('payment.MollieSuccess'); +}); diff --git a/app/Listeners/CreateInvoice.php b/app/Listeners/CreateInvoice.php index f81364a3..9fc7d0bf 100644 --- a/app/Listeners/CreateInvoice.php +++ b/app/Listeners/CreateInvoice.php @@ -11,6 +11,7 @@ class CreateInvoice use Invoiceable; private $invoice_enabled; + private $invoice_settings; /** * Create the event listener. @@ -20,6 +21,7 @@ class CreateInvoice public function __construct(InvoiceSettings $invoice_settings) { $this->invoice_enabled = $invoice_settings->enabled; + $this->invoice_settings = $invoice_settings; } /** @@ -32,7 +34,7 @@ class CreateInvoice { if ($this->invoice_enabled) { // create invoice using the trait - $this->createInvoice($event->payment, $event->shopProduct); + $this->createInvoice($event->payment, $event->shopProduct, $this->invoice_settings); } } } diff --git a/public/images/Extensions/PaymentGateways/mollie_logo.png b/public/images/Extensions/PaymentGateways/mollie_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..6b23376590e379635a8a8e62b270aa2c6ef5548e GIT binary patch literal 46530 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