Tutoriel Vidéo PHP Stripe Module de paiement Stripe

Télécharger la vidéo Télécharger les sources

Stripe est une plateforme qui vous permet de mettre en place un système de paiement sur votre site simplement gràce à une API facile à prendre en main et un dashboard user-friendly.

Fonctionnement

Contrairement à Express Checkout, Stripe va permettre de mettre en place le formulaire de paiement directement sur notre site. L'utilisateur ne sera pas redirigé vers une page intermédiaire pour rentrer ses informations bancaires. Le traitement des informations bancaires va être géré par stripe qui vous renverra un token de paiement à la place. Vous n'aurez pas à stocker d'informations sensibles.

Tarification

Niveau tarification le principe est à peu près le même que Paypal, un pourcentage par transaction en plus d'une somme de base par transaction :

  • 1,4 % + 0,25 € pour les cartes européennes
  • 2,9 % + 0,25 € pour les cartes non européennes.
  • 15 € en cas de contestation de paiement (frais qui seront remboursées si la banque tranche en votre faveur)

L'API

Pour commencer il faudra donc récupérer les informations bancaires entrées par l'utilisateur et obtenir un Token en contactant l'API de stripe :

<script type="text/javascript" src="https://js.stripe.com/v2/"></script>
<script>
Stripe.setPublishableKey('pk_test_Et9GdgxRPH9oBRXGCfMKX6RK');

var $form = $('#payment-form'); // On récupère le formulaire
$form.submit(function (e) {
  e.preventDefault();
  $form.find('button').prop('disabled', true); // On désactive le bouton submit
  Stripe.card.createToken({
    number: $('.card-number').val(),
    cvc: $('.card-cvc').val(),
    exp_month: $('.card-expiry-month').val(),
    exp_year: $('.card-expiry-year').val()
  }, function (status, response) {
    if (response.error) { // Ah une erreur !
      // On affiche les erreurs
      $form.find('.payment-errors').text(response.error.message);
      $form.find('button').prop('disabled', false); // On réactive le bouton
    } else { // Le token a bien été créé
      var token = response.id; // On récupère le token
      // On crée un champs cachée qui contiendra notre token
      $form.append($('<input type="hidden" name="stripeToken" />').val(token));
      $form.get(0).submit(); // On soumet le formulaire
    }
  });
});
</script>

Ce token sera donc transmis au serveur et pourra être utilisé pour créer un customer (on peut aussi l'utiliser pour déclencher un paiement directement, mais conserver l'utilisateur sur Stripe permet une gestion plus facile par la suite).

\Stripe\Stripe::setApiKey("sk_test_MjzqdAmOH5j9rBy6Ip27pCu6");
$customer = \Stripe\Customer::create(array(
  "description" => "Customer for daniel.white@example.com",
  "email" => "daniel.white@example.com",
  "source" => "tok_18imUxDZd8whA19qRiYt8KNb" // obtenu via l'étape précédente
));

Lors de cette étape on conservera surtout ID du customer, cet ID peut ensuite être utilisé pour prélever l'utilisateur :

$charge = \Stripe\Charge::create(array(
  "customer" => 2000, // En centimes ! 20 € ici
  "currency" => "eur",
  "customer" => "cus_90q2whhB99KsRq"
));

Ou on peut l'abonner a un plan afin d'activer un prélèvement récurrent

$subscription = \Stripe\Subscription::create(array(
  "customer" => "cus_90q2whhB99KsRq",
  "plan" => "premium"
));

Les webhooks

Dans le cas des abonnements, il sera important de capturer les nouveaux paiements ainsi que les paiements échoués. Pour cela il sera possible de créer des webhooks qui seront appelés par Stripe lors d'évènements particuliers.

<?php
http_response_code(200); // Il faut renvoyer un code 200 pour indiquer à Stripe que le hook s'est bien lancé
// ...
$input = file_get_contents('php://input');
$received_event = json_decode($input); // On récupère l'évènement envoyé 
// On peut ici mettre un filtre pour ne faire un traitement que pour certains évènements
$event = \Stripe\Event::retrieve($received_event->id); // On demande l'évènement à l'API car on ne doit pas faire confiance aux données externes :)

Et voila vous connaissez la base ! Pour plus d'informations n'hésitez pas à faire un tour sur la documentation et l'API Reference.