# Utilisez des postes de paiement pour des paiements flexibles Découvrez comment utiliser les postes de paiement avec des paiements complexes, tels que les paiements multicaptures et surcaptures. Vous pouvez utiliser des postes de paiement pour les [paiements complexes](https://docs.stripe.com/payments/flexible-payments.md) tels que les paiements multicaptures et surcaptures. ## Multicapture Vous pouvez utiliser des postes de paiement lors de multicaptures. > La multicapture n’est pas prise en charge par Klarna ou PayPal. #### Créer et confirmer un PaymentIntent non capturé > Par défaut, la réponse de l’API n’inclut pas les postes. Pour retourner des postes, [expand](https://docs.stripe.com/expand.md#includable-properties) `amount_details.line_items`. Spécifiez `capture_method` comme `manual` lors de la création du PaymentIntent et utilisez le paramètre `if_available` pour demander la multicapture pour ce paiement. Le PaymentIntent créé permet des captures multiples si le moyen de paiement le permet. ```curl curl https://api.stripe.com/v1/payment_intents \ -u "<>:" \ -d amount=4600 \ -d currency=usd \ -d "payment_method_types[0]=card" \ -d payment_method=pm_card_visa \ -d "payment_method_options[card][request_multicapture]=if_available" \ -d "payment_details[customer_reference]=customer_reference" \ -d "payment_details[order_reference]=order_reference" \ -d "amount_details[discount_amount]=200" \ -d "amount_details[tax][total_tax_amount]=400" \ -d "amount_details[shipping][from_postal_code]=94110" \ -d "amount_details[shipping][to_postal_code]=94117" \ -d "amount_details[shipping][amount]=400" \ -d "amount_details[line_items][0][product_code]=SKU001" \ -d "amount_details[line_items][0][product_name]=Product 001" \ -d "amount_details[line_items][0][unit_cost]=2000" \ -d "amount_details[line_items][0][quantity]=1" \ -d "amount_details[line_items][0][unit_of_measure]=feet" \ -d "amount_details[line_items][0][payment_method_options][card][commodity_code]=123123" \ -d "amount_details[line_items][1][product_code]=SKU002" \ -d "amount_details[line_items][1][product_name]=Product 002" \ -d "amount_details[line_items][1][unit_cost]=2000" \ -d "amount_details[line_items][1][quantity]=1" \ -d "amount_details[line_items][1][unit_of_measure]=gallons" \ -d "amount_details[line_items][1][payment_method_options][card][commodity_code]=123123" \ -d confirm=true \ -d capture_method=manual \ -d "expand[0]=amount_details.line_items" ``` Dans la réponse, le champ `amount_details` contient les postes spécifiés dans le PaymentIntent. ```json { "amount": 4600, "amount_capturable": 4600, "amount_received": 0, "payment_details": { "customer_reference": "customer_reference", "order_reference": "order_reference" }, "amount_details": { "discount_amount": 200, "tax": { "total_tax_amount": 400 }, "shipping": { "from_postal_code": "94110", "to_postal_code": "94117", "amount": 400 }, "line_items": [ { "product_code": "SKU001", "product_name": "Product 001", "unit_cost": 2000, "quantity": 1, "unit_of_measure": "feet", "payment_method_options": { "card": { "commodity_code": "123123" } } }, { "product_code": "SKU002", "product_name": "Product 002", "unit_cost": 2000, "quantity": 1, "unit_of_measure": "gallons", "payment_method_options": { "card": { "commodity_code": "123123" } } } ] } ... } ``` #### Capturer le PaymentIntent - Vous pouvez ajouter `amount_details` lors de la première capture même s’ils n’ont pas été spécifiés lors de la création. - Si vous avez fourni `amount_details` lors de la création, vous devez soit passer `amount_details`, soit les désactiver lors de la première capture. Les mêmes règles s’appliquent à `amount_details[line_items]` : vous pouvez les ajouter lors de la première capture s’ils n’ont pas été spécifiés lors de la création, mais vous devez les inclure ou les désactiver explicitement s’ils étaient présents lors de la création. ```curl curl https://api.stripe.com/v1/payment_intents/pi_xxxxxxxx/capture \ -u "<>:" \ -d amount_to_capture=2300 \ -d "payment_details[customer_reference]=customer_reference" \ -d "payment_details[order_reference]=order_reference" \ -d "amount_details[discount_amount]=100" \ -d "amount_details[tax][total_tax_amount]=200" \ -d "amount_details[shipping][from_postal_code]=94110" \ -d "amount_details[shipping][to_postal_code]=94117" \ -d "amount_details[shipping][amount]=200" \ -d "amount_details[line_items][0][product_code]=SKU001" \ -d "amount_details[line_items][0][product_name]=Product 001" \ -d "amount_details[line_items][0][unit_cost]=2000" \ -d "amount_details[line_items][0][quantity]=1" \ -d "amount_details[line_items][0][unit_of_measure]=feet" \ -d "amount_details[line_items][0][payment_method_options][card][commodity_code]=123123" \ -d final_capture=false \ -d "expand[0]=amount_details.line_items" ``` Dans la réponse, le champ `amount_details` contient les postes spécifiés lors de la première capture. ```json { "amount": 4600, "amount_capturable": 2300, "amount_received": 2300, "payment_details": { "customer_reference": "customer_reference", "order_reference": "order_reference" }, "amount_details": { "discount_amount": 100, "tax": { "total_tax_amount": 200 }, "shipping": { "from_postal_code": "94110", "to_postal_code": "94117", "amount": 200 }, "line_items": { "object": "list", "url": "/v1/payment_intents/pi_xxxxxxxx/amount_details_line_items", "has_more": false, "data": [ { "_id": "li_123", "product_code": "SKU001", "product_name": "Product 001", "unit_cost": 2000, "quantity": 1, "unit_of_measure": "feet", "payment_method_options": { "card": { "commodity_code": "123123" } } } ] } }, "status": "requires_capture" ... } ``` Le PaymentIntent reste dans l’état `requires_capture`. À ce stade : - Continuez à capturer le PaymentIntent plusieurs fois jusqu’à ce que le montant total du PaymentIntent soit atteint. - Faites passer le PaymentIntent à l’état `succeeded` en réglant `final_capture` sur `true`, ou en effectuant une capture sans le paramètre `final_capture` (parce que `final_capture` est réglé par défaut sur `true`). #### Capturez à nouveau le PaymentIntent - Si les captures précédentes incluaient `amount_details` ou `amount_details[line_items]`, vous devez continuer à les inclure dans les captures suivantes. - Si les captures précédentes n’incluaient pas ces champs, vous ne pouvez pas les ajouter dans les captures ultérieures. ```curl curl https://api.stripe.com/v1/payment_intents/pi_xxxxxxxx/capture \ -u "<>:" \ -d amount_to_capture=2300 \ -d "payment_details[customer_reference]=customer_reference" \ -d "payment_details[order_reference]=order_reference" \ -d "amount_details[discount_amount]=100" \ -d "amount_details[tax][total_tax_amount]=200" \ -d "amount_details[shipping][from_postal_code]=94110" \ -d "amount_details[shipping][to_postal_code]=94117" \ -d "amount_details[shipping][amount]=200" \ -d "amount_details[line_items][0][product_code]=SKU002" \ -d "amount_details[line_items][0][product_name]=Product 002" \ -d "amount_details[line_items][0][unit_cost]=2000" \ -d "amount_details[line_items][0][quantity]=1" \ -d "amount_details[line_items][0][unit_of_measure]=gallons" \ -d "amount_details[line_items][0][payment_method_options][card][commodity_code]=123123" \ -d final_capture=false \ -d "expand[0]=amount_details.line_items" ``` Dans la réponse, le champ `amount_details` contient les lignes des deux premières captures, selon les règles suivantes : - `discount_amount`, `tax.total_tax_amount` et `shipping.amount` sont additionnés sur l’ensemble des captures. - `shipping.from_postal_code` et `shipping.to_postal_code` peuvent être omis dans les captures, mais s’ils sont fournis, vous ne devez pas les modifier d’une capture à l’autre. - les `line_items` seront agrégés pour l’ensemble des captures. ```json { "amount": 4600, "amount_capturable": 0, "amount_received": 4600, "payment_details": { "customer_reference": "customer_reference", "order_reference": "order_reference" }, "amount_details": { "discount_amount": 200, "tax": { "total_tax_amount": 400 }, "shipping": { "from_postal_code": "94110", "to_postal_code": "94117", "amount": 400 }, "line_items": { "object": "list", "url": "/v1/payment_intents/pi_xxxxxxxx/amount_details_line_items", "has_more": false, "data": [ { "_id": "li_123", "product_code": "SKU001", "product_name": "Product 001", "unit_cost": 2000, "quantity": 1, "unit_of_measure": "feet", "payment_method_options": { "card": { "commodity_code": "123123" } } }, { "_id": "li_234", "product_code": "SKU002", "product_name": "Product 002", "unit_cost": 2000, "quantity": 1, "unit_of_measure": "gallons", "payment_method_options": { "card": { "commodity_code": "123123" } } } ] } }, "status": "succeeded" ... } ``` #### Capture partielle de PaymentIntent Passez `amount_to_capture` avec `0` et `final_capture` avec `true` pour faire passer le PaymentIntent partiellement capturé à l’état `succeeded`. ```curl curl https://api.stripe.com/v1/payment_intents/pi_xxxxxxxx/capture \ -u "<>:" \ -d amount_to_capture=0 \ -d final_capture=true \ -d "expand[]=amount_details.line_items" ``` Dans la réponse, le champ `amount_details` ne contient que les postes spécifiés lors de la première capture. ```json { "amount": 4600, "amount_capturable": 2300, "amount_received": 2300, "payment_details": { "customer_reference": "customer_reference", "order_reference": "order_reference" }, "amount_details": { "discount_amount": 100, "tax": { "total_tax_amount": 200 }, "shipping": { "from_postal_code": "94110", "to_postal_code": "94117", "amount": 200 }, "line_items": { "object": "list", "url": "/v1/payment_intents/pi_xxxxxxxx/amount_details_line_items", "has_more": false, "data": [ { "_id": "li_123", "product_code": "SKU001", "product_name": "Product 001", "unit_cost": 2000, "quantity": 1, "unit_of_measure": "feet", "payment_method_options": { "card": { "commodity_code": "123123" } } } ] } }, "status": "succeeded" ... } ``` ## Surcapture Vous pouvez utiliser des postes de paiement lors de surcaptures. #### Créer et confirmer un PaymentIntent non capturé > Par défaut, la réponse de l’API n’inclut pas les postes. Pour retourner des postes, [expand](https://docs.stripe.com/expand.md#includable-properties) `amount_details.line_items`. Spécifiez le paramètre `capture_method` comme `manual` lors de la création du PaymentIntent et utilisez le paramètre `if_available` pour demander une surcapture pour ce paiement. Le PaymentIntent créé autorise la surcapture si le moyen de paiement le permet. ```curl curl https://api.stripe.com/v1/payment_intents \ -u "<>:" \ -d amount=4600 \ -d currency=usd \ -d "payment_method_types[0]=card" \ -d payment_method=pm_card_visa \ -d "payment_method_options[card][request_overcapture]=if_available" \ -d "payment_details[customer_reference]=customer_reference" \ -d "payment_details[order_reference]=order_reference" \ -d "amount_details[discount_amount]=200" \ -d "amount_details[tax][total_tax_amount]=400" \ -d "amount_details[shipping][from_postal_code]=94110" \ -d "amount_details[shipping][to_postal_code]=94117" \ -d "amount_details[shipping][amount]=400" \ -d "amount_details[line_items][0][product_code]=SKU001" \ -d "amount_details[line_items][0][product_name]=Product 001" \ -d "amount_details[line_items][0][unit_cost]=2000" \ -d "amount_details[line_items][0][quantity]=1" \ -d "amount_details[line_items][0][unit_of_measure]=feet" \ -d "amount_details[line_items][0][payment_method_options][card][commodity_code]=123123" \ -d "amount_details[line_items][1][product_code]=SKU002" \ -d "amount_details[line_items][1][product_name]=Product 002" \ -d "amount_details[line_items][1][unit_cost]=2000" \ -d "amount_details[line_items][1][quantity]=1" \ -d "amount_details[line_items][1][unit_of_measure]=gallons" \ -d "amount_details[line_items][1][payment_method_options][card][commodity_code]=123123" \ -d confirm=true \ -d capture_method=manual \ -d "expand[0]=amount_details.line_items" ``` Dans la réponse, le champ `amount_details` contient les postes spécifiés dans le PaymentIntent. ```json { "amount": 4600, "amount_capturable": 4600, "amount_received": 0, "payment_details": { "customer_reference": "customer_reference", "order_reference": "order_reference" }, "amount_details": { "discount_amount": 200, "tax": { "total_tax_amount": 400 }, "shipping": { "from_postal_code": "94110", "to_postal_code": "94117", "amount": 400 }, "line_items": { "object": "list", "url": "/v1/payment_intents/pi_xxxxxxxx/amount_details_line_items", "has_more": false, "data": [ { "_id": "li_345", "product_code": "SKU001", "product_name": "Product 001", "unit_cost": 2000, "quantity": 1, "unit_of_measure": "feet", "payment_method_options": { "card": { "commodity_code": "123123" } } }, { "_id": "li_456", "product_code": "SKU002", "product_name": "Product 002", "unit_cost": 2000, "quantity": 1, "unit_of_measure": "gallons", "payment_method_options": { "card": { "commodity_code": "123123" } } } ] } } ... } ``` #### Capturer le PaymentIntent Pour capturer un montant supérieur au montant actuellement autorisé sur un PaymentIntent, utilisez l’endpoint de [capture](https://docs.stripe.com/api/payment_intents/capture.md) et indiquez un [amount_to_capture](https://docs.stripe.com/api/payment_intents/capture.md#capture_payment_intent-amount_to_capture) jusqu’au [maximum_amount_capturable](https://docs.stripe.com/api/charges/object.md#charge_object-payment_method_details-card-overcapture). Transmettez un hachage `amount_details` mis à jour qui correspond au montant de la capture lors de la capture. ```curl curl https://api.stripe.com/v1/payment_intents/pi_xxxxxxxx/capture \ -u "<>:" \ -d amount_to_capture=5000 \ -d "payment_details[customer_reference]=customer_reference" \ -d "payment_details[order_reference]=order_reference" \ -d "amount_details[discount_amount]=200" \ -d "amount_details[tax][total_tax_amount]=600" \ -d "amount_details[shipping][from_postal_code]=94110" \ -d "amount_details[shipping][to_postal_code]=94117" \ -d "amount_details[shipping][amount]=600" \ -d "amount_details[line_items][0][product_code]=SKU001" \ -d "amount_details[line_items][0][product_name]=Product 001" \ -d "amount_details[line_items][0][unit_cost]=2000" \ -d "amount_details[line_items][0][quantity]=1" \ -d "amount_details[line_items][0][unit_of_measure]=feet" \ -d "amount_details[line_items][0][payment_method_options][card][commodity_code]=123123" \ -d "amount_details[line_items][1][product_code]=SKU002" \ -d "amount_details[line_items][1][product_name]=Product 002" \ -d "amount_details[line_items][1][unit_cost]=2000" \ -d "amount_details[line_items][1][quantity]=1" \ -d "amount_details[line_items][1][unit_of_measure]=gallons" \ -d "amount_details[line_items][1][payment_method_options][card][commodity_code]=123123" \ -d "expand[0]=amount_details.line_items" ``` Dans la réponse, le champ `amount_details` contient les postes spécifiés lors de la capture. ```json { "amount": 5000, "amount_capturable": 0, "amount_received": 5000, "payment_details": { "customer_reference": "customer_reference", "order_reference": "order_reference" }, "amount_details": { "discount_amount": 200, "tax": { "total_tax_amount": 600 }, "shipping": { "from_postal_code": "94110", "to_postal_code": "94117", "amount": 600 }, "line_items": { "object": "list", "url": "/v1/payment_intents/pi_xxxxxxxx/amount_details_line_items", "has_more": false, "data": [ { "_id": "li_567", "product_code": "SKU001", "product_name": "Product 001", "unit_cost": 2000, "quantity": 1, "unit_of_measure": "feet", "payment_method_options": { "card": { "commodity_code": "123123" } } }, { "_id": "li_678", "product_code": "SKU002", "product_name": "Product 002", "unit_cost": 2000, "quantity": 1, "unit_of_measure": "gallons", "payment_method_options": { "card": { "commodity_code": "123123" } } } ] } }, "status": "succeeded" ... } ``` ## Autorisation complémentaire Vous pouvez utiliser des postes de paiement pendant l’autorisation complémentaire pour autoriser des montants supplémentaires sur un PaymentIntent après l’autorisation initiale. #### Créer et confirmer un PaymentIntent non capturé > Par défaut, la réponse de l’API n’inclut pas les postes. Pour retourner des postes, [expand](https://docs.stripe.com/expand.md#includable-properties) `amount_details.line_items`. Spécifiez le paramètre `capture_method` comme `manual` lors de la création du PaymentIntent et utilisez le paramètre `if_available` pour requérir une autorisation complémentaire pour ce paiement. Le PaymentIntent créé accepte l’autorisation complémentaire si le moyen de paiement le prend en charge. ```curl curl https://api.stripe.com/v1/payment_intents \ -u "<>:" \ -d amount=4600 \ -d currency=usd \ -d "payment_method_types[0]=card" \ -d payment_method=pm_card_visa \ -d "payment_method_options[card][request_incremental_authorization]=if_available" \ -d "payment_details[customer_reference]=customer_reference" \ -d "payment_details[order_reference]=order_reference" \ -d "amount_details[discount_amount]=200" \ -d "amount_details[tax][total_tax_amount]=400" \ -d "amount_details[shipping][from_postal_code]=94110" \ -d "amount_details[shipping][to_postal_code]=94117" \ -d "amount_details[shipping][amount]=400" \ -d "amount_details[line_items][0][product_code]=SKU001" \ -d "amount_details[line_items][0][product_name]=Product 001" \ -d "amount_details[line_items][0][unit_cost]=2000" \ -d "amount_details[line_items][0][quantity]=1" \ -d "amount_details[line_items][0][unit_of_measure]=feet" \ -d "amount_details[line_items][0][payment_method_options][card][commodity_code]=123123" \ -d "amount_details[line_items][1][product_code]=SKU002" \ -d "amount_details[line_items][1][product_name]=Product 002" \ -d "amount_details[line_items][1][unit_cost]=2000" \ -d "amount_details[line_items][1][quantity]=1" \ -d "amount_details[line_items][1][unit_of_measure]=gallons" \ -d "amount_details[line_items][1][payment_method_options][card][commodity_code]=123123" \ -d confirm=true \ -d capture_method=manual \ -d "expand[0]=amount_details.line_items" ``` Dans la réponse, le champ `amount_details` contient les postes spécifiés dans le PaymentIntent. ```json { "amount": 4600, "amount_capturable": 4600, "amount_received": 0, "payment_details": { "customer_reference": "customer_reference", "order_reference": "order_reference" }, "amount_details": { "discount_amount": 200, "tax": { "total_tax_amount": 400 }, "shipping": { "from_postal_code": "94110", "to_postal_code": "94117", "amount": 400 }, "line_items": { "object": "list", "url": "/v1/payment_intents/pi_xxxxxxxx/amount_details_line_items", "has_more": false, "data": [ { "_id": "li_789", "product_code": "SKU001", "product_name": "Product 001", "unit_cost": 2000, "quantity": 1, "unit_of_measure": "feet", "payment_method_options": { "card": { "commodity_code": "123123" } } }, { "_id": "li_890", "product_code": "SKU002", "product_name": "Product 002", "unit_cost": 2000, "quantity": 1, "unit_of_measure": "gallons", "payment_method_options": { "card": { "commodity_code": "123123" } } } ] } } ... } ``` #### Incrémenter l’autorisation Pour autoriser des montants supplémentaires sur un PaymentIntent au-delà du montant initialement autorisé, utilisez l’endpoint [increment_authorization](https://docs.stripe.com/api/payment_intents/increment_authorization.md) et fournissez un [montant](https://docs.stripe.com/api/payment_intents/increment_authorization.md#increment_authorization-amount) jusqu’au montant d’autorisation complémentaire maximum pris en charge par le moyen de paiement. Transmettez un hachage `amount_details` mis à jour qui correspond au montant total autorisé après l’autorisation complémentaire. ```curl curl https://api.stripe.com/v1/payment_intents/pi_xxxxxxxx/increment_authorization \ -u "<>:" \ -d amount=5000 \ -d "payment_details[customer_reference]=customer_reference" \ -d "payment_details[order_reference]=order_reference" \ -d "amount_details[discount_amount]=200" \ -d "amount_details[tax][total_tax_amount]=600" \ -d "amount_details[shipping][from_postal_code]=94110" \ -d "amount_details[shipping][to_postal_code]=94117" \ -d "amount_details[shipping][amount]=600" \ -d "amount_details[line_items][0][product_code]=SKU001" \ -d "amount_details[line_items][0][product_name]=Product 001" \ -d "amount_details[line_items][0][unit_cost]=2000" \ -d "amount_details[line_items][0][quantity]=1" \ -d "amount_details[line_items][0][unit_of_measure]=feet" \ -d "amount_details[line_items][0][payment_method_options][card][commodity_code]=123123" \ -d "amount_details[line_items][1][product_code]=SKU002" \ -d "amount_details[line_items][1][product_name]=Product 002" \ -d "amount_details[line_items][1][unit_cost]=2000" \ -d "amount_details[line_items][1][quantity]=1" \ -d "amount_details[line_items][1][unit_of_measure]=gallons" \ -d "amount_details[line_items][1][payment_method_options][card][commodity_code]=123123" \ -d "expand[0]=amount_details.line_items" ``` Dans la réponse, le champ `amount_details` contient les éléments de poste spécifiés lors de l’autorisation complémentaire, et le montant total autorisé du PaymentIntent est mis à jour. ```json { "amount": 5000, "amount_capturable": 5000, "amount_received": 0, "payment_details": { "customer_reference": "customer_reference", "order_reference": "order_reference" }, "amount_details": { "discount_amount": 200, "tax": { "total_tax_amount": 600 }, "shipping": { "from_postal_code": "94110", "to_postal_code": "94117", "amount": 600 }, "line_items": { "object": "list", "url": "/v1/payment_intents/pi_xxxxxxxx/amount_details_line_items", "has_more": false, "data": [ { "_id": "li_901", "product_code": "SKU001", "product_name": "Product 001", "unit_cost": 2000, "quantity": 1, "unit_of_measure": "feet", "payment_method_options": { "card": { "commodity_code": "123123" } } }, { "_id": "li_012", "product_code": "SKU002", "product_name": "Product 002", "unit_cost": 2000, "quantity": 1, "unit_of_measure": "gallons", "payment_method_options": { "card": { "commodity_code": "123123" } } } ] } }, "status": "requires_capture" ... } ``` ## Autorisation partielle Vous pouvez utiliser des postes de paiement avec des autorisations partielles. ### Créer et confirmer un PaymentIntent non capturé > Par défaut, la réponse de l’API n’inclut pas les postes. Pour retourner des postes, [expand](https://docs.stripe.com/expand.md#includable-properties) `amount_details.line_items`. Spécifiez `capture_method` comme `manual` lors de la création du `PaymentIntent` et utilisez le paramètre `if_available` pour demander l’autorisation partielle pour ce paiement. ```curl curl https://api.stripe.com/v1/payment_intents \ -u "<>:" \ -d amount=1000 \ -d currency=usd \ -d "payment_method_types[0]=card" \ -d payment_method=pm_card_debit_partialAuthorization \ -d "payment_method_options[card][request_partial_authorization]=if_available" \ -d "payment_details[customer_reference]=customer_reference" \ -d "payment_details[order_reference]=order_reference" \ -d "amount_details[tax][total_tax_amount]=100" \ -d "amount_details[shipping][from_postal_code]=94110" \ -d "amount_details[shipping][to_postal_code]=94117" \ -d "amount_details[shipping][amount]=100" \ -d "amount_details[line_items][0][product_code]=SKU001" \ -d "amount_details[line_items][0][product_name]=Product 001" \ -d "amount_details[line_items][0][unit_cost]=800" \ -d "amount_details[line_items][0][quantity]=1" \ -d "amount_details[line_items][0][unit_of_measure]=feet" \ -d confirm=true \ -d capture_method=manual \ -d "expand[0]=amount_details.line_items" ``` Si vous avez fourni des données de poste avant l’autorisation partielle, la somme des montants de poste peut ne pas correspondre au montant total sur le `PaymentIntent`. Dans ce cas, le hachage [amount_details.error](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-amount_details-error) dans la réponse a un `code` défini sur `amount_details_amount_mismatch` et inclut le montant de cette différence dans la propriété `message`. L’exemple de réponse ci-dessous montre que la transaction est partiellement autorisée pour 7 USD, ce qui est inférieur aux 10 USD initialement demandés. ```json { "id": "pi_3SpkXE2QCQbYXizB1WscY8lW", "object": "payment_intent","amount": 700, "amount_capturable": 700, "amount_details": {"error": { "code": "amount_details_amount_mismatch", "message": "Invalid amount_details. The calculated amount is Sum(line_items[#].unit_cost * line_items[#].quantity + line_items[#].tax.total_tax_amount - line_items[#].discount_amount) + shipping.amount or Sum(line_items[#].unit_cost * line_items[#].quantity) + tax.total_tax_amount + shipping.amount - discount_amount which does not match the total amount charged. In this case the calculated amount 1000 is not equal to the total amount 700 on the PaymentIntent." }, "line_items": { "object": "list", "data": [ { "id": "uli_TnLDKPQgGwfFxD", "object": "payment_intent_amount_details_line_item", "discount_amount": null, "payment_method_options": null, "product_code": "SKU001", "product_name": "Product 001", "quantity": 1, "tax": null, "unit_cost": 800, "unit_of_measure": "feet" } ], "has_more": false, "url": "/v1/payment_intents/pi_3SpkXE2QCQbYXizB1WscY8lW/amount_details_line_items" }, "shipping": { "amount": 100, "from_postal_code": "94110", "to_postal_code": "94117" }, "tax": { "total_tax_amount": 100 }, "tip": {} }, "status": "requires_capture" } ``` ### Capturer le PaymentIntent #### Capturer le PaymentIntent avec les postes mis à jour [Capture](https://docs.stripe.com/api/payment_intents/capture.md) le `PaymentIntent` et transmet un [amount_details](https://docs.stripe.com/api/payment_intents/capture.md#capture_payment_intent-amount_details) mis à jour correspondant au montant partiellement autorisé. ```curl curl https://api.stripe.com/v1/payment_intents/pi_3SpkXE2QCQbYXizB1WscY8lW/capture \ -u "<>:" \ -d "amount_details[line_items][0][product_code]=SKU002" \ -d "amount_details[line_items][0][product_name]=Product 002" \ -d "amount_details[line_items][0][unit_cost]=500" \ -d "amount_details[line_items][0][quantity]=1" \ -d "amount_details[line_items][0][unit_of_measure]=feet" \ -d "expand[0]=amount_details.line_items" ``` La mise à jour de `amount_details` supprime le hachage `error` de la différence du `PaymentIntent`. Pour les paiements par carte, cela permet à Stripe d’envoyer les données du poste aux réseaux de cartes. ```json { "id": "pi_3SpkXE2QCQbYXizB1WscY8lW", "object": "payment_intent", "amount": 700, "amount_capturable": 0, "amount_details": { "line_items": { "object": "list", "data": [ { "id": "uli_TnM6fcFHBk7BMk", "object": "payment_intent_amount_details_line_item", "discount_amount": null, "payment_method_options": null, "product_code": "SKU002", "product_name": "Product 002", "quantity": 1, "tax": null, "unit_cost": 500, "unit_of_measure": "feet" } ], "has_more": false, "url": "/v1/payment_intents/pi_3SplOI2QCQbYXizB0DaGWmQT/amount_details_line_items" }, "shipping": { "amount": 100, "from_postal_code": "94110", "to_postal_code": "94117" }, "tax": { "total_tax_amount": 100 }, "tip": {} }, "amount_received": 700, "status": "succeeded" } ``` #### Capturer le PaymentIntent sans mettre à jour les postes [Capture](https://docs.stripe.com/api/payment_intents/capture.md) le `PaymentIntent` sans mettre à jour le paramètre `amount_details`. Pour les paiements par carte, Stripe n’envoie pas aux réseaux de cartes les données des postes comportant des erreurs arithmétiques, ce qui empêche la transaction de bénéficier des économies d’interchange L2/L3. ```curl curl https://api.stripe.com/v1/payment_intents/pi_3SpkXE2QCQbYXizB1WscY8lW/capture \ -u "<>:" \ -d "expand[]=amount_details.line_items" ``` ```json { "id": "pi_3SpkXE2QCQbYXizB1WscY8lW", "object": "payment_intent", "amount": 700, "amount_capturable": 0, "amount_details": { "error": { "code": "amount_details_amount_mismatch", "message": "Invalid amount_details. The calculated amount is Sum(line_items[#].unit_cost * line_items[#].quantity + line_items[#].tax.total_tax_amount - line_items[#].discount_amount) + shipping.amount or Sum(line_items[#].unit_cost * line_items[#].quantity) + tax.total_tax_amount + shipping.amount - discount_amount which does not match the total amount charged. In this case the calculated amount 1000 is not equal to the total amount 700 on the PaymentIntent." }, "line_items": { "object": "list", "data": [ { "id": "uli_TnLDKPQgGwfFxD", "object": "payment_intent_amount_details_line_item", "discount_amount": null, "payment_method_options": null, "product_code": "SKU001", "product_name": "Product 001", "quantity": 1, "tax": null, "unit_cost": 800, "unit_of_measure": "feet" } ], "has_more": false, "url": "/v1/payment_intents/pi_3SpkXE2QCQbYXizB1WscY8lW/amount_details_line_items" }, "shipping": { "amount": 100, "from_postal_code": "94110", "to_postal_code": "94117" }, "tax": { "total_tax_amount": 100 }, "tip": {} }, "amount_received": 700, "status": "succeeded" } ```