99 lines
3.2 KiB
PHP
99 lines
3.2 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Api;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\Order;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Validator;
|
|
use Stripe\StripeClient;
|
|
use Stripe\Exception\ApiErrorException;
|
|
|
|
class StripeController extends Controller
|
|
{
|
|
private StripeClient $stripe;
|
|
|
|
public function __construct()
|
|
{
|
|
$stripeSecretKey = env('STRIPE_SECRET_KEY');
|
|
|
|
if (!$stripeSecretKey) {
|
|
throw new \RuntimeException('STRIPE_SECRET_KEY is not configured');
|
|
}
|
|
|
|
$this->stripe = new StripeClient($stripeSecretKey);
|
|
}
|
|
|
|
/**
|
|
* Créer une session de checkout Stripe
|
|
* Remplace la fonction Supabase create-checkout-session
|
|
*/
|
|
public function createCheckoutSession(Request $request)
|
|
{
|
|
$validator = Validator::make($request->all(), [
|
|
'priceId' => 'required|string',
|
|
'orderData' => 'nullable|array',
|
|
'successUrl' => 'required|url',
|
|
'cancelUrl' => 'required|url',
|
|
'quantity' => 'nullable|integer',
|
|
'customerEmail' => 'nullable|email',
|
|
]);
|
|
|
|
if ($validator->fails()) {
|
|
return response()->json([
|
|
'error' => 'Données invalides: ' . $validator->errors()->first()
|
|
], 400);
|
|
}
|
|
|
|
try {
|
|
// 1. Sauvegarder la commande dans la base de données
|
|
$orderData = $request->input('orderData', []);
|
|
|
|
// Si orderData n'est pas fourni, créer un objet minimal
|
|
if (empty($orderData)) {
|
|
$orderData = [
|
|
'customer_email' => $request->input('customerEmail'),
|
|
];
|
|
}
|
|
|
|
$order = Order::create([
|
|
...$orderData,
|
|
'status' => 'pending_payment',
|
|
]);
|
|
|
|
// 2. Créer la session Stripe
|
|
$session = $this->stripe->checkout->sessions->create([
|
|
'payment_method_types' => ['card'],
|
|
'line_items' => [
|
|
[
|
|
'price' => $request->input('priceId'),
|
|
'quantity' => 1,
|
|
],
|
|
],
|
|
'mode' => 'payment',
|
|
'success_url' => $request->input('successUrl') . '&session_id={CHECKOUT_SESSION_ID}&order_id=' . $order->id,
|
|
'cancel_url' => $request->input('cancelUrl'),
|
|
'metadata' => [
|
|
'order_id' => $order->id,
|
|
'product_name' => $orderData['product_name'] ?? '',
|
|
],
|
|
'customer_email' => $request->input('customerEmail') ?? $orderData['email'] ?? $orderData['customer_email'] ?? null,
|
|
]);
|
|
|
|
return response()->json([
|
|
'sessionId' => $session->id,
|
|
'url' => $session->url,
|
|
], 200);
|
|
|
|
} catch (ApiErrorException $e) {
|
|
return response()->json([
|
|
'error' => 'Erreur Stripe: ' . $e->getMessage()
|
|
], 400);
|
|
} catch (\Exception $e) {
|
|
return response()->json([
|
|
'error' => 'Erreur lors de la création de la session: ' . $e->getMessage()
|
|
], 500);
|
|
}
|
|
}
|
|
}
|