Capturer un paiement en plusieurs fois
Capturez un PaymentIntent en plusieurs fois, dans la limite du montant autorisé.
La multicapture vous permet de capturer plusieurs fois un PaymentIntent créé lors de l’étape de confirmation d’une CheckoutSession pour une seule transaction, dans la limite du montant total du PaymentIntent. Vous pouvez l’utiliser lorsque vous avez des commandes comportant plusieurs envois et que vous souhaitez capturer des fonds au fur et à mesure que vous traitez certaines parties de la commande.
Fonctionnalité IC+
La multicapture fait partie des fonctionnalités que nous proposons aux utilisateurs utilisant la tarification IC+. Si vous bénéficiez d’une tarification Stripe mixte et souhaitez accéder à cette fonctionnalité, contactez le support de Stripe.
Disponibilité
Lorsque vous utilisez la multicapture, tenez compte des restrictions suivantes :
- Seuls les paiements par carte en ligne sont prise en charge
- Elle est disponible avec Amex, Visa, Discover, Mastercard, Cartes Bancaires, Diners Club, China UnionPay (CUP) et Japan Credit Bureau (JCB)
- Les flux de paiements et transferts distincts utilisant source_transaction ne sont pas pris en charge
- Stripe vous permet d’effectuer jusqu’à 50 captures par PaymentIntent
- mode est défini sur
payment
et capture_method est défini surmanual
pour la CheckoutSession
Prise en charge de CUP et JCB
La multicapture CUP n’est disponible qu’aux États-Unis. La multicapture JCB n’est disponible qu’aux États-Unis, au Canada, en Australie et en Nouvelle-Zélande.
Bonnes pratiques
Lorsque vous effectuez plusieurs envois pour une même commande, communiquez à votre client final des informations sur chaque expédition de produits, et ce de manière proactive. Cela permet d’éviter les demandes d’informations et les contestations de paiement de la part de clients qui ne comprendraient pas pourquoi leur relevé bancaire affiche plusieurs transactions. Respectez les bonnes pratiques suivantes lorsque vous informez vos clients :
- Juste avant l’achat, communiquez-leur la date de livraison estimée et le montant de chaque livraison.
- Informez-les de chaque expédition en précisant le montant de la transaction.
- Présentez à votre clientèle une politique de remboursement et d’annulation complète.
Vous pouvez utiliser le champ custom_text lorsque vous créez une nouvelle CheckoutSession pour afficher du texte supplémentaire sur la page de paiement afin de respecter les exigences de conformité.
Conformité
Lorsque vous utilisez la multicapture, vous êtes responsable du respect de l’ensemble des lois, réglementations et règles de réseau en vigueur. Consultez les règles des réseaux de cartes bancaires avec lesquels vous souhaitez utiliser cette fonctionnalité pour vous assurer que vos ventes sont conformes à toutes les règles applicables, qui varient d’un réseau à l’autre. Par exemple, la plupart des réseaux de cartes limitent l’utilisation de la multicapture aux transactions sans carte pour la vente de biens expédiés séparément. Certains réseaux de cartes autorisent la multicapture pour les entreprises en fonction de leur secteur d’activité (par exemple, le tourisme), tandis que d’autres ne l’autorisent pas pour les workflows de dépôt ou de paiement échelonné.
Les informations fournies sur cette page traitant de votre conformité à ces exigences le sont uniquement à titre indicatif, et ne constituent en rien des conseils juridiques, fiscaux, comptables ou autres. Si vous ne savez pas quelles obligations vous devez respecter, consultez un professionnel.
Créer une session Checkout
Ajoutez sur votre site Web un bouton de paiement qui appelle un endpoint côté serveur afin de créer une session Checkout.
<html> <head> <title>Buy cool new product</title> </head> <body> <!-- Use action="/create-checkout-session.php" if your server is PHP based. --> <form action="/create-checkout-session" method="POST"> <button type="submit">Checkout</button> </form> </body> </html>r
Une session Checkout est la représentation programmatique de ce que votre client voit lorsqu’il est redirigé vers le formulaire de paiement. Vous pouvez la configurer à l’aide d’options telles que :
- Les postes à facturer
- Les devises à utiliser
Vous devez indiquer dans success_
l’URL d’une page de votre site Web sur laquelle Checkout renvoie votre client une fois son paiement réalisé. Vous pouvez également indiquer dans cancel_
l’URL de la page de votre site Web vers laquelle Checkout renvoie votre client s’il met fin au processus de paiement avant de finaliser l’achat.
Remarque
Par défaut, les sessions Checkout expirent 24 heures après leur création.
Après avoir créé une session Checkout, redirigez votre client vers l’URL renvoyée dans la réponse.
Enfin, définissez request_multicapture sur if_
pour activer la fonctionnalité de multicapture.
Moyens de paiement
Par défaut, Stripe active les cartes bancaires et autres moyens de paiement courants. Vous avez la possibilité d’activer ou de désactiver des moyens de paiement directement depuis le Dashboard Stripe. Dans Checkout, Stripe évalue la devise et les restrictions éventuelles, puis présente dynamiquement au client les moyens de paiement pris en charge.
Pour visualiser l’affichage des moyens de paiement pour les clients, saisissez un ID de transaction ou définissez le montant et la devise d’une commande dans le Dashboard.
Vous pouvez activer Apple Pay et Google Pay dans vos paramètres des moyens de paiement. Par défaut, Apple Pay est activé et Google Pay est désactivé. Cependant, dans certains cas, Stripe les filtre même lorsqu’ils sont activés. Nous filtrons Google Pay si vous activez les taxes automatiques sans collecter d’adresse de livraison.
Aucune modification de l’intégration n’est requise pour activer Apple Pay ou Google Pay dans les pages hébergées par Stripe de Checkout. Stripe gère ces paiements de la même manière que les autres paiements par carte bancaire.
Capturer le PaymentIntent
Pour un PaymentIntent à l’état requires_capture pour lequel la multicapture est available
, la configuration du paramètre facultatif final_
sur false
indique à Stripe de ne pas débloquer les fonds non capturés restants lors de l’appel de l’API de capture. Par exemple, si vous confirmez une intention de paiement de 10 USD, la capture de 7 USD avec l’attribut final_
conserve l’autorisation pour les 3 USD restants.
Dans la réponse de capture du PI, les champs amount_capturable et amount_received sont mis à jour en conséquence.
// PaymentIntent Response { "id": "pi_ANipwO3zNfjeWODtRPIg", "object": "payment_intent", "amount": 1000, "amount_capturable": 300, // 1000 - 700 = 300 "amount_received": 700, // if latest_charge is expanded "latest_charge": { "id": "ch_xxx", "object": "charge", "amount": 1000, "amount_captured": 700, "amount_refunded": 0, ... } ... }
Capture finale
Le PaymentIntent reste à l’état requires_
jusqu’à ce que vous effectuiez l’une des actions suivantes :
- Définissez
final_
surcapture true
. - Effectuez une capture sans le paramètre
final_
(carcapture final_
est défini par défaut surcapture true
). - La fenêtre d’autorisation expire.
À ce stade, Stripe libère les fonds restants et fait passer le PaymentIntent à l’état succeeded
.
Dans la réponse de capture du PI, les champs amount_capturable et amount_received seront mis à jour en conséquence.
// PaymentIntent Response { "id": "pi_ANipwO3zNfjeWODtRPIg", "object": "payment_intent", "amount": 1000, "amount_capturable": 0, // not 100 due to final_capture=true "amount_received": 900, // 700 + 200 = 900 // if latest_charge is expanded "latest_charge": { "id": "ch_xxx", "object": "charge", "amount": 1000, "amount_captured": 900, "amount_refunded": 0, ... } ... }
Les PaymentIntents non capturés passent à l’état canceled
, tandis que les PaymentIntents partiellement capturés passent à succeeded
.
Tester votre intégration
Utilisez une carte de test Stripe avec n’importe quel CVC, code postal et date d’expiration postérieure à la date du jour pour tester les paiements multicapture.
Numéro | Moyen de paiement | Description |
---|---|---|
pm_ | Cette carte de test prend en charge la multicapture. | |
pm_ | Carte de test Cartes Bancaires ou Visa prenant en charge la multicapture. |
Remboursements
Pour un PaymentIntent à l’état requires_
, vous pouvez effectuer autant de remboursements que vous le souhaitez, dans la limite du montant total capturé moins le montant total remboursé, c’est-à-dire le montant amount_received-amount_refunded. Le champ charge.refunded ne passe à la valeur true
que lorsque la capture finale est effectuée et que l’intégralité du amount_received est remboursée.
Stripe ne prend pas en charge les remboursements partiels avec des paramètres refund_application_fee=true ou reverse_transfer=true. Vous pouvez également effectuer des remboursements partiels de frais en procédant à des remboursements et annulations de transfert manuels, à l’aide des endpoints de remboursement des commissions de la plateforme et d’annulation de transfert. Après avoir utilisé les endpoints de remboursement des commissions de la plateforme ou d’annulation de transfert, Stripe ne prend plus en charge d’autres remboursements avec reverse_
ou refund_
respectivement.
Connect
Les captures multiples sont compatibles avec tous les cas d’usage de Connect, à l’exception des paiements et transferts distincts dotés du paramètre source_transaction. Les paramètres application_fee_amount et transfer_data[amount] font l’objet de validations supplémentaires. Tenez compte des validations suivantes lors de l’implémentation des captures multiples avec Connect :
- Si vous définissez les attributs
application_
oufee_ amount transfer_
lors de la première capture, ils seront obligatoires pour toutes les captures suivantes. Chaquedata[amount] application_
etfee_ amount transfer_
transmis au moment de la capture remplace les valeurs transmises lors de la création, de la confirmation et de la mise à jour de PaymentIntent.data[amount] - Stripe ne prend pas en charge les remboursements partiels sur les paiements multicapture dotés du paramètre « refund_application_fee=true » ou « reverse_transfer=true ». Vous pouvez effectuer des remboursements partiels de frais ou des annulations de transfert à l’aide des endpoints de remboursement des commission de la plateforme et d’annulation de transfert.
Webhooks
Débiter les webhooks mis à jour
Nous envoyons un webhook charge.updated chaque fois que vous capturez un paiement.
Par exemple, lors de la première capture d’un paiement multicapture indirect avec application_
, nous modifions ces champs, passant de valeurs vides à des valeurs non vides.
// charge.updated { "data": { "id": "ch_xxx", "object": "charge", "amount": 1000, "balance_transaction": "txn_xxx", // applicable to all charges "transfer": "tr_xxx", // applicable to destination charges only "application_fee": "fee_xxx", // applicable to Connect only ... }, "previous_attributes": { "balance_transaction": null, // applicable to all charges "transfer": null, // applicable to destination charges only "application_fee": null, // applicable to Connect only } }
payment_intent.amount_capturable_updated
Nous envoyons le payment_intent.amount_capturable_updated à chaque capture, quelles que soient les valeurs amount_
et final_
.
Par exemple, en capturant 1 USD d’un PaymentIntent d’un montant de 10 USD, le champ amount_capturable du PaymentIntent est mis à jour à 9 USD.
// payment_intent.amount_capturable_updated { "data": { "id": "pi_xxx", "object": "payment_intent", "amount": 1000, "amount_capturable": 900 // 1000 - 100 = 900 ... }, "previous_attributes": { "amount_capturable": 1000 } }
Débiter les événements capturés
Nous envoyons un événement charge.captured pour les captures finales ou à la fin de la fenêtre d’autorisation pour annuler l’autorisation du montant non capturé. Le champ captured d’un paiement ne devient true
qu’après une capture finale ou une annulation d’autorisation.
Par exemple, si nous effectuons une capture avec amount=0
et final_
, l’attribut captured du paiement passe de false à true.
// charge.captured { "data": { "id": "ch_xxx", "object": "charge", "captured": true ... }, "previous_attributes": { "captured": false } }
Rembourser des webhooks
Les webhooks de remboursement multicapture sont similaires aux webhooks de remboursement classiques.
Lors de chaque remboursement partiel, nous envoyons un événement refund.created. Pour les comptes connectés, nous envoyons également des événements application_fee.refunded lorsque nous remboursons une commission de plateforme, et des événements transfer.reversed lorsque nous annulons des transferts.