# Accepter un paiement Affirm Comment accepter les paiements Affirm, un moyen de paiement qui permet aux clients d'acheter tout de suite et de payer plus tard. > Ce guide vous aide à intégrer Affirm dans votre tunnel de paiement en ligne. Pour les paiements en personne avec Stripe Terminal, consultez les [moyens de paiement supplémentaires](https://docs.stripe.com/terminal/payments/additional-payment-methods.md). # API Direct Les utilisateurs de Stripe peuvent utiliser l’[API Payment Intents](https://docs.stripe.com/payments/payment-intents.md), un chemin d’intégration unique pour la création de paiements à l’aide de tout moyen pris en charge, pour accepter les paiements avec [Affirm](https://www.affirm.com/) des clients dans les pays suivants : - Canada - États-Unis Voici les différentes étapes nécessaires pour accepter des paiements Affirm sur votre site Web : - Création d’un objet de suivi du paiement - Collecte des informations du moyen de paiement - Envoi du paiement à Stripe à des fins de traitement - Gestion de la redirection Affirm et des événements de webhook pertinents ## Configurer Stripe [Côté serveur] Tout d’abord, [créez un compte Stripe](https://dashboard.stripe.com/register) ou [connectez-vous](https://dashboard.stripe.com/login). Utilisez nos bibliothèques officielles pour accéder à l’API Stripe depuis votre application : #### Ruby ```bash # Available as a gem sudo gem install stripe ``` ```ruby # If you use bundler, you can add this line to your Gemfile gem 'stripe' ``` ## Créer un PaymentIntent [Côté serveur] Un [PaymentIntent](https://docs.stripe.com/api/payment_intents/object.md) est un objet qui représente votre intention d’encaisser le paiement d’un client et qui suit le cycle de vie du processus de paiement étape par étape. Créez tout d’abord un `PaymentIntent` sur votre serveur, puis indiquez le montant à encaisser et la devise. Si votre intégration inclut déjà l’[API Payment Intents](https://docs.stripe.com/payments/payment-intents.md), ajoutez Affirm à la liste des [types de moyens de paiement](https://docs.stripe.com/api/payment_intents/create.md#create_payment_intent-payment_method_types) pour votre `PaymentIntent`. ```curl curl https://api.stripe.com/v1/payment_intents \ -u "<>:" \ -d amount=6000 \ -d currency=usd \ -d "payment_method_types[]=affirm" ``` Vous pouvez également utiliser le composant Element Payment et gérer les moyens de paiement depuis le [Dashboard](https://dashboard.stripe.com/settings/payment_methods). Stripe gère l’affichage des moyens de paiement admissibles en fonction de facteurs tels que le montant de la transaction, la devise et le tunnel de paiement. Pour en savoir plus, consultez la page [Accepter un paiement](https://docs.stripe.com/payments/accept-a-payment.md?payment-ui=elements&api-integration=checkout). ### Récupérer la clé secrète du client Le PaymentIntent contient une *clé secrète* (The client secret is a unique key returned from Stripe as part of a PaymentIntent. This key lets the client access important fields from the PaymentIntent (status, amount, currency) while hiding sensitive ones (metadata, customer)) à utiliser côté client pour finaliser le processus de paiement en toute sécurité. Vous pouvez adopter différentes approches pour transmettre cette clé secrète côté client. #### Application monopage Récupérez la clé secrète du client à partir d’un endpoint sur votre serveur, à l’aide de la fonction `fetch` du navigateur. Cette approche est recommandée si votre côté client est une application d’une seule page, en particulier si elle repose sur un framework front-end moderne tel que React. Créez l’endpoint de serveur qui gère la clé secrète du client : #### Ruby ```ruby get '/secret' do intent = # ... Create or retrieve the PaymentIntent {client_secret: intent.client_secret}.to_json end ``` Récupérez ensuite la clé secrète du client à l’aide JavaScript côté client : ```javascript (async () => { const response = await fetch('/secret'); const {client_secret: clientSecret} = await response.json(); // Render the form using the clientSecret })(); ``` #### Rendu côté serveur Transmettez la clé secrète à votre client depuis votre serveur. Cette approche fonctionne mieux si votre application génère du contenu statique sur le serveur avant de l’envoyer sur le navigateur. Ajoutez le [client_secret](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-client_secret) à votre formulaire de paiement. Dans votre code côté serveur, récupérez la clé secrète du client à partir du PaymentIntent : #### Ruby ```erb
``` ```ruby get '/checkout' do @intent = # ... Fetch or create the PaymentIntent erb :checkout end ``` ## Collecter et envoyer les informations du moyen de paiement [Côté client] Lorsqu’un client clique pour payer avec Affirm, nous vous recommandons d’utiliser [Stripe.js](https://docs.stripe.com/payments/elements.md) pour soumettre le paiement à Stripe. Stripe.js est notre bibliothèque JavaScript de base pour créer les tunnels de paiement : elle gère automatiquement les opérations complexes d’intégration et vous permettra de facilement étendre votre intégration à d’autres moyens de paiement par la suite. Intégrez le script Stripe.js à votre page de paiement en l’ajoutant entre les balises head de votre fichier HTML. ```html Checkout ``` Créez une instance de Stripe.js avec le code JavaScript suivant sur votre page de paiement. ```javascript // Set your publishable key. Remember to change this to your live publishable key in production! // See your keys here: https://dashboard.stripe.com/apikeys var stripe = Stripe( '<>' ); ``` Au lieu de transmettre au client l’objet PaymentIntent dans son intégralité, utilisez la clé secrète du client de l’Étape 2. Cette clé est différente de vos clés API qui servent à authentifier les requêtes à l’API Stripe. Utilisez la clé secrète du client avec prudence, car elle peut servir à mener à bien le paiement. Ne l’enregistrez pas, ne l’intégrez pas dans des URL et ne la dévoilez à personne d’autre que votre client. **Améliorer le taux de paiements réussis en renseignant des informations supplémentaires** Nous vous recommandons de transmettre les informations de [livraison](https://docs.stripe.com/api/payment_intents/create.md#create_payment_intent-shipping) et [facturation](https://docs.stripe.com/api/payment_methods/create.md#create_payment_method-billing_details) pour améliorer les taux de conversion, bien que cela ne soit pas obligatoire. Dans ce guide d’intégration, il vous est conseillé de transmettre les informations de livraison et de facturation côté client après que l’utilisateur a sélectionné son moyen de paiement. Si vous transmettez ces champs, l’adresse de livraison doit comporter des données valides dans les champs `line1`, `city`, `state`, `postal_code` et `country`. De la même manière, les champs `line1`, `city`, `state`, `postal_code` et `country` des informations de facturation doivent être renseignés avec des données valides. **Confirmer le PaymentIntent** Utilisez `stripe.confirmAffirmPayment` pour gérer la redirection depuis votre page et permettre l’exécution du paiement. Vous devez aussi transmettre une [return_url](https://docs.stripe.com/api/payment_intents/create.md#create_payment_intent-return_url) à cette fonction pour indiquer à Stripe vers quelle page rediriger l’utilisateur une fois le paiement effectué sur le site Web ou l’application mobile Affirm. Sur la page de paiement d’Affirm, le client choisit les options de paiement disponibles. Pour plus d’informations, consultez la vue d’ensemble. Vous ne pouvez pas limiter les options de paiement ni en présélectionner sur la page de paiement d’Affirm ; ce choix d’options laissé au client maximise vos chances de conclure des transactions. ```javascript // Redirects away from the client stripe.confirmAffirmPayment( '{{PAYMENT_INTENT_CLIENT_SECRET}}', { payment_method: { // Billing information is optional but recommended to pass in. billing_details: { email: 'jenny@rosen.com', name: 'Jenny Rosen', address: { line1: '1234 Main Street', city: 'San Francisco', state: 'CA', country: 'US', postal_code: '94111', }, }, }, // Shipping information is optional but recommended to pass in. shipping: { name: 'Jenny Rosen', address: { line1: '1234 Main Street', city: 'San Francisco', state: 'CA', country: 'US', postal_code: '94111', }, }, // Return URL where the customer should be redirected after the authorization. return_url: 'https://example.com/checkout/complete', } ).then(function(result) { if (result.error) { // Inform the customer that there was an error. console.log(result.error.message); } }); ``` Lorsque votre client effectue un paiement, Stripe le redirige vers l’URL `return_url` et inclut les paramètres de requête d’URL suivants. La page de redirection peut utiliser ces paramètres pour récupérer l’état du PaymentIntent et ainsi afficher l’état du paiement pour le client. Lorsque vous spécifiez une URL `return_url`, vous pouvez également ajouter vos propres paramètres de requête à utiliser sur la page de redirection. | Paramètre | Description | | ------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `payment_intent` | Identifiant unique du `PaymentIntent`. | | `payment_intent_client_secret` | La [clé secrète du client](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-client_secret) de l’objet `PaymentIntent`. Pour les intégrations d’abonnements, le client_secret est également exposé sur l’objet `Invoice` via [`confirmation_secret`](https://docs.stripe.com/api/invoices/object.md#invoice_object-confirmation_secret) | Lorsque le client est redirigé vers votre site, vous pouvez utiliser le `payment_intent_client_secret` pour interroger le PaymentIntent et communiquer l’état de la transaction à votre client. ## Tester une intégration Affirm Testez votre intégration Affirm en affichant la page de redirection à l’aide de vos clés API de test. Vous pouvez tester la réussite de paiement en l’authentifiant sur la page de redirection. Le PaymentIntent passe alors de l’état `requires_action` à `succeeded`. Pour tester un échec d’authentification de l’utilisateur, utilisez vos clés API de test et accédez à la page de redirection. Sur cette page, cliquez sur **X** dans le coin supérieur gauche. Le PaymentIntent bascule alors de l’état `requires_action` à `requires_payment_method`. Lorsque le système vous redirige vers l’environnement de test d’Affirm, Affirm peut vous demander les quatre derniers chiffres de votre SSN. Affirm suggère d’utiliser `'0000'` ou `'5678'`. ## Optional: Séparer l'autorisation et la capture Affirm prend en charge [l’autorisation et la capture distinctes](https://docs.stripe.com/payments/place-a-hold-on-a-payment-method.md). S’il y a un délai entre le paiement et la livraison des marchandises à votre client, autorisez le paiement d’abord et capturez-le plus tard. Au moment de la capture, Affirm initie les dates d’échéance des remboursements ultérieurs du client. **Vous devez capturer un paiement Affirm autorisé dans les 30 jours suivant l’autorisation**. Dans le cas contraire, l’autorisation est automatiquement annulée et vous ne pouvez plus capturer ce paiement. Stripe annulera également le PaymentIntent et enverra un événement [payment_intent.canceled](https://docs.stripe.com/api/events/types.md#event_types-payment_intent.canceled) si cela se produit. > Pour les commandes d’un montant très élevé, Affirm peut demander un acompte au client lors de l’autorisation. Si vous annulez le paiement ou si l’autorisation expire, Affirm rembourse cet acompte. Si vous ne pouvez pas capturer le paiement, nous vous recommandons d’[annuler le PaymentIntent](https://docs.stripe.com/refunds.md#cancel-payment) plutôt que d’attendre la fin du délai de 30 jours. L’annulation proactive du PaymentIntent déclenche le remboursement immédiat du premier versement échelonné à votre client, ce qui permet d’éviter toute confusion éventuelle concernant les paiements sur son relevé. ### Indiquer à Stripe d’autoriser seulement Pour indiquer que vous voulez séparer l’autorisation de la capture, définissez la valeur de l’option [capture_method](https://docs.stripe.com/api/payment_intents/create.md#create_payment_intent-capture_method) sur `manual` lorsque vous créez le PaymentIntent. Ce paramètre indique à Stripe d’uniquement autoriser le montant sur le compte Affirm du client. ```bash curl https://api.stripe.com/v1/payment_intents \ -u <>: \ -d "amount"=6000 \ -d "confirm"="true" \ -d "currency"="usd" \ -d "payment_method_types[]"="affirm" \ -d "capture_method"="manual" \ // Shipping address is optional but recommended to pass in. -d "shipping[name]"="Jenny Rosen" \ -d "shipping[address][line1]"="1234 Main Street" \ -d "shipping[address][city]"="San Francisco" \ -d "shipping[address][state]"="CA" \ -d "shipping[address][country]"="US" \ -d "shipping[address][postal_code]"=94111 \ -d "payment_method_data[type]"="affirm" \ -d "return_url"="https://www.example.com/checkout/done" ``` ### Capturer les fonds Une fois l’autorisation réussie, l’[état](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-status) du PaymentIntent passe à `requires_capture`. Pour capturer les fonds autorisés, faites une demande de [capture](https://docs.stripe.com/api/payment_intents/capture.md) du PaymentIntent. Le montant total autorisé est capturé par défaut. Vous ne pouvez pas capturer un autre montant que le total. ```bash curl https://api.stripe.com/v1/payment_intents/{{PAYMENT_INTENT_ID}}/capture \ -u <>: \ ``` ### (Facultatif) Annuler l’autorisation Si vous devez annuler une autorisation, vous pouvez [annuler le PaymentIntent](https://docs.stripe.com/refunds.md#cancel-payment) correspondant. ## Optional: Gérer la redirection Affirm manuellement Nous vous recommandons d’utiliser Stripe.js pour gérer les redirections et les paiements Affirm côté client avec `confirmAffirmPayment`. Le recours à Stripe.js vous permettra de facilement ajouter de nouveaux moyens de paiement à votre intégration par la suite. Toutefois, vous pouvez aussi rediriger manuellement vos clients sur votre serveur en procédant comme suit : - Créez et confirmez un [PaymentIntent](https://docs.stripe.com/api/payment_intents/object.md) de type `affirm`. En précisant le paramètre `payment_method_data`, nous créons un *PaymentMethod* (PaymentMethods represent your customer's payment instruments, used with the Payment Intents or Setup Intents APIs) et l’utilisons immédiatement avec ce PaymentIntent. Vous devez également fournir dans le champ `return_url` l’URL vers laquelle votre client est redirigé une fois qu’il a finalisé son paiement. Vous pouvez fournir vos propres paramètres de requête dans cette URL. Ils seront inclus dans l’URL finale à l’issue du flux de redirection. ```bash curl https://api.stripe.com/v1/payment_intents \ -u <>: \ -d "amount"=6000 \ -d "confirm"="true" \ -d "currency"="usd" \ -d "payment_method_types[]"="affirm" \ // Shipping address is optional but recommended to pass in. -d "shipping[name]"="Jenny Rosen" \ -d "shipping[address][line1]"="1234 Main Street" \ -d "shipping[address][city]"="San Francisco" \ -d "shipping[address][state]"="CA" \ -d "shipping[address][country]"="US" \ -d "shipping[address][postal_code]"=94111 \ // Billing details are optional but recommended to pass in. -d "payment_method_data[billing_details][name]"="Jenny Rosen" \ -d "payment_method_data[billing_details][email]"="jenny@example.com" \ -d "payment_method_data[billing_details][address][line1]"="1234 Main Street" \ -d "payment_method_data[billing_details][address][city]"="San Francisco" \ -d "payment_method_data[billing_details][address][state]"="CA" \ -d "payment_method_data[billing_details][address][country]"="US" \ -d "payment_method_data[billing_details][address][postal_code]"=94111 \ -d "payment_method_data[type]"="affirm" \ -d "return_url"="https://example.com/checkout/complete" ``` Le `PaymentIntent` créé se trouve à l’état `requires_action` et le type de `next_action` est `redirect_to_url`. ```json { "status": "requires_action", "next_action": { "type": "redirect_to_url", "redirect_to_url": { "url": "https://hooks.stripe.com/...", "return_url": "https://example.com/checkout/complete" } }, "id": "pi_xxx", "object": "payment_intent", "amount": 6000, "client_secret": "pi_xxx_secret_xxx", "confirm": "true", "confirmation_method": "automatic", "created": 1579259303, "currency": "usd", "livemode": true, "charges": { "data": [], "object": "list", "has_more": false, "url": "/v1/charges?payment_intent=pi_xxx" }, "payment_method_types": [ "affirm" ] } ``` - Redirigez le client vers l’URL fournie dans la propriété `next_action.redirect_to_url.url`. L’exemple de code fourni ici n’a qu’une valeur illustrative : la méthode de redirection peut différer sur votre framework web. À l’issue du processus de paiement, le client est redirigé vers `return_url` configurée à l’étape 1. Les paramètres de requête `payment_intent` et `payment_intent_client_secret` de l’URL sont inclus. Si `return_url` incluait déjà des paramètres de requête, ils seront conservés eux aussi. Nous vous recommandons d’[utiliser des webhooks](https://docs.stripe.com/payments/payment-intents/verifying-status.md#webhooks) afin de confirmer l’état du paiement. ## Optional: Gérer les événements post-paiement Stripe envoie un événement [payment_intent.succeeded](https://docs.stripe.com/api/events/types.md#event_types-payment_intent.succeeded) à l’issue du paiement. Utilisez le Dashboard, un *webhook* (A webhook is a real-time push notification sent to your application as a JSON payload through HTTPS requests) personnalisé ou une solution partenaire pour recevoir ces événements et exécuter des actions, comme envoyer une confirmation de commande par e-mail à votre client, enregistrer la vente dans une base de données ou lancer un workflow de livraison. Plutôt que d’attendre un rappel de votre client, écoutez ces événements. En effet, côté client, l’acheteur pourrait fermer la fenêtre de son navigateur ou quitter l’application avant l’exécution du rappel. Des personnes malveillantes peuvent en profiter pour manipuler la réponse. Si vous configurez votre intégration de manière à écouter les événements asynchrones, cela vous permettra également d’accepter de nouveaux moyens de paiement plus facilement à l’avenir. Apprenez-en davantage sur les [différences entre les différents moyens de paiement pris en charge](https://stripe.com/payments/payment-methods-guide). - **Gérer les événements manuellement dans le Dashboard** Utilisez le Dashboard pour [afficher vos paiements de test dans le Dashboard](https://dashboard.stripe.com/test/payments), envoyer des reçus par e-mail, gérer les virements ou réessayer les paiements échoués. - **Créer un webhook personnalisé** [Créez un gestionnaire de webhooks personnalisé](https://docs.stripe.com/webhooks/handling-payment-events.md#build-your-own-webhook) pour écouter les événements et concevoir des flux de paiement asynchrones sur mesure. Testez et déboguez votre intégration de webhooks en local avec la Stripe CLI. - **Intégrer une application prédéfinie** Gérez les événements commerciaux courants, tels que l’[automatisation](https://stripe.partners/?f_category=automation) ou le [marketing et les ventes](https://stripe.partners/?f_category=marketing-and-sales), en intégrant une application partenaire. ## Optional: Afficher des informations relatives aux moyens de paiement sur votre site Web Le composant [Payment Method Messaging Element](https://docs.stripe.com/js/elements_object/create_element?type=paymentMethodMessaging) est un composant d’interface utilisateur intégrable qui permet à vos clients de savoir quelles options de paiement différé leur seront proposées, directement depuis vos pages de produit, de panier ou de paiement. Pour ajouter le composant Payment Method Messaging Element à votre site Web, veuillez consulter le [guide dédié](https://docs.stripe.com/elements/payment-method-messaging.md). ## Échecs de paiement Affirm prend en compte de nombreux facteurs pour accepter ou refuser une transaction (par exemple, la durée d’utilisation d’Affirm par le client, le montant restant que le client doit rembourser et la valeur de la commande actuelle). Présentez toujours des options de paiement supplémentaires telles que `card` dans votre tunnel de paiement, car les paiements Affirm ont un taux de refus supérieur aux autres moyens de paiement. Dans ces cas, le [PaymentMethod](https://docs.stripe.com/api/payment_methods/object.md) est détaché et l’état de l’objet [PaymentIntent](https://docs.stripe.com/api/payment_intents/object.md) passe automatiquement à `requires_payment_method`. Hormis le refus d’un paiement, pour un [PaymentIntent](https://docs.stripe.com/api/payment_intents/object.md) d’Affirm avec un état `requires_action`, il est attendu des clients qu’ils effectuent le paiement sous 12 heures une fois qu’ils ont été redirigés vers le site d’Affirm. Si aucune action n’est prise dans les 12 heures, le [PaymentMethod](https://docs.stripe.com/api/payment_methods/object.md) est détaché et l’état de l’objet [PaymentIntent](https://docs.stripe.com/api/payment_intents/object.md) passe automatiquement à `requires_payment_method`. Dans ce cas, informez votre client pour réessayer avec une option de paiement différente présentée dans votre tunnel de paiement. ## Codes d’erreur Voici les codes d’erreur courants et les actions recommandées correspondantes : | Code d’erreur | Action recommandée | | ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `payment_intent_payment_attempt_failed` | Échec générique indiquant que le paiement Affirm a échoué. Des informations supplémentaires peuvent être disponibles dans la raison du résultat du charge. | | `payment_method_provider_decline` | Affirm a refusé le paiement du client. Le client doit désormais contacter Affirm pour obtenir plus d’informations. | | `payment_intent_payment_attempt_expired` | Le client n’a jamais finalisé le paiement sur la page de paiement d’Affirm, et la session de paiement a expiré. Stripe abandonne automatiquement les PaymentIntents qui n’ont pas été autorisés avec succès 12 heures après la création initiale du paiement. | | `payment_method_not_available` | Affirm a rencontré une erreur liée au service et n’est pas en mesure de répondre à la demande. Réessayez ultérieurement. | | `amount_too_small` | Saisissez un montant compris dans les [limites de transaction par défaut](https://docs.stripe.com/payments/affirm.md#payment-options) d’Affirm. | | `amount_too_large` | Saisissez un montant compris dans les [limites de transaction par défaut](https://docs.stripe.com/payments/affirm.md#payment-options) d’Affirm. | Pour certaines erreurs, des informations supplémentaires peuvent être fournies dans le motif de l’erreur de paiement : | Motif de l’erreur | Signification | | -------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `generic_decline` | Raison de résultat par défaut pour une erreur de paiement. Cela indique généralement que le partenaire a refusé le paiement (par exemple en raison de fonds insuffisants), que la banque émettrice a refusé le charge, que la transaction impliquait un achat à haut risque ou une raison similaire. Stripe peut ne pas toujours recevoir la raison du refus dans ces cas. | | `affirm_checkout_canceled` | Soit le client a annulé le paiement Affirm, soit Affirm a rejeté l’éligibilité du client au prêt. Stripe ne peut pas faire la différence entre ces deux types d’événements. |