| description | La consommation d'une API avec Symfony |
|---|
Les API sont le liant entre les applications. Elles permettent de récupérer des données d'une application à une autre. Elles sont donc très utiles pour les applications mobiles, les applications web, les applications de bureau, etc.
- Pour avoir accès à des données dont vous ne disposez pas ou qu'il serait trop long et coûteux de développer vous-même.
- Pour utiliser des services externes à votre application (paiement en ligne, envoi de mail, envoi de SMS, etc.)
Vous voyez donc que les API sont très utiles et qu'il est important de savoir les consommer dans vos applications web.
Il existe plusieurs manières de consommer une API avec Symfony. Nous allons voir comment le faire avec Stripe, un service de paiement en ligne.
Contexte, vous avez un site web commerçant et vous souhaitez proposer le paiement en ligne à vos clients. Vous allez donc utiliser Stripe pour gérer les paiements. Nous allons voir ensemble comment mettre cela en place à partir de l'étape du paiement.
Thème : Location de salle de réunion
- L'internaute visite le site web
- Ajout des produits ou service dans un panier
- Validation de la commande
- Paiement de la commande <- À PARTIR D'ICI
- Validation du paiement
- Gestion de la commande
Pour commencer, il faut installer le SDK Stripe dans votre projet Symfony. Pour cela, il faut utiliser Composer.
composer require stripe/stripe-phpEnsuite, il faut créer un compte Stripe. C'est sur ce compte que vous allez gérer vos paiements. Vous pouvez créer un compte sur le site de Stripe. Puis récupérez votre clé secrète et votre clé publique depuis votre tableau de bord "Développeurs" > "Clés API".
Une fois que vous avez récupéré vos clés, il faut les ajouter dans votre fichier .env :
# .env ou .env.local
STRIPE_SECRET_KEY=sk_test_51J4XXXXXXXXXXXXXXXXXXXXXXX
STRIPE_PUBLIC_KEY=pk_test_51J4XXXXXXXXXXXXXXXXXXXXXXXCe n'est pas tout, il faut aussi ajouter la référence de ces clés dans votre fichier services.yaml :
# config/services.yaml
parameters:
# ...
STRIPE_SECRET_KEY: '%env(STRIPE_SECRET_KEY)%'
STRIPE_PUBLIC_KEY: '%env(STRIPE_PUBLIC_KEY)%'Cette configuration permet de rendre vos clés accessibles dans votre application Symfony de manière globale. Il suffit de les appeler avec $this->getParameter('STRIPE_SECRET_KEY') et $this->getParameter('STRIPE_PUBLIC_KEY').
Maintenant, il faut créer un controller pour gérer le paiement. Pour cela, créez un controller PaymentController avec la commande suivante :
symfony console make:controller PaymentControllerMaintenant nous pouvons mettre en place le nécessaire pour gérer le paiement. Pour rappel l'exemple ici est le paiement d'une location de salle de réunion. Nous allons donc créer une route qui va permettre de créer une session de paiement Stripe. Cette session va contenir les informations de la commande et permettre à l'internaute de payer. Retrouvez la documentation de Stripe sur Checkout.
# src/Controller/PaymentController.php
// ...
use Stripe\Stripe;
use Stripe\Checkout\Session;
use App\Repository\OrderRepository;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RedirectResponse;
class PaymentController extends AbstractController
{
#[Route('payment/session', name: 'payment_session')]
public function paymentSession(Request $request, OrderRepository $orderRepository): RedirectResponse
{
// Configuration de Stripe avec la clé secrète
Stripe::setApiKey($this->getParameter('STRIPE_SECRET_KEY'));
/**
* Récupérez les informations de la commande
* depuis la base de données ou via request
* Faites comme vous le souhaitez,
* elles doivent juste être accessibles ici
*/
$order = $orderRepository->findOneBy([
'id' => $request->get('order')
]);
// Création de la session de paiement Stripe
if($order){
$checkout_session = Session::create([
'payment_method_types' => ['card'],
'line_items' => [[
'price_data' => [
'currency' => 'eur',
'unit_amount' => $order->getTotal() * 100, // Stripe utilise des centimes
'product_data' => [ // Les informations du produit sont personnalisables
'name' => 'Réservation',
],
],
'quantity' => 1,
]],
'mode' => 'payment',
'success_url' => $this->generateUrl('payment_success', ['order' => $order->getId()], 0),
'cancel_url' => $this->generateUrl('payment_cancel', [], 0),
]);
// Redirection vers la page de paiement
return $this->redirect($checkout_session->url);
}
}
}Maintenant, il faut créer les routes payment_success et payment_cancel qui vont permettre de gérer l'affichage de la page pour le succès ou l'échec du paiement.
# src/Controller/PaymentController.php
// ...
#[Route('payment/success', name: 'payment_success')]
public function paymentSuccess(
Request $request,
OrderRepository $orderRepository,
EntityManagerInterface $em
): Response
{
$order = $orderRepository->findOneBy([
'id' => $request->get('order')
]);
// Mettre à jour le statut de la commande
$order->setStatut(true);
$em->persist($order);
$em->flush();
return $this->render('payment/success.html.twig', [
'order' => $order
]);
}
#[Route('payment/cancel', name: 'payment_cancel')]
public function paymentCancel(): Response
{
return $this->render('payment/cancel.html.twig');
}
// ...N'oubliez pas de créer les templates payment/success.html.twig et payment/cancel.html.twig pour afficher les pages de succès et d'échec du paiement. Vous pouvez les personnaliser comme vous le souhaitez.
Voici un exemple de code pour consommer une API avec Symfony. Vous pouvez bien évidemment l'adapter à vos besoins. Vous pouvez aussi utiliser d'autres services de paiement en ligne comme PayPal ou MangoPay.
Ce qu'il faut retenir, c'est que les API sont très utiles et qu'il est important de savoir les consommer dans vos applications web afin d'améliorer l'expérience utilisateur.