cardRepository = $cardRepository; } public function createCheckoutSession(Request $request) { Stripe::setApiKey(env('STRIPE_SECRET_KEY')); $count = $request->input('count'); $clientSessionId = Str::uuid(); $priceIds = [ 3 => 'price_1S51zxGaZ3yeYkzWYb0wSt4j', 21 => 'price_1S5464GaZ3yeYkzWh8RuJfab', ]; if (!isset($priceIds[$count])) { return response()->json(['error' => 'Invalid product selected.'], 400); } try { $session = Session::create([ 'line_items' => [[ 'price' => $priceIds[$count], 'quantity' => 1, ]], 'mode' => 'payment', 'success_url' => url(env('APP_URL') . '/success?client_session_id=' . $clientSessionId), 'cancel_url' => url(env('APP_URL') . '/cancel'), 'metadata' => [ 'draw_count' => $request->input('count'), 'client_session_id' => $clientSessionId, ], ]); Payment::create([ 'amount' => $session->amount_total / 100, 'currency' => $session->currency, 'stripe_session_id' => $session->id, 'client_session_id' => $clientSessionId, 'draw_count' => $count, 'status' => 'pending', ]); return response()->json(['sessionId' => $session->id]); } catch (\Exception $e) { \Log::error('Stripe session creation failed: ' . $e->getMessage()); return response()->json(['error' => 'Could not create checkout session.'], 500); } } public function createRendezVousSession(Request $request) { Stripe::setApiKey(env('STRIPE_SECRET_KEY')); $userForm = $request->input('userForm'); $dateAppointment = $request->input('selectedDate'); $clientSessionId = Str::uuid(); $priceId = 'price_1S5ifuGaZ3yeYkzWsgrOTpgT'; try { $session = Session::create([ 'line_items' => [[ 'price' => $priceId, 'quantity' => 1, ]], 'mode' => 'payment', 'success_url' => url(env('APP_URL') . '/rendez-vous/success?client_session_id=' . $clientSessionId), 'cancel_url' => url(env('APP_URL') . '/cancel'), 'metadata' => [ 'client_session_id' => $clientSessionId, 'type_appointment' => true, 'appointment_date' => $dateAppointment ], 'customer_email' => $userForm["email"] ]); Payment::create([ 'amount' => $session->amount_total / 100, 'currency' => $session->currency, 'stripe_session_id' => $session->id, 'client_session_id' => $clientSessionId, 'draw_count' => 0, 'status' => 'pending', ]); return response()->json(['sessionId' => $session->id]); } catch (\Exception $e) { \Log::error('Stripe session creation failed: ' . $e->getMessage()); return response()->json(['error' => 'Could not create checkout session.'], 500); } } public function validatePayment(Request $request) { $clientSessionId = $request->query('client_session_id'); $payment = Payment::where('client_session_id', $clientSessionId) ->where('status', 'succeeded') ->first(); if ($payment) { // Si la vérification réussit, retournez le nombre de tirages. return response()->json([ 'success' => true, 'drawCount' => $payment->draw_count, ]); } // Si la vérification échoue, retournez une erreur. return response()->json([ 'success' => false, 'message' => 'Paiement non validé.', ], 404); } public function getCards(Request $request) { $sessionId = $request->query('client_session_id'); if(!$sessionId) { $count = $request->query('count'); if($count == 1){ $freeCards = $this->cardRepository->draw(1); return response()->json([ 'success' => true, 'cards' => $freeCards ]); } } // 1. Find the payment record $payment = Payment::where('client_session_id', $sessionId)->first(); if (!$payment) { return response()->json(['success' => false, 'message' => 'Payment not found.'], 404); } // 2. One-Time Use Check if ($payment->status === 'processed') { return response()->json([ 'success' => true, 'cards' => $payment->cards, 'message' => 'Cards already drawn for this payment.', ]); } // 3. Verify payment status with Stripe if ($payment->status !== 'succeeded') { try { $session = Session::retrieve($sessionId); if ($session->payment_status !== 'paid' || $session->status !== 'complete') { return response()->json(['success' => false, 'message' => 'Payment not complete.'], 402); } $payment->update(['status' => 'succeeded']); } catch (\Exception $e) { \Log::error('Stripe session retrieval failed: ' . $e->getMessage()); return response()->json(['success' => false, 'message' => 'Validation error.'], 500); } } // 4. Securely draw the cards and store them $drawnCards = $this->cardRepository->draw($payment->draw_count); $payment->update([ 'cards' => $drawnCards, 'status' => 'processed', ]); return response()->json([ 'success' => true, 'cards' => $drawnCards, ]); } }