Capturer un paiement en plusieurs fois
La multicapture vous permet de capturer un PaymentIntent plusieurs fois pour une seule autorisation, dans la limite du montant total du PaymentIntent. Vous pouvez utiliser cette option 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 de la tarification IC+. Si vous utilisez la tarification mixte de Stripe et que souhaitez accéder à cette fonctionnalité, contactez le service d’assistance de Stripe.
Disponibilité
Lorsque vous utilisez la multicapture, tenez compte des restrictions suivantes :
- La multicapture est uniquement prise en charge pour les paiements en ligne par carte bancaire
- Disponible uniquement avec Amex, Visa, Discover et Mastercard
- 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
Bêta
L’accès à la multicapture pour Cartes Bancaires est une nouvelle fonctionnalité, actuellement limitée aux utilisateurs de la version bêta. Contactez-nous ici pour obtenir un accès.
Bonnes pratiques
Si 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, afin 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. Pour ce faire, nous vous recommandons d’appliquer les bonne pratiques suivantes :
- Juste avant l’achat, communiquez au client la date de livraison estimée et le montant de chaque livraison.
- Informez votre client de chaque expédition en précisant son montant.
- Présentez à votre clientèle une politique de remboursement et d’annulation complète.
Ces bonnes pratiques peuvent être exigées par les règles de réseau en vigueur, selon le réseau concerné.
Conformité
Lorsque vous avez recours à des captures multiples, vous êtes responsable du respect de l’ensemble des lois, réglementations et règles du réseau en vigueur. Consultez les règles des réseaux de cartes avec lesquels vous souhaitez utiliser cette fonctionnalité afin que vos transactions respectent l’ensemble des règles applicables, lesquelles varient d’un réseau à l’autre. Par exemple, la plupart des réseaux de cartes réservent l’utilisation de la multicapture aux transactions carte non présente pour lesquelles les produits sont expédiés séparément. Certains réseaux de cartes autorisent les captures multiples pour les entreprises de certains secteurs d’activité (par exemple, les voyages), tandis que d’autres n’autorisent pas les captures multiples pour les flux de dépôt de fonds ou de versements échelonnés.
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 n’êtes pas certains des obligations auxquels vous êtes soumis, consultez un professionnel.
Créer et confirmer un PaymentIntent non capturé
Pour indiquer que vous souhaitez séparer l’autorisation de la capture, définissez capture_method sur manual
lors de la création du PaymentIntent. Pour en savoir plus sur la séparation entre l’autorisation et la capture, consultez la page Bloquer une somme d’argent sur un moyen de paiement.
Utilisez les paramètres if_available
ou never
pour demander une multi-capture pour ce paiement.
if_available
: le PaymentIntent créé autorisera plusieurs captures, si le moyen de paiement le permet.never
: le PaymentIntent créé ne permettra pas les captures multiples
Dans la réponse, le champ payment_method_details.card.multicapture.status
de latest_charge contient available
ou unavailable
selon le moyen de paiement du client.
// PaymentIntent Response { "id": "pi_xxx", "object": "payment_intent", "amount": 1000, "amount_capturable": 1000, "amount_received": 0, ... // if latest_charge is expanded "latest_charge": { "id": "ch_xxx", "object": "charge", "amount": 1000, "amount_captured": 0, "amount_refunded": 0, "payment_method_details": { "card": { "multicapture": { "status": "available" // or "unavailable" } } } ... } ... }
Capturer le PaymentIntent
Pour un PaymentIntent à l’état requires_capture pour lequel la multicapture est available
, configurer le paramètre facultatif final_capture
sur false
permet de demander à 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 un Payment Intent de 10 USD, la capture de 7 USD avec le paramétrage final_capture=false
conserve les 3 USD autorisés 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_capture
jusqu’à ce que vous effectuiez l’une des actions suivantes :
- Définir
final_capture
surtrue
- Effectuer une capture sans le paramètre
final_capture
(carfinal_capture
est défini par défaut surtrue
) - 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_card_visa | Cette carte de test prend en charge la multicapture. |
Remboursements
Pour un PaymentIntent à l’état requires_capture
, 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 amount_received - amount_refunded. Le champ charge.refunded ne passe à « true » que lorsque la capture finale est effectuée et que l’intégralité du montant amount_received est remboursé.
Stripe ne prend pas en charge les remboursements partiels avec paramétrage refund_application_fee=true ou reverse_transfer=true. Vous pouvez cependant effectuer des remboursements partiels de frais en procédant à des remboursements et annulations de transfert manuels, à l’aide des endpoints de remboursement de commission de la plateforme et d’annulation de transfert. Une fois que vous avez 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 refund_application_fee=true ou reverse_transfer=true.
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_fee_amount
outransfer_data[amount]
lors de la première capture, ils seront obligatoires pour toutes les captures suivantes. Chaque valeurapplication_fee_amount
ettransfer_data[amount]
transmise au moment de la capture remplace les valeurs transmises lors de la création, la confirmation et la mise à jour du PaymentIntent. - Stripe ne prend pas en charge les remboursements partiels sur les paiements à captures multiples dotés du paramétrage 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_fee_amount
, 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_to_capture et final_capture.
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_capture=true
, 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 charge.refunded. Pour les comptes connectés, nous envoyons également des événements application_fee.refunded lorsque nous remboursons les frais de plateforme, et transfer.reversed lorsque nous annulons les transferts.