# Capturer un paiement en plusieurs fois

Capturez un PaymentIntent en plusieurs fois, dans la limite du montant autorisé.

# Page hébergée par Stripe

> This is a Page hébergée par Stripe for when platform is web and ui is stripe-hosted. View the full page at https://docs.stripe.com/payments/multicapture?platform=web&ui=stripe-hosted.

La multicapture vous permet de [capturer plusieurs fois un PaymentIntent](https://docs.stripe.com/api/payment_intents/capture.md) créé lors de l’étape de confirmation d’une [CheckoutSession](https://docs.stripe.com/api/checkout_sessions.md) pour une seule transaction, dans la limite du [montant total du PaymentIntent](https://docs.stripe.com/api/payment_intents/create.md#create_payment_intent-amount). 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 de la *tarification IC+*. Si vous utilisez la tarification mixte de Stripe et souhaitez accéder à cette fonctionnalité, contactez-nous via le formulaire du [service de support Stripe](https://support.stripe.com).

## Disponibilité

Lorsque vous utilisez la multicapture, tenez compte des restrictions suivantes&nbsp;:

- 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](https://docs.stripe.com/connect/separate-charges-and-transfers.md) utilisant [source_transaction](https://docs.stripe.com/api/transfers/create.md#create_transfer-source_transaction) ne sont pas pris en charge
- Stripe vous permet d’effectuer jusqu’à 50&nbsp;captures par [PaymentIntent](https://docs.stripe.com/api/payment_intents.md)
- [mode](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-mode) est défini sur `payment` et [capture_method](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-payment_intent_data-capture_method) est défini sur `manual` pour la [CheckoutSession](https://docs.stripe.com/api/checkout/sessions/.md)

> #### 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&nbsp;:

- 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](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-custom_text) lorsque vous créez une nouvelle [CheckoutSession](https://docs.stripe.com/api/checkout_sessions.md) 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](https://docs.stripe.com/api/checkout/sessions/create.md).

```html
<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&nbsp;:

- Les [postes](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-line_items) à facturer
- Les devises à utiliser

Vous devez renseigner la valeur `success_url` avec l’URL d’une page de votre site web vers laquelle Checkout redirige votre client une fois le paiement effectué.

> Par défaut, les sessions Checkout expirent 24&nbsp;heures après leur création.

Après avoir créé une session Checkout, redirigez votre client vers l’[URL](https://docs.stripe.com/api/checkout/sessions/object.md#checkout_session_object-url) renvoyée dans la réponse.

Enfin, définissez [request_multicapture](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-payment_method_options-card-request_multicapture) sur `if_available` pour activer la fonctionnalité de multicapture.

#### Ruby

```ruby
# This example sets up an endpoint using the Sinatra framework.


require 'json'
require 'sinatra'
require 'stripe'

# Don't put any keys in code. See https://docs.stripe.com/keys-best-practices.
# Find your keys at https://dashboard.stripe.com/apikeys.
client = Stripe::StripeClient.new('<<YOUR_SECRET_KEY>>')

post '/create-checkout-session' do
  session = client.v1.checkout.sessions.create({
    line_items: [{
      price_data: {
        currency: 'usd',
        product_data: {
          name: 'T-shirt'
        },
        unit_amount: 2000
      },
      quantity: 1
    }],payment_intent_data: {
      capture_method: 'manual'
    },
    payment_method_options: {
      card: {
        request_multicapture: 'if_available'
      }
    },
    mode: 'payment',
    # These placeholder URLs will be replaced in a following step.
    success_url: 'https://example.com/success'
  })

  redirect session.url, 303
end
```

### 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](https://dashboard.stripe.com/settings/payment_methods). 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&nbsp;Pay et Google&nbsp;Pay dans vos [paramètres des moyens de paiement](https://dashboard.stripe.com/settings/payment_methods). Par défaut, Apple&nbsp;Pay est activé et Google&nbsp;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](https://docs.stripe.com/tax/checkout.md) sans collecter d’adresse de livraison.

Aucune modification de l’intégration n’est requise pour activer Apple&nbsp;Pay ou Google&nbsp;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](https://docs.stripe.com/payments/paymentintents/lifecycle.md) pour lequel la multicapture est `available`, la configuration du paramètre facultatif `final_capture` 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&nbsp;USD, la capture de 7&nbsp;USD avec l’attribut `final_capture=false` conserve l’autorisation pour les 3&nbsp;USD restants.

```curl
curl https://api.stripe.com/v1/payment_intents/pi_xxx/capture \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d amount_to_capture=700 \
  -d final_capture=false \
  -d "expand[]=latest_charge"
```

Dans la réponse de capture du PI, les champs [amount_capturable](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-amount_capturable) et [amount_received](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-amount_received) sont mis à jour en conséquence.

```json
// 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&nbsp;:

- Définissez `final_capture` sur `true`.
- Effectuez une capture sans le paramètre `final_capture` (car `final_capture` est défini par défaut sur `true`).
- La fenêtre d’autorisation expire.

À ce stade, Stripe libère les fonds restants et fait passer le PaymentIntent à l’état `succeeded`.

```curl
curl https://api.stripe.com/v1/payment_intents/pi_xxx/capture \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d amount_to_capture=200 \
  -d final_capture=true \
  -d "expand[]=latest_charge"
```

Dans la réponse de capture du PI, les champs [amount_capturable](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-amount_capturable) et [amount_received](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-amount_received) seront mis à jour en conséquence.

```json
// 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`.

## Optional: Débloquer les fonds non capturés

Si vous souhaitez débloquer les fonds non capturés pour un paiement partiellement capturé, définissez le montant sur 0 et `final_capture` sur `true`.

```curl
curl https://api.stripe.com/v1/payment_intents/pi_xxx/capture \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d amount_to_capture=0 \
  -d final_capture=true
```

L’état du PaymentIntent passe à `succeeded` et les fonds non capturés sont restitués au titulaire de la carte.

## 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                                                               |
| ---------------- | ---------------------------------------------- | ------------------------------------------------------------------------- |
| 4242424242424242 | `pm_card_visa`                                 | Carte bancaire de test qui prend en charge la multicapture.               |
| 4000002500001001 | `pm_card_visa_cartesBancaires`                 | Carte de test Cartes Bancaires ou Visa prenant en charge la multicapture. |
| 4000008400000076 | `pm_card_credit_disableEnterpriseCardFeatures` | Carte bancaire de test qui ne prend pas en charge la multicapture.        |

## Remboursements

Pour un PaymentIntent à l’état `requires_capture`, vous pouvez effectuer autant de [remboursements](https://docs.stripe.com/api/refunds.md) que vous le souhaitez, dans la limite du montant total capturé moins le montant total remboursé, c’est-à-dire le montant [amount_received](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-amount_received)-[amount_refunded](https://docs.stripe.com/api/charges/object.md#charge_object-amount_refunded). Le champ [charge.refunded](https://docs.stripe.com/api/charges/object.md#charge_object-refunded) ne passe à la valeur `true` que lorsque la capture finale est effectuée et que l’intégralité du [amount_received](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-amount_received) est remboursée.

Stripe ne prend pas en charge les *remboursements partiels* (A partial refund is any refund in which less than the remaining refundable amount is refunded in a single request. The remaining refundable amount is the payment_intent.amount_received - charge.amount_refunded) avec des paramètres [refund_application_fee=true](https://docs.stripe.com/api/refunds/create.md#create_refund-refund_application_fee) ou [reverse_transfer=true](https://docs.stripe.com/api/refunds/create.md#create_refund-reverse_transfer). 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](https://docs.stripe.com/api/fee_refunds.md) et d’[annulation de transfert](https://docs.stripe.com/api/transfer_reversals.md). 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_transfer=true` ou `refund_application_fee=true` respectivement.

## Connect

Les captures multiples sont compatibles avec tous les cas d’usage de Connect, à l’exception des [paiements et transferts distincts](https://docs.stripe.com/connect/separate-charges-and-transfers.md) dotés du paramètre [source_transaction](https://docs.stripe.com/api/transfers/create.md#create_transfer-source_transaction). Les paramètres [application_fee_amount](https://docs.stripe.com/api/payment_intents/capture.md#capture_payment_intent-application_fee_amount) et [transfer_data[amount]](https://docs.stripe.com/api/payment_intents/capture.md#capture_payment_intent-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&nbsp;:

- Si vous définissez les attributs `application_fee_amount` ou `transfer_data[amount]` lors de la première capture, ils seront obligatoires pour toutes les captures suivantes. Chaque `application_fee_amount` et `transfer_data[amount]` 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.
- Stripe ne prend pas en charge les *remboursements partiels* (A partial refund is any refund in which less than the remaining refundable amount is refunded in a single request. The remaining refundable amount is the payment_intent.amount_received - charge.amount_refunded) sur les paiements multicapture dotés du paramètre «&nbsp;refund_application_fee=true&nbsp;» ou «&nbsp;reverse_transfer=true&nbsp;». Vous pouvez effectuer des remboursements partiels de frais ou des annulations de transfert à l’aide des endpoints de [remboursement des commission de la plateforme](https://docs.stripe.com/api/fee_refunds.md) et d’[annulation de transfert](https://docs.stripe.com/api/transfer_reversals.md).

## Webhooks

### Débiter les webhooks mis à jour

Nous envoyons un webhook [charge.updated](https://docs.stripe.com/api/events/types.md#event_types-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.

```json
// 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](https://docs.stripe.com/api/events/types.md#event_types-payment_intent.amount_capturable_updated) à chaque capture, quelles que soient les valeurs `amount_to_capture` et `final_capture`.

Par exemple, en capturant 1&nbsp;USD d’un PaymentIntent d’un montant de 10&nbsp;USD, le champ amount_capturable du PaymentIntent est mis à jour à 9&nbsp;USD.

```json
// 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](https://docs.stripe.com/api/events/types.md#event_types-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](https://docs.stripe.com/api/charges/object.md#charge_object-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](https://docs.stripe.com/api/charges/object.md#charge_object-captured) du paiement passe de false à true.

```json
// 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](https://docs.stripe.com/api/events/types.md#event_types-refund.created). Pour les comptes connectés, nous envoyons également des événements [application_fee.refunded](https://docs.stripe.com/api/events/types.md#event_types-application_fee.refunded) lorsque nous remboursons une commission de plateforme, et des événements [transfer.reversed](https://docs.stripe.com/api/events/types.md#event_types-transfer.reversed) lorsque nous annulons des transferts.


# Formulaire intégré

> This is a Formulaire intégré for when platform is web and ui is embedded-form. View the full page at https://docs.stripe.com/payments/multicapture?platform=web&ui=embedded-form.

La multicapture vous permet de [capturer plusieurs fois un PaymentIntent](https://docs.stripe.com/api/payment_intents/capture.md) créé lors de l’étape de confirmation d’une [CheckoutSession](https://docs.stripe.com/api/checkout_sessions.md) pour une seule transaction, dans la limite du [montant total du PaymentIntent](https://docs.stripe.com/api/payment_intents/create.md#create_payment_intent-amount). 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 de la *tarification IC+*. Si vous utilisez la tarification mixte de Stripe et souhaitez accéder à cette fonctionnalité, contactez-nous via le formulaire du [service de support Stripe](https://support.stripe.com).

## Disponibilité

Lorsque vous utilisez la multicapture, tenez compte des restrictions suivantes&nbsp;:

- 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](https://docs.stripe.com/connect/separate-charges-and-transfers.md) utilisant [source_transaction](https://docs.stripe.com/api/transfers/create.md#create_transfer-source_transaction) ne sont pas pris en charge
- Stripe vous permet d’effectuer jusqu’à 50&nbsp;captures par [PaymentIntent](https://docs.stripe.com/api/payment_intents.md)
- [mode](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-mode) est défini sur `payment` et [capture_method](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-payment_intent_data-capture_method) est défini sur `manual` pour la [CheckoutSession](https://docs.stripe.com/api/checkout/sessions/.md)

> #### 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&nbsp;:

- 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](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-custom_text) lorsque vous créez une nouvelle [CheckoutSession](https://docs.stripe.com/api/checkout_sessions.md) 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

Depuis votre serveur, créez une *Checkout Session* (A Checkout Session represents your customer's session as they pay for one-time purchases or subscriptions through Checkout. After a successful payment, the Checkout Session contains a reference to the Customer, and either the successful PaymentIntent or an active Subscription) et définissez l’[ui_mode](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-ui_mode) sur `embedded_page`. Vous pouvez configurer la [Checkout Session](https://docs.stripe.com/api/checkout/sessions/create.md) avec des [postes](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-line_items) à inclure et des options telles qu’une [devise](https://docs.stripe.com/api/checkout/sessions/object.md#checkout_session_object-currency).

Pour rediriger vos clients vers une page personnalisée hébergée sur votre site Web, spécifiez l’URL de cette page dans le paramètre [return_url](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-return_url). Incluez la variable de modèle `{CHECKOUT_SESSION_ID}` dans l’URL pour récupérer l’état de la session sur la page de retour. Checkout remplace automatiquement la variable par l’ID de session Checkout avant la redirection.

En savoir plus sur la [configuration de la page](https://docs.stripe.com/payments/accept-a-payment.md?payment-ui=checkout&ui=embedded-form#return-page) de retour et d’autres options pour [personnaliser le comportement](https://docs.stripe.com/payments/checkout/custom-success-page.md?payment-ui=embedded-form) de redirection.

Après avoir créé la session Checkout, utilisez la `client_secret` renvoyée dans la réponse pour [monter Checkout](https://docs.stripe.com/payments/multicapture.md#mount-checkout).

Pour activer la fonctionnalité de multicapture, définissez [request_multicapture](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-payment_method_options-card-request_multicapture) sur `if_available`.

#### Ruby

```ruby
# This example sets up an endpoint using the Sinatra framework.
require 'json'
require 'sinatra'
require 'stripe'

# Don't put any keys in code. See https://docs.stripe.com/keys-best-practices.
# Find your keys at https://dashboard.stripe.com/apikeys.
client = Stripe::StripeClient.new('<<YOUR_SECRET_KEY>>')

post '/create-checkout-session' do
  session = client.v1.checkout.sessions.create({
    line_items: [{
      price_data: {
        currency: 'usd',
        product_data: {
          name: 'T-shirt',
        },
        unit_amount: 2000,
      },
      quantity: 1,
    }],
    mode: 'payment',
    ui_mode: 'embedded_page',payment_method_options: {
      card: {
        request_multicapture: 'if_available',
      },
    },
    return_url: 'https://example.com/checkout/return?session_id={CHECKOUT_SESSION_ID}'
  })

  {clientSecret: session.client_secret}.to_json
end
```

### 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](https://dashboard.stripe.com/settings/payment_methods). 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&nbsp;Pay et Google&nbsp;Pay dans vos [paramètres des moyens de paiement](https://dashboard.stripe.com/settings/payment_methods). Par défaut, Apple&nbsp;Pay est activé et Google&nbsp;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](https://docs.stripe.com/tax/checkout.md) sans collecter d’adresse de livraison.

Aucune modification de l’intégration n’est requise pour activer Apple&nbsp;Pay ou Google&nbsp;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.

## Monter Checkout

#### HTML + JS

Checkout est disponible dans [Stripe.js](https://docs.stripe.com/js.md). Intégrez le script Stripe.js à votre page en l’ajoutant à l’en-tête de votre fichier HTML. Ensuite, créez un nœud DOM vide (conteneur) à utiliser pour le montage.

```html
<head>
  <script src="https://js.stripe.com/dahlia/stripe.js"></script>
</head>
<body>
  <div id="checkout">
    <!-- Checkout will insert the payment form here -->
  </div>
</body>
```

Initialisez Stripe.js avec votre clé API publique.

Créez une fonction `fetchClientSecret` asynchrone qui demande à votre serveur de créer la session Checkout et de récupérer la clé secrète du client. Transmettez cette fonction dans la propriété `options` lorsque vous créez l’instance Checkout&nbsp;:

```javascript
// Initialize Stripe.js
const stripe = Stripe('<<YOUR_PUBLISHABLE_KEY>>');

initialize();

// Fetch Checkout Session and retrieve the client secret
async function initialize() {
  const fetchClientSecret = async () => {
    const response = await fetch("/create-checkout-session", {
      method: "POST",
    });
    const { clientSecret } = await response.json();
    return clientSecret;
  };

  // Initialize Checkout
  const checkout = await stripe.createEmbeddedCheckoutPage({
    fetchClientSecret,
  });

  // Mount Checkout
  checkout.mount('#checkout');
}
```

#### React

Installez [react-stripe-js](https://docs.stripe.com/sdks/stripejs-react.md) et le chargeur Stripe.js à partir de npm&nbsp;:

```bash
npm install --save @stripe/react-stripe-js @stripe/stripe-js
```

Pour utiliser le composant Checkout intégré, créez un `EmbeddedCheckoutProvider`. Appelez `loadStripe` avec votre clé API publique et transmettez la valeur `Promise` au prestataire.

Créez une fonction `fetchClientSecret` asynchrone qui demande à votre serveur de créer la session Checkout et de récupérer la clé secrète du client. Transmettez cette fonction dans la propriété `options` acceptée par le prestataire.

```jsx
import * as React from 'react';
import {loadStripe} from '@stripe/stripe-js';
import {
  EmbeddedCheckoutProvider,
  EmbeddedCheckout
} from '@stripe/react-stripe-js';

// Make sure to call `loadStripe` outside of a component’s render to avoid
// recreating the `Stripe` object on every render.
const stripePromise = loadStripe('pk_test_123');

const App = () => {
  const fetchClientSecret = React.useCallback(() => {
    // Create a Checkout Session
    return fetch("/create-checkout-session", {
      method: "POST",
    })
      .then((res) => res.json())
      .then((data) => data.clientSecret);
  }, []);

  const options = {fetchClientSecret};

  return (
    <div id="checkout">
      <EmbeddedCheckoutProvider
        stripe={stripePromise}
        options={options}
      >
        <EmbeddedCheckout />
      </EmbeddedCheckoutProvider>
    </div>
  )
}
```

Checkout s’affiche dans un iframe qui envoie de manière sécurisée les informations de paiement à Stripe via une connexion HTTPS.

> Évitez de placer Checkout dans un autre iframe, car certains moyens de paiement nécessitent une redirection vers une autre page pour la confirmation du paiement.

### Personnaliser l’apparence

Personnalisez Checkout pour qu’il corresponde au design de votre site en définissant la couleur d’arrière-plan, la couleur des boutons, le rayon de la bordure et les polices dans les [paramètres de marque](https://dashboard.stripe.com/settings/branding) de votre compte.

Par défaut, Checkout s’affiche sans espacement externe ni marge. Nous vous recommandons d’utiliser un élément de conteneur tel qu’un espace div pour appliquer la marge souhaitée (par exemple, 16&nbsp;px sur tous les côtés).

## Afficher une page de retour

Une fois que votre client a effectué une tentative de paiement, Stripe le redirige vers une page de retour que vous hébergez sur votre site. Lors de la création de la session Checkout, vous avez renseigné l’URL de la page de retour dans le paramètre [return_url](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-return_url). En savoir plus sur les autres options de [personnalisation du comportement de redirection](https://docs.stripe.com/payments/checkout/custom-success-page.md?payment-ui=embedded-form).

Lors de l’affichage de votre page de retour, récupérez l’état de la session Checkout à l’aide de l’ID de session Checkout dans l’URL. Traitez le résultat en fonction de l’état de la session comme suit&nbsp;:

- `complete`&nbsp;: Le paiement a abouti. Utilisez les informations de la session Checkout pour afficher une page de confirmation.
- `open`&nbsp;: Le paiement a échoué ou a été annulé. Montez à nouveau Checkout pour que votre client puisse effectuer une nouvelle tentative.

#### Ruby

```ruby
get '/session-status' do
  session = client.v1.checkout.sessions.retrieve(params[:session_id])

  {status: session.status, customer_email:  session.customer_details.email}.to_json
end
```

```javascript
const session = await fetch(`/session_status?session_id=${session_id}`)
if (session.status == 'open') {
  // Remount embedded Checkout
} else if (session.status == 'complete') {
  // Show success page
  // Optionally use session.payment_status or session.customer_email
  // to customize the success page
}
```

#### Moyens de paiement avec redirection

Lors du paiement, certains moyens de paiement redirigent le client vers une page intermédiaire, comme la page d’autorisation de sa banque. Une fois qu’il a renseigné cette page, Stripe le redirige vers votre page de retour.

En savoir plus sur [les moyens de paiement avec redirection et le comportement de redirection](https://docs.stripe.com/payments/checkout/custom-success-page.md?payment-ui=embedded-form#redirect-based-payment-methods).

## Capturer le PaymentIntent

Pour un PaymentIntent à l’[état requires_capture](https://docs.stripe.com/payments/paymentintents/lifecycle.md) pour lequel la multicapture est `available`, la configuration du paramètre facultatif `final_capture` 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&nbsp;USD, la capture de 7&nbsp;USD avec l’attribut `final_capture=false` conserve l’autorisation pour les 3&nbsp;USD restants.

```curl
curl https://api.stripe.com/v1/payment_intents/pi_xxx/capture \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d amount_to_capture=700 \
  -d final_capture=false \
  -d "expand[]=latest_charge"
```

Dans la réponse de capture du PI, les champs [amount_capturable](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-amount_capturable) et [amount_received](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-amount_received) sont mis à jour en conséquence.

```json
// 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&nbsp;:

- Définissez `final_capture` sur `true`.
- Effectuez une capture sans le paramètre `final_capture` (car `final_capture` est défini par défaut sur `true`).
- La fenêtre d’autorisation expire.

À ce stade, Stripe libère les fonds restants et fait passer le PaymentIntent à l’état `succeeded`.

```curl
curl https://api.stripe.com/v1/payment_intents/pi_xxx/capture \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d amount_to_capture=200 \
  -d final_capture=true \
  -d "expand[]=latest_charge"
```

Dans la réponse de capture du PI, les champs [amount_capturable](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-amount_capturable) et [amount_received](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-amount_received) seront mis à jour en conséquence.

```json
// 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`.

## Optional: Débloquer les fonds non capturés

Si vous souhaitez débloquer les fonds non capturés pour un paiement partiellement capturé, définissez le montant sur 0 et `final_capture` sur `true`.

```curl
curl https://api.stripe.com/v1/payment_intents/pi_xxx/capture \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d amount_to_capture=0 \
  -d final_capture=true
```

L’état du PaymentIntent passe à `succeeded` et les fonds non capturés sont restitués au titulaire de la carte.

## 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                                                               |
| ---------------- | ---------------------------------------------- | ------------------------------------------------------------------------- |
| 4242424242424242 | `pm_card_visa`                                 | Carte bancaire de test qui prend en charge la multicapture.               |
| 4000002500001001 | `pm_card_visa_cartesBancaires`                 | Carte de test Cartes Bancaires ou Visa prenant en charge la multicapture. |
| 4000008400000076 | `pm_card_credit_disableEnterpriseCardFeatures` | Carte bancaire de test qui ne prend pas en charge la multicapture.        |

## Remboursements

Pour un PaymentIntent à l’état `requires_capture`, vous pouvez effectuer autant de [remboursements](https://docs.stripe.com/api/refunds.md) que vous le souhaitez, dans la limite du montant total capturé moins le montant total remboursé, c’est-à-dire le montant [amount_received](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-amount_received)-[amount_refunded](https://docs.stripe.com/api/charges/object.md#charge_object-amount_refunded). Le champ [charge.refunded](https://docs.stripe.com/api/charges/object.md#charge_object-refunded) ne passe à la valeur `true` que lorsque la capture finale est effectuée et que l’intégralité du [amount_received](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-amount_received) est remboursée.

Stripe ne prend pas en charge les *remboursements partiels* (A partial refund is any refund in which less than the remaining refundable amount is refunded in a single request. The remaining refundable amount is the payment_intent.amount_received - charge.amount_refunded) avec des paramètres [refund_application_fee=true](https://docs.stripe.com/api/refunds/create.md#create_refund-refund_application_fee) ou [reverse_transfer=true](https://docs.stripe.com/api/refunds/create.md#create_refund-reverse_transfer). 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](https://docs.stripe.com/api/fee_refunds.md) et d’[annulation de transfert](https://docs.stripe.com/api/transfer_reversals.md). 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_transfer=true` ou `refund_application_fee=true` respectivement.

## Connect

Les captures multiples sont compatibles avec tous les cas d’usage de Connect, à l’exception des [paiements et transferts distincts](https://docs.stripe.com/connect/separate-charges-and-transfers.md) dotés du paramètre [source_transaction](https://docs.stripe.com/api/transfers/create.md#create_transfer-source_transaction). Les paramètres [application_fee_amount](https://docs.stripe.com/api/payment_intents/capture.md#capture_payment_intent-application_fee_amount) et [transfer_data[amount]](https://docs.stripe.com/api/payment_intents/capture.md#capture_payment_intent-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&nbsp;:

- Si vous définissez les attributs `application_fee_amount` ou `transfer_data[amount]` lors de la première capture, ils seront obligatoires pour toutes les captures suivantes. Chaque `application_fee_amount` et `transfer_data[amount]` 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.
- Stripe ne prend pas en charge les *remboursements partiels* (A partial refund is any refund in which less than the remaining refundable amount is refunded in a single request. The remaining refundable amount is the payment_intent.amount_received - charge.amount_refunded) sur les paiements multicapture dotés du paramètre «&nbsp;refund_application_fee=true&nbsp;» ou «&nbsp;reverse_transfer=true&nbsp;». Vous pouvez effectuer des remboursements partiels de frais ou des annulations de transfert à l’aide des endpoints de [remboursement des commission de la plateforme](https://docs.stripe.com/api/fee_refunds.md) et d’[annulation de transfert](https://docs.stripe.com/api/transfer_reversals.md).

## Webhooks

### Débiter les webhooks mis à jour

Nous envoyons un webhook [charge.updated](https://docs.stripe.com/api/events/types.md#event_types-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.

```json
// 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](https://docs.stripe.com/api/events/types.md#event_types-payment_intent.amount_capturable_updated) à chaque capture, quelles que soient les valeurs `amount_to_capture` et `final_capture`.

Par exemple, en capturant 1&nbsp;USD d’un PaymentIntent d’un montant de 10&nbsp;USD, le champ amount_capturable du PaymentIntent est mis à jour à 9&nbsp;USD.

```json
// 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](https://docs.stripe.com/api/events/types.md#event_types-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](https://docs.stripe.com/api/charges/object.md#charge_object-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](https://docs.stripe.com/api/charges/object.md#charge_object-captured) du paiement passe de false à true.

```json
// 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](https://docs.stripe.com/api/events/types.md#event_types-refund.created). Pour les comptes connectés, nous envoyons également des événements [application_fee.refunded](https://docs.stripe.com/api/events/types.md#event_types-application_fee.refunded) lorsque nous remboursons une commission de plateforme, et des événements [transfer.reversed](https://docs.stripe.com/api/events/types.md#event_types-transfer.reversed) lorsque nous annulons des transferts.


# Intégration avancée

> This is a Intégration avancée for when platform is web and ui is elements. View the full page at https://docs.stripe.com/payments/multicapture?platform=web&ui=elements.

La multicapture vous permet de [capturer un PaymentIntent](https://docs.stripe.com/api/payment_intents/capture.md) plusieurs fois pour une seule autorisation, dans la limite du [montant total du PaymentIntent](https://docs.stripe.com/api/payment_intents/create.md#create_payment_intent-amount). 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 de la *tarification IC+*. Si vous utilisez la tarification mixte de Stripe et souhaitez accéder à cette fonctionnalité, contactez-nous via le formulaire du [service de support Stripe](https://support.stripe.com).

## Disponibilité

Lorsque vous utilisez la multicapture, tenez compte des restrictions suivantes&nbsp;:

- 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](https://docs.stripe.com/connect/separate-charges-and-transfers.md) utilisant [source_transaction](https://docs.stripe.com/api/transfers/create.md#create_transfer-source_transaction) ne sont pas pris en charge
- Stripe vous permet d’effectuer jusqu’à 50&nbsp;captures par [PaymentIntent](https://docs.stripe.com/api/payment_intents.md)

> #### 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&nbsp;:

- 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.

> #### 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 et confirmer un PaymentIntent non capturé

Pour indiquer que vous souhaitez séparer l’autorisation de la capture, définissez [capture_method](https://docs.stripe.com/api/payment_intents/create.md#create_payment_intent-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](https://docs.stripe.com/payments/place-a-hold-on-a-payment-method.md).

Utilisez les paramètres `if_available` ou `never` pour demander une multicapture pour ce paiement.

- `if_available`&nbsp;: le PaymentIntent créé autorisera plusieurs captures, si le moyen de paiement le permet.

- `never`&nbsp;: le PaymentIntent créé ne permettra pas les captures multiples

```curl
curl https://api.stripe.com/v1/payment_intents \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d amount=1000 \
  -d currency=usd \
  -d "payment_method_types[]=card" \
  -d payment_method=pm_card_visa \
  -d confirm=true \
  -d capture_method=manual \
  -d "expand[]=latest_charge" \
  -d "payment_method_options[card][request_multicapture]=if_available"
```

Dans la réponse, le champ `payment_method_details.card.multicapture.status` de [latest_charge](https://docs.stripe.com/api/charges/object.md) contient `available` ou `unavailable` selon le moyen de paiement du client.

```json
// 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](https://docs.stripe.com/payments/paymentintents/lifecycle.md) pour lequel la multicapture est `available`, la configuration du paramètre facultatif `final_capture` 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&nbsp;USD, la capture de 7&nbsp;USD avec l’attribut `final_capture=false` conserve l’autorisation pour les 3&nbsp;USD restants.

```curl
curl https://api.stripe.com/v1/payment_intents/pi_xxx/capture \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d amount_to_capture=700 \
  -d final_capture=false \
  -d "expand[]=latest_charge"
```

Dans la réponse de capture du PI, les champs [amount_capturable](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-amount_capturable) et [amount_received](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-amount_received) sont mis à jour en conséquence.

```json
// 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&nbsp;:

- Définissez `final_capture` sur `true`.
- Effectuez une capture sans le paramètre `final_capture` (car `final_capture` est défini par défaut sur `true`).
- La fenêtre d’autorisation expire.

À ce stade, Stripe libère les fonds restants et fait passer le PaymentIntent à l’état `succeeded`.

```curl
curl https://api.stripe.com/v1/payment_intents/pi_xxx/capture \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d amount_to_capture=200 \
  -d final_capture=true \
  -d "expand[]=latest_charge"
```

Dans la réponse de capture du PI, les champs [amount_capturable](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-amount_capturable) et [amount_received](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-amount_received) seront mis à jour en conséquence.

```json
// 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`.

## Optional: Débloquer les fonds non capturés

Si vous souhaitez débloquer les fonds non capturés pour un paiement partiellement capturé, définissez le montant sur 0 et `final_capture` sur `true`.

```curl
curl https://api.stripe.com/v1/payment_intents/pi_xxx/capture \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d amount_to_capture=0 \
  -d final_capture=true
```

L’état du PaymentIntent passe à `succeeded` et les fonds non capturés sont restitués au titulaire de la carte.

## 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                                                               |
| ---------------- | ---------------------------------------------- | ------------------------------------------------------------------------- |
| 4242424242424242 | `pm_card_visa`                                 | Carte bancaire de test qui prend en charge la multicapture.               |
| 4000002500001001 | `pm_card_visa_cartesBancaires`                 | Carte de test Cartes Bancaires ou Visa prenant en charge la multicapture. |
| 4000008400000076 | `pm_card_credit_disableEnterpriseCardFeatures` | Carte bancaire de test qui ne prend pas en charge la multicapture.        |

## Remboursements

Pour un PaymentIntent à l’état `requires_capture`, vous pouvez effectuer autant de [remboursements](https://docs.stripe.com/api/refunds.md) que vous le souhaitez, dans la limite du montant total capturé moins le montant total remboursé, c’est-à-dire le montant [amount_received](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-amount_received)-[amount_refunded](https://docs.stripe.com/api/charges/object.md#charge_object-amount_refunded). Le champ [charge.refunded](https://docs.stripe.com/api/charges/object.md#charge_object-refunded) ne passe à la valeur `true` que lorsque la capture finale est effectuée et que l’intégralité du [amount_received](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-amount_received) est remboursée.

Stripe ne prend pas en charge les *remboursements partiels* (A partial refund is any refund in which less than the remaining refundable amount is refunded in a single request. The remaining refundable amount is the payment_intent.amount_received - charge.amount_refunded) avec des paramètres [refund_application_fee=true](https://docs.stripe.com/api/refunds/create.md#create_refund-refund_application_fee) ou [reverse_transfer=true](https://docs.stripe.com/api/refunds/create.md#create_refund-reverse_transfer). 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](https://docs.stripe.com/api/fee_refunds.md) et d’[annulation de transfert](https://docs.stripe.com/api/transfer_reversals.md). 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_transfer=true` ou `refund_application_fee=true` respectivement.

## Connect

Les captures multiples sont compatibles avec tous les cas d’usage de Connect, à l’exception des [paiements et transferts distincts](https://docs.stripe.com/connect/separate-charges-and-transfers.md) dotés du paramètre [source_transaction](https://docs.stripe.com/api/transfers/create.md#create_transfer-source_transaction). Les paramètres [application_fee_amount](https://docs.stripe.com/api/payment_intents/capture.md#capture_payment_intent-application_fee_amount) et [transfer_data[amount]](https://docs.stripe.com/api/payment_intents/capture.md#capture_payment_intent-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&nbsp;:

- Si vous définissez les attributs `application_fee_amount` ou `transfer_data[amount]` lors de la première capture, ils seront obligatoires pour toutes les captures suivantes. Chaque `application_fee_amount` et `transfer_data[amount]` 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.
- Stripe ne prend pas en charge les *remboursements partiels* (A partial refund is any refund in which less than the remaining refundable amount is refunded in a single request. The remaining refundable amount is the payment_intent.amount_received - charge.amount_refunded) sur les paiements multicapture dotés du paramètre «&nbsp;refund_application_fee=true&nbsp;» ou «&nbsp;reverse_transfer=true&nbsp;». Vous pouvez effectuer des remboursements partiels de frais ou des annulations de transfert à l’aide des endpoints de [remboursement des commission de la plateforme](https://docs.stripe.com/api/fee_refunds.md) et d’[annulation de transfert](https://docs.stripe.com/api/transfer_reversals.md).

## Webhooks

### Débiter les webhooks mis à jour

Nous envoyons un webhook [charge.updated](https://docs.stripe.com/api/events/types.md#event_types-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.

```json
// 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](https://docs.stripe.com/api/events/types.md#event_types-payment_intent.amount_capturable_updated) à chaque capture, quelles que soient les valeurs `amount_to_capture` et `final_capture`.

Par exemple, en capturant 1&nbsp;USD d’un PaymentIntent d’un montant de 10&nbsp;USD, le champ amount_capturable du PaymentIntent est mis à jour à 9&nbsp;USD.

```json
// 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](https://docs.stripe.com/api/events/types.md#event_types-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](https://docs.stripe.com/api/charges/object.md#charge_object-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](https://docs.stripe.com/api/charges/object.md#charge_object-captured) du paiement passe de false à true.

```json
// 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](https://docs.stripe.com/api/events/types.md#event_types-refund.created). Pour les comptes connectés, nous envoyons également des événements [application_fee.refunded](https://docs.stripe.com/api/events/types.md#event_types-application_fee.refunded) lorsque nous remboursons une commission de plateforme, et des événements [transfer.reversed](https://docs.stripe.com/api/events/types.md#event_types-transfer.reversed) lorsque nous annulons des transferts.

