Paiement Stripe Checkout

Voir la vidéo

Dans ce tutoriel je vous propose de découvrir la mise en place de Stripe Checkout en PHP. Cette intégration permet de laisser Stripe gérer le processus de paiement depuis leur interface ce qui permet une intégration plus simple.

Principe de base

Afin d'intéragir avec l'API de Stripe on va utiliser le paquet stripe/stripe-php :

composer require stripe/stripe-php

Création de la Session

Pour commencer le processus de paiement il va falloir créer une Session (vous pouvez adapter les paramètres en fonction de ce que vous souhaitez faire).

$session = Session::create([
    'line_items'                  => [
        array_map(fn(array $product) => [
            'quantity'   => 1,
            'price_data' => [
                'currency'     => 'EUR',
                'product_data' => [
                    'name' => $product['name']
                ],
                'unit_amount'  => $product['price']
            ]
        ], $cart->getProducts())
    ],
    'mode'                        => 'payment',
    'success_url'                 => 'http://localhost:8000/success.php',
    'cancel_url'                  => 'http://localhost:8000/',
    'billing_address_collection'  => 'required',
    'shipping_address_collection' => [
        'allowed_countries' => ['FR']
    ],
    'metadata'                    => [
        'cart_id' => $cart->getId()
    ]
]);

Le retour d'API renvoie un objet de type Session qui contient une propriété url qui contient l'url vers laquelle on doit rediriger l'utilisateur pour lancer le processus de paiement. Vous pouvez conserver l'ID de la session si vous souhaitez l'utiliser pour la réconciliation lors de l'utilisation des webhooks.

header("HTTP/1.1 303 See Other");
header("Location: " . $session->url);

L'utilisateur pourra renseigner sa méthode de paiement (et ses informations de facturation si l'option est activée) et sera rediriger vers la page de succès.

Webhook

Maintenant que l'utilisateur a effectué le paiement, il faut que notre serveur soit mis au courant du paiement. Pour cela, Stripe offre un système de webhook qui va notifier notre serveur via un appel HTTP lorsque certains évènements se produisent.

On commence par vérifier si le payload est valide en utilisant l'en-tête stripe-signature.

$signature = $request->getHeaderLine('stripe-signature');
$body = (string)$request->getBody();
$event = Webhook::constructEvent(
  $body,
  $signature,
  WEBHOOK_SECRET
);

Dans notre cas on ne s'intéressera qu'à l'évènement checkout.session.completed.

if ($event->type !== 'checkout.session.completed') {
    return;
}
// On récupère la Session Stripe
$data = $event->data['object']; 
// On peut utiliser l'API pour récupérer 
// des informations supplémentaires si nécessaire
$client = new StripeClient(STRIPE_SECRET);
$items = $client->checkout->sessions->allLineItems($data['id']);

A vous de traiter ces données en fonction de ce que vous souhaitez faire.

Tester

Pour tester votre webhook vous pouvez utiliser le système de commande Stripe.

stripe login 

On peut ensuite indiquer à Stripe de rediriger les appels webhooks vers notre serveur de développement.

stripe listen --forward-to localhost:4242/stripe_webhooks

Il est aussi possible d'utiliser cette commande pour créer des évènements avec des données spécifiques.

stripe trigger checkout.session.completed
# On peut aussi passer des données
stripe trigger checkout.session.completed --add checkout_session:metadata[cart_id]=234

Il est aussi possible de relancer un évènement spécifique avec son id.

stripe events resend evt_1CiPtv2eZvKYlo2CcUZsDcO6
Response
Publié
Technologies utilisées
Auteur :
Grafikart
Partager