L’API Stripe sur Java

L’air est au business sur internet. Qui dit business dit paiement. C’est à ce niveau que les choses se corsent pour les développeurs. De nombreuses plateformes existent sur le marché et choisir la bonne implémentation n’est pas souvent chose aisée du fait du manque de documentation. J’ai eu l’occasion de découvrir cette API lors de la mise en place d’un PoC dans le cadre d’une briève collaboration avec la Startup Prédictice, spécialisée dans la justice prédictive sur le marché français.

1. Aperçu

Stripe est un service basé sur le cloud qui permet aux entreprises et aux particuliers de recevoir des paiements sur Internet et offre à la fois des bibliothèques côté client (JavaScript et mobile natif) et des bibliothèques côté serveur (Java, Ruby, Node.js, etc.).

Stripe fournit une couche d’abstraction qui réduit la complexité de la réception de paiements. En conséquence, nous n’avons pas besoin de traiter directement les détails de la carte de crédit – nous traitons plutôt avec un jeton symbolisant une autorisation de facturer.

Dans ce tutoriel, nous allons créer un exemple de projet Spring Boot qui permet aux utilisateurs d’entrer une carte de crédit et de charger ensuite la carte pour un certain montant en utilisant l’API Stripe pour Java.

2. Dépendances

Pour utiliser l’API Stripe pour Java dans le projet, nous ajoutons la dépendance correspondante à notre fichier pom.xml:

Sa dernière version est disponible dans le référentiel Maven Central.

Pour notre exemple, nous tirerons parti du spring-boot-starter-parent:

Nous utiliserons également Lombok pour réduire le code boilerplate, et Thymeleaf sera le moteur de création de pages Web dynamiques.

Puisque nous utilisons le parent spring-boot-starter pour gérer les versions de ces bibliothèques, nous n’avons pas besoin d’inclure leurs versions dans le pom.xml:


3. Clés de l’API

Avant de pouvoir communiquer avec Stripe et de crediter votre carte de crédit, nous devons enregistrer un compte Stripe et obtenir des clés API secrètes / publiques.

Après confirmation du compte, nous allons nous connecter pour accéder au tableau de bord Stripe. Nous choisissons ensuite l’onglet « API key » dans le menu de gauche:

Il y aura deux paires de clés: secrètes / publiques – une pour le test et une pour le live. Laissons cet onglet ouvert afin que nous puissions utiliser ces clés plus tard.

4. Flux général

Créditer notre compte sera effectué en cinq étapes simples, impliquant le front-end (exécuté dans un navigateur), le back-end (notre application Spring Boot) et Stripe:

  • L’utilisateur va à la page de paiement et clique sur « Payer avec la carte ».
  • L’utilisateur reçoit la boîte de dialogue Stripe Checkout overlay à l’écran, où il remplit les détails de la carte de crédit.
  • L’utilisateur confirme avec le bouton « Pay <amount> » qui:
    • Envoie la carte de crédit à Stripe
    • Obtient un jeton dans la réponse qui sera ajouté au formulaire existant
    • Soumet ce formulaire avec le montant, la clé API publique, l’e-mail et le jeton à notre back-end
  • Notre back-end contacte Stripe avec le jeton, le montant et la clé API secrète.
  • Le back-end vérifie la réponse de Stripe et fournir à l’utilisateur un retour de l’opération.

We will cover each step in greater detail in the following sections.

5. Le formulaire Checkout

Stripe Checkout est un widget personnalisable, mobile prêt et localisable qui affiche un formulaire pour introduire les détails de la carte de crédit. Grâce à l’inclusion et à la configuration de « checkout.js », il est responsable du:

  • Rendu du bouton « Payer avec la carte »
  • Rendu de la boîte de dialogue de recouvrement des paiements (déclenché après avoir cliqué sur « Payer avec la carte »)

  • Validation de carte de crédit
  • Fonction « Se souvenir de moi » (associe la carte à un numéro de portable)
  • Envoyer la carte de crédit à Stripe et la remplacer par un jeton dans le formulaire ci-joint (déclenché après avoir cliqué sur « Payer <montant> »)

Si nous avons besoin d’exercer plus de contrôle sur le formulaire de commande que celui fourni par Stripe Checkout, nous pouvons utiliser des éléments Stripe.

Maintenant, nous allons analyser le contrôleur qui prépare le formulaire, puis le formulaire lui-même.

5.1. Controlleur

Commençons par créer un contrôleur pour préparer le modèle avec les informations nécessaires dont le formulaire de commande a besoin.

Tout d’abord, nous devons copier la version de test de notre clé publique à partir du tableau de bord Stripe et l’utiliser pour définir STRIPE_PUBLIC_KEY en tant que variable d’environnement. Nous utilisons ensuite cette valeur dans le champ stripePublicKey .

