user(); $wallet = Wallet::query()->firstOrCreate( ['user_id' => $user->id], ['currency' => 'EUR', 'current_balance' => 0, 'status' => 'active'], ); return $this->success([ 'balance' => $this->walletService->getBalance($user), 'wallet' => new WalletResource($wallet->fresh()), ]); } public function transactions(Request $request): JsonResponse { $wallet = Wallet::query()->where('user_id', $request->user()->id)->first(); if ($wallet === null) { return $this->success(['transactions' => []]); } $transactions = WalletTransaction::query() ->where('wallet_id', $wallet->id) ->orderByDesc('created_at') ->paginate($request->integer('per_page', 20)); return $this->success([ 'transactions' => WalletTransactionResource::collection($transactions), 'meta' => [ 'current_page' => $transactions->currentPage(), 'last_page' => $transactions->lastPage(), 'per_page' => $transactions->perPage(), 'total' => $transactions->total(), ], ]); } public function initiateTopUp(InitiateTopUpRequest $request, PaymentService $paymentService): JsonResponse { $payment = $paymentService->initiateTopUp( $request->user(), (float) $request->input('amount'), $request->string('idempotency_key')->toString(), $request->input('return_url'), ); return $this->created([ 'payment' => new PaymentTransactionResource($payment), ], 'Rechargement initié.'); } public function confirmTopUp(ConfirmTopUpRequest $request, PaymentService $paymentService): JsonResponse { $payment = $paymentService->confirmTopUp( $request->string('payment_uuid')->toString(), ); if ($payment->user_id !== $request->user()->id) { return $this->error('Paiement non autorisé.', 403); } return $this->success([ 'payment' => new PaymentTransactionResource($payment), 'balance' => $this->walletService->getBalance($request->user()), ], 'Rechargement confirmé.'); } public function webhook(Request $request, string $provider, PaymentService $paymentService): JsonResponse { if ($provider === 'stripe') { try { $paymentService->handleStripeWebhook( $request->getContent(), $request->header('Stripe-Signature', ''), ); } catch (\InvalidArgumentException $e) { return $this->error($e->getMessage(), 400); } } else { $paymentService->handleWebhook($provider, $request->all()); } return $this->success(message: 'Webhook traité.'); } }