Accéder directement au contenu
Créez un compte
ou
connecter-vous
Logo de la documentation Stripe
/
Demander à l'assistant IA
Créez un compte
Connectez-vous
Démarrer
Paiements
Revenus
Plateformes et places de marché
Gestion de fonds
Ressources pour les développeurs

Accepter les paiements par carte sans webhooks

Comment confirmer un paiement par carte sur votre serveur et gérer les demandes d’authentification de cartes.

Mise en garde

Stripe recommande d’utiliser le nouveau Payment Element au lieu du Card Element. Il vous permet d’accepter plusieurs moyens de paiement avec un seul Element. En savoir plus sur les cas d’utilisation des composants Card Element et Payment Element.

Pour une prise en charge plus vaste et pérenne, utilisez notre intégration standard pour les paiements asynchrones.

Cette intégration vous permet d’attendre la réponse du client et de finaliser un paiement côté serveur sans utiliser de webhooks ni traiter d’événements hors ligne. Même si cette intégration semble plus simple, elle est difficile à adapter à la croissance de votre entreprise, et présente plusieurs restrictions :

Vous migrez ?

Si vous migrez une intégration Stripe existante depuis l’API Charges, suivez les instructions du guide de migration.

  • Prise en charge des cartes uniquement : il vous faudra écrire du code pour prendre en charge séparément les paiements ACH et d’autres moyens de paiement régionaux populaires.
  • Risque de double paiement : en créant un nouveau PaymentIntent de manière synchrone chaque fois que votre client tente de payer, vous risquez involontairement de le faire payer deux fois. Veillez à bien suivre les bonnes pratiques.
  • Étape supplémentaire pour le client : les cartes sujettes au protocole 3D Secure ou à des réglementations telles que l’authentification forte du client nécessitent des étapes supplémentaires côté client.

Gardez ces restrictions à l’esprit si vous décidez d’utiliser cette intégration. Si elles vous posent problème, utilisez l’intégration standard.

Configurer Stripe

Tout d’abord, il vous faut un compte Stripe. S’inscrire.

Utilisez nos bibliothèques officielles pour accéder à l’API Stripe à partir de votre application :

Command Line
Ruby
# Available as a gem sudo gem install stripe
Gemfile
Ruby
# If you use bundler, you can add this line to your Gemfile gem 'stripe'

Collecter les informations de carte bancaire
Côté client

Collectez les informations de carte bancaire côté client avec Stripe.js et Stripe Elements. Elements est un ensemble de composants d’interface utilisateur conçu pour recueillir et valider le numéro de carte bancaire, le code postal et la date d’expiration.

Un composant Element contient une balise iframe qui envoie de manière sécurisée les informations de paiement à Stripe par une connexion HTTPS. Pour que votre intégration fonctionne, l’adresse de votre page de règlement doit aussi commencer par https:// au lieu de http://.

Vous pouvez tester votre intégration sans utiliser le protocole HTTPS. Activez-le au moment d’accepter des paiements en mode production.

Ajoutez le script Stripe.js en haut de chaque page de votre site. Elements est automatiquement disponible en tant que fonctionnalité de Stripe.js.

<script src="https://js.stripe.com/basil/stripe.js"></script>

En ajoutant le script sur chaque page de votre site, vous pourrez bénéficier de la fonctionnalité de protection avancée contre la fraude de Stripe et détecter les comportements anormaux des navigateurs.

Créer le formulaire de paiement

Pour recueillir de manière sécurisée les informations des cartes de vos clients, Elements crée pour vous des composants d’interface utilisateur hébergés par Stripe. Ceux-ci sont ensuite placés dans votre formulaire de paiement sous la forme d’un iframe. Pour déterminer l’endroit où ces composants doivent être insérés, créez des éléments DOM (conteneurs) vides dotés d’ID uniques dans votre formulaire de paiement.

index.html
HTML
<form id='payment-form'> <label> Card details <!-- placeholder for Elements --> <div id="card-element"></div> </label> <button type="submit">Submit Payment</button> </form>

Créez ensuite une instance de l’objet Stripe en indiquant comme premier paramètre votre clé API publiable : Ensuite, créez une instance de l’objet Elements et utilisez-la pour ajouter un élément Card à l’emplacement réservé correspondant sur la page.

script.js
Afficher l'exemple dans son intégralité
const stripe = Stripe(
'pk_test_TYooMQauvdEDq54NiTphI7jx'
); const elements = stripe.elements(); // Set up Stripe.js and Elements to use in checkout form const style = { base: { color: "#32325d", fontFamily: '"Helvetica Neue", Helvetica, sans-serif', fontSmoothing: "antialiased", fontSize: "16px", "::placeholder": { color: "#aab7c4" } }, invalid: { color: "#fa755a", iconColor: "#fa755a" }, }; const cardElement = elements.create('card', {style}); cardElement.mount('#card-element');

Le composant Element card simplifie le formulaire et réduit le nombre de champs requis en insérant un champ de saisie flexible et unique qui recueille en toute sécurité les informations de carte bancaire requises.

Vous pouvez aussi combiner les composants Elements cardNumber, cardExpiry et cardCvc pour créer un formulaire de carte multi-saisie flexible.

Remarque

Recueillez toujours un numéro de code postal afin d’améliorer vos taux d’acceptation des cartes bancaires et de réduire la fraude.

Le composant Card Element à une seule ligne recueille automatiquement le code postal du client et l’envoie à Stripe. Si vous créez votre formulaire de paiement avec des Elements fractionnés (Numéro de carte, Expiration, CVC, ajoutez un champ de saisie distinct pour le code postal du client.

Créer un objet PaymentMethod

Enfin, utilisez stripe.createPaymentMethod sur votre client pour collecter les informations de carte et créer une PaymentMethod lorsque l’utilisateur clique sur le bouton d’envoi.

script.js
const form = document.getElementById('payment-form'); form.addEventListener('submit', async (event) => { // We don't want to let default form submission happen here, // which would refresh the page. event.preventDefault(); const result = await stripe.createPaymentMethod({ type: 'card', card: cardElement, billing_details: { // Include any additional collected billing details. name: 'Jenny Rosen', }, }) stripePaymentMethodHandler(result); });

Envoyer le PaymentMethod à votre serveur
Côté client

Une fois le PaymentMethod créé avec succès, envoyez l’identifiant qui en résulte à votre serveur.

script.js
const stripePaymentMethodHandler = async (result) => { if (result.error) { // Show error in payment form } else { // Otherwise send paymentMethod.id to your server (see Step 4) const res = await fetch('/pay', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ payment_method_id: result.paymentMethod.id, }), }) const paymentResponse = await res.json(); // Handle server response (see Step 4) handleServerResponse(paymentResponse); } }

Créer un PaymentIntent
Côté serveur

Configurez un endpoint sur votre serveur pour recevoir la requête. Cet endpoint sera également utilisé ultérieurement pour traiter les cartes qui nécessitent une étape d’authentification supplémentaire.

Créer un nouveau PaymentIntent avec l’ID du PaymentMethod créé côté client. Vous pouvez confirmer le PaymentIntent en attribuant à la propriété confirm la valeur true lors de la création du PaymentIntent ou appelez confirm après la création. Pour les paiements par carte bancaire, il est également possible de séparer l’autorisation de la capture.

Si le paiement exige des actions supplémentaires comme l’authentification 3D Secure, l’état du PaymentIntent sera défini sur requires_action. Si le paiement a échoué, l’état bascule à nouveau sur requires_payment_method et vous devez envoyer un message d’erreur à votre utilisateur. Si le paiement ne nécessite aucune authentification supplémentaire, un paiement est alors créé et l’état PaymentIntent est défini sur succeeded.

Remarque

Sur les versions de l’API antérieures au 11/02/2019, requires_payment_method correspond à requires_source et requires_action correspond à requires_source_action.

Command Line
curl
curl https://api.stripe.com/v1/payment_intents \ -u
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:
\ -d "payment_method"="{{PAYMENT_METHOD_ID}}" \ -d "amount"=1099 \ -d "currency"="usd" \ -d "confirmation_method"="manual" \ -d "confirm"="true"

Si vous souhaitez enregistrer la carte bancaire pour la réutiliser plus tard, créez un objet Customer pour stocker l’objet PaymentMethod, puis transmettez les paramètres supplémentaires suivants lors de la création du PaymentIntent :

  • client. Défini sur l’ID du client.
  • setup_future_usage. Défini sur off_session pour indiquer à Stripe que vous prévoyez de réutiliser ce PaymentMethod pour des paiements hors session en l’absence de votre client. Définir cette propriété permet d’enregistrer le PaymentMethod pour ce client une fois le PaymentIntent confirmé et toutes les actions requises effectuées par l’utilisateur. Pour en savoir plus, consultez l’exemple de code montrant comment enregistrer des cartes bancaires après un paiement.

Gérer les actions suivantes
Côté client

Écrivez le code qui permettra de traiter les situations qui nécessitent l’intervention de votre client. En règle générale, un paiement aboutit une fois que vous l’avez confirmé sur le serveur à l’étape 4. Cependant, lorsque le PaymentIntent exige une action supplémentaire de la part du client, telle que l’authentification 3D Secure, ce code est alors utilisé.

Utilisez stripe.handleCardAction pour déclencher l’interface utilisateur qui traite les actions du client. Si l’authentification réussit, l’état du PaymentIntent passe à requires_confirmation. Reconfirmez le PaymentIntent sur votre serveur pour finaliser le paiement.

Pour tester votre intégration, utilisez un numéro de carte de test nécessitant une authentification (par exemple, ) afin de forcer ce flux. Si vous utilisez une carte qui ne nécessite aucune authentification (par exemple, ), cette partie du flux sera ignorée et le flux se terminera à l’étape 4.

script.js
const handleServerResponse = async (response) => { if (response.error) { // Show error from server on payment form } else if (response.requires_action) { // Use Stripe.js to handle the required card action const { error: errorAction, paymentIntent } = await stripe.handleCardAction(response.payment_intent_client_secret); if (errorAction) { // Show error from Stripe.js in payment form } else { // The card action has been handled // The PaymentIntent can be confirmed again on the server const serverResponse = await fetch('/pay', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ payment_intent_id: paymentIntent.id }) }); handleServerResponse(await serverResponse.json()); } } else { // Show success message } }

Remarque

L’exécution de stripe.handleCardAction peut prendre plusieurs secondes. Pendant ce temps, bloquez le renvoi de votre formulaire et affichez un indicateur d’attente comme une boucle de progression. Si vous recevez une erreur, montrez-la au client, réactivez le formulaire et masquez l’indicateur d’attente. Si le client doit effectuer des actions supplémentaires pour finaliser le paiement, comme une authentification, Stripe.js le guide tout au long de ce processus.

Reconfirmer le PaymentIntent
Côté serveur

Ce code est exécuté uniquement lorsqu’un paiement nécessite une authentification supplémentaire, comme c’était le cas à l’étape précédente. Le code lui-même n’est pas facultatif, car n’importe quel paiement peut nécessiter cette étape supplémentaire.

À l’aide du même endpoint que celui configuré plus tôt, reconfirmez le PaymentIntent pour mener à bien le paiement et traiter la commande. Veillez à ce que cette confirmation survienne dans l’heure qui suit la tentative de paiement. À défaut, le paiement échouera et repassera à l’état requires_payment_method.

Command Line
curl
curl https://api.stripe.com/v1/payment_intents/{{PAYMENT_INTENT_ID}}/confirm \ -u
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:
\ -X "POST"

Tester l'intégration

​​Pour vérifier que votre intégration est prête, vous avez à votre disposition plusieurs cartes de test dans un bac à sable. Utilisez-les avec n’importe quel CVC et une date d’expiration non échue.

NuméroDescription
Réussite de la transaction et traitement immédiat du paiement.
Authentification requise. Stripe déclenche l’ouverture d’une fenêtre modale demandant au client de s’authentifier.
Échec systématique avec le code de refus de paiement insufficient_funds.

Pour obtenir la liste complète de nos cartes de test, veuillez consulter notre guide de test.

FacultatifDemander une nouvelle saisie du CVC

Cette page vous a-t-elle été utile ?
OuiNon
  • Besoin d'aide ? Contactez le service Support.
  • Rejoignez notre programme d'accès anticipé.
  • Consultez notre log des modifications.
  • Des questions ? Contactez l'équipe commerciale.
  • LLM ? Lire llms.txt.
  • Propulsé par Markdoc