2023-03-26 22:34:32 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace App\Extensions\PaymentGateways\Mollie;
|
|
|
|
|
2023-05-28 00:27:39 +00:00
|
|
|
use App\Classes\AbstractExtension;
|
2023-05-28 00:34:59 +00:00
|
|
|
use App\Enums\PaymentStatus;
|
2023-03-26 22:34:32 +00:00
|
|
|
use App\Events\PaymentEvent;
|
|
|
|
use App\Events\UserUpdateCreditsEvent;
|
|
|
|
use App\Models\PartnerDiscount;
|
|
|
|
use App\Models\Payment;
|
|
|
|
use App\Models\ShopProduct;
|
|
|
|
use App\Models\User;
|
2023-05-19 14:01:10 +00:00
|
|
|
use App\Models\Coupon;
|
|
|
|
use App\Traits\Coupon as CouponTrait;
|
|
|
|
use App\Events\CouponUsedEvent;
|
2023-03-26 22:34:32 +00:00
|
|
|
use Exception;
|
|
|
|
use Illuminate\Http\JsonResponse;
|
|
|
|
use Illuminate\Http\Request;
|
|
|
|
use Illuminate\Support\Facades\Auth;
|
|
|
|
use Illuminate\Support\Facades\Redirect;
|
|
|
|
use Illuminate\Support\Facades\Log;
|
|
|
|
use Illuminate\Support\Facades\Http;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Summary of PayPalExtension
|
|
|
|
*/
|
|
|
|
class MollieExtension extends AbstractExtension
|
|
|
|
{
|
2023-05-19 14:01:10 +00:00
|
|
|
use CouponTrait;
|
|
|
|
|
2023-03-26 22:34:32 +00:00
|
|
|
public static function getConfig(): array
|
|
|
|
{
|
|
|
|
return [
|
|
|
|
"name" => "Mollie",
|
|
|
|
"RoutesIgnoreCsrf" => [
|
|
|
|
"payment/MollieWebhook"
|
|
|
|
],
|
|
|
|
];
|
|
|
|
}
|
|
|
|
|
2023-05-28 00:27:39 +00:00
|
|
|
public static function getRedirectUrl(Payment $payment, ShopProduct $shopProduct, string $totalPriceString): string
|
2023-03-26 22:34:32 +00:00
|
|
|
{
|
|
|
|
$url = 'https://api.mollie.com/v2/payments';
|
|
|
|
$settings = new MollieSettings();
|
|
|
|
try {
|
|
|
|
$response = Http::withHeaders([
|
|
|
|
'Content-Type' => 'application/json',
|
|
|
|
'Authorization' => 'Bearer ' . $settings->api_key,
|
|
|
|
])->post($url, [
|
|
|
|
'amount' => [
|
|
|
|
'currency' => $shopProduct->currency_code,
|
2023-05-28 00:27:39 +00:00
|
|
|
'value' => $totalPriceString,
|
2023-03-26 22:34:32 +00:00
|
|
|
],
|
2023-03-27 18:48:14 +00:00
|
|
|
'description' => "Order #{$payment->id} - " . $shopProduct->name,
|
2023-05-28 00:27:39 +00:00
|
|
|
'redirectUrl' => route('payment.MollieSuccess'),
|
2023-03-27 18:48:14 +00:00
|
|
|
'cancelUrl' => route('payment.Cancel'),
|
2023-03-26 22:34:32 +00:00
|
|
|
'webhookUrl' => url('/extensions/payment/MollieWebhook'),
|
|
|
|
'metadata' => [
|
|
|
|
'payment_id' => $payment->id,
|
|
|
|
],
|
|
|
|
]);
|
|
|
|
|
|
|
|
if ($response->status() != 201) {
|
2023-03-27 18:48:14 +00:00
|
|
|
Log::error('Mollie Payment: ' . $response->body());
|
2023-05-28 00:27:39 +00:00
|
|
|
throw new Exception('Payment failed');
|
2023-03-26 22:34:32 +00:00
|
|
|
}
|
|
|
|
|
2023-05-28 00:27:39 +00:00
|
|
|
return $response->json()['_links']['checkout']['href'];
|
2023-03-26 22:34:32 +00:00
|
|
|
} catch (Exception $ex) {
|
|
|
|
Log::error('Mollie Payment: ' . $ex->getMessage());
|
2023-05-28 00:27:39 +00:00
|
|
|
throw new Exception('Payment failed');
|
2023-03-26 22:34:32 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static function success(Request $request): void
|
|
|
|
{
|
|
|
|
$payment = Payment::findOrFail($request->input('payment'));
|
2023-05-28 00:34:59 +00:00
|
|
|
$payment->status = PaymentStatus::PROCESSING;
|
|
|
|
$payment->save();
|
2023-03-26 22:34:32 +00:00
|
|
|
|
|
|
|
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]);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2023-05-28 00:34:59 +00:00
|
|
|
$payment = Payment::findOrFail($response->json()['metadata']['payment_id']);
|
2023-03-26 22:34:32 +00:00
|
|
|
$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);
|
2023-05-28 00:34:59 +00:00
|
|
|
$payment->status = PaymentStatus::PAID;
|
|
|
|
$payment->save();
|
2023-03-26 22:34:32 +00:00
|
|
|
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]);
|
|
|
|
}
|
|
|
|
}
|