Nous définissons également la devise et le montant (exprimé en cents) manuellement ici uniquement à des fins de démonstration, mais dans une application réelle, nous pouvons définir un identifiant de produit / vente qui pourrait être utilisé pour extraire les valeurs réelles.

Ensuite, nous renverrons à la vue checkout qui contient le formulaire de commande:

En ce qui concerne les clés API Stripe, vous pouvez les définir en tant que variables d’environnement par application (test vs live).

Comme c’est le cas pour tout mot de passe ou information sensible, il est préférable de garder la clé secrète hors de votre système de contrôle de version.

5.2. Forme

Le bouton « Payer avec la carte » et la boîte de dialogue de contrôle sont inclus en ajoutant un formulaire avec un script à l’intérieur, correctement configuré avec les attributs data:

Le script « checkout.js » déclenche automatiquement une requête à Stripe juste avant l’envoi, qui ajoute ensuite le jeton Stripe et l’email de l’utilisateur Stripe en tant que champs cachés « stripeToken » et « stripeEmail ».

Ceux-ci seront soumis à notre back-end avec les autres champs de formulaire. Les attributs de données de script ne sont pas soumis.

Nous utilisons Thymeleaf pour rendre les attributs « data-key », « data-amount » et « data-currency ».

Le montant (« data-amount ») est utilisé uniquement à des fins d’affichage (avec « data-currency »). Son unité est le centime de la devise utilisée, donc nous la divisons par 100 pour l’afficher.

La clé publique Stripe est transmise à Stripe après que l’utilisateur demande à payer. N’utilisez pas la clé secrète ici, car elle est envoyée au navigateur.

6. Opération de credit du compte

Pour le traitement côté serveur, nous devons définir le gestionnaire de requêtes POST utilisé par le formulaire de commande. Jetons un coup d’oeil aux classes dont nous aurons besoin pour cette opération.

6.1. Entité ChargeRequest

Définissons le POJO ChargeRequest que nous utiliserons comme entité commerciale pendant l’opération:

6.2 Service

Écrivons une classe StripeService pour communiquer l’opération de credit réelle à Stripe:

Comme indiqué dans CheckoutController, le champ secretKey est renseigné à partir de la variable d’environnement STRIPE_SECRET_KEY que nous avons copiée à partir du tableau de bord Stripe.

Une fois le service initialisé, cette clé est utilisée dans toutes les opérations Stripe suivantes.

L’objet renvoyé par la bibliothèque Stripe représente l’opération de crédit et contient des données utiles comme l’identifiant de l’opération.

6.3. Controller

Enfin, écrivons le contrôleur qui recevra la demande POST faite par le formulaire de commande et soumettra l’opération de crédit à Stripe via notre StripeService.

Notez que le paramètre « ChargeRequest » est automatiquement initialisé avec les paramètres de requête « amount », « stripeEmail » et « stripeToken » inclus dans le formulaire:

En cas de succès, nous ajoutons le statut, l’identifiant d’opération, l’identifiant de charge et l’identifiant de transaction de solde au modèle afin que nous puissions les montrer plus tard à l’utilisateur (Section 7). Ceci est fait pour illustrer une partie du contenu de l’objet Charge.

Notre ExceptionHandler traitera des exceptions de type StripeException qui sont lancées pendant l’opération de charge.

Si nous avons besoin d’une gestion plus fine des erreurs, nous pouvons ajouter des gestionnaires distincts pour les sous-classes de StripeException, telles que CardException, RateLimitException ou AuthenticationException.

La vue « result » rend le résultat de l’opération charge() (opération de crédit).

7. Affichage du résultat

Le code HTML utilisé pour afficher le résultat est un modèle Thymeleaf de base qui affiche le résultat d’une opération de facturation. L’utilisateur est envoyé ici par le ChargeController si l’opération de crédit a réussi ou non:

En cas de succès, l’utilisateur verra certains détails de l’opération de crédit:

En cas d’erreur, l’utilisateur recevra le message d’erreur renvoyé par Stripe:

8. Conclusion

Dans ce didacticiel, nous avons montré comment utiliser l’API Stripe Java pour facturer une carte de crédit. À l’avenir, nous pourrions réutiliser notre code côté serveur pour servir une application mobile native.

Pour tester le flux de charge complet, nous n’avons pas besoin d’utiliser une vraie carte de crédit (même en mode test). Nous pouvons compter sur les cartes de test Stripe à la place.

L’opération de charge (de crédit) est l’une des nombreuses possibilités offertes par l’API Stripe Java. La référence officielle de l’API nous guidera à travers l’ensemble des opérations disponible.

L’exemple de code utilisé dans ce tutoriel peut être trouvé dans mon github officiel.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.