# Percevoir des taxes pour les paiements récurrents Comment percevoir et déclarer des taxes pour les paiements récurrents. Stripe Tax vous permet de calculer le montant de la taxe sur vos paiements récurrents lorsque vous utilisez Stripe Billing. Utilisez les informations relatives à l’emplacement de votre client pour obtenir un aperçu du montant des taxes avant de créer un abonnement, puis créez-le avec Stripe Tax activé lorsque votre client est prêt à payer. Stripe Tax s’intègre à Stripe Billing et gère automatiquement le calcul des taxes à l’aide de votre [modèle tarifaire](https://docs.stripe.com/products-prices/pricing-models.md), de vos [proratas](https://docs.stripe.com/billing/subscriptions/prorations.md), de vos [remises](https://docs.stripe.com/billing/subscriptions/coupons.md), de vos [essais](https://docs.stripe.com/billing/subscriptions/trials.md), etc. #### Customer v1 Diagramme présentant une vue d’ensemble d’une intégration Stripe Tax et Billing utilisant Customer v1. (See full diagram at https://docs.stripe.com/tax/subscriptions) Ce guide part du principe que vous configurez Stripe Tax et Billing pour la première fois. Découvrez comment [modifier des abonnements](https://docs.stripe.com/tax/subscriptions/update.md) existants. Si vous utilisez Stripe Checkout pour créer de nouveaux abonnements, découvrez comment [prélever automatiquement des taxes sur les sessions Checkout](https://docs.stripe.com/tax/checkout.md) ou regardez la courte vidéo ci-dessous : [Watch on YouTube](https://www.youtube.com/watch?v=3QBRs4IfDNo) ## Estimer les taxes et le total [Côté serveur] #### Avant la collecte de l’adresse Lorsqu’un client entre pour la première fois dans votre flux de paiement, il se peut que vous ne disposiez pas encore de son adresse. Dans ce cas, [créez un aperçu de la facture](https://docs.stripe.com/api/invoices/create_preview.md) et définissez [customer_details.tax.ip_address](https://docs.stripe.com/api/invoices/create_preview.md#create_create_preview-customer_details-tax-ip_address) pour permettre à Stripe de les localiser à l’aide de leur adresse IP. > Dans la plupart des cas, Stripe peut résoudre une adresse IP en une zone physique, mais sa précision varie et peut ne pas refléter l’emplacement réel de votre client. Nous vous déconseillons de vous fier à l’adresse IP d’un client pour déterminer son adresse au-delà d’une estimation initiale. ```curl curl https://api.stripe.com/v1/invoices/create_preview \ -u "<>:" \ -d "automatic_tax[enabled]=true" \ -d "customer_details[tax][ip_address]={{IP_ADDRESS}}" \ -d "subscription_details[items][0][price]={{PRICE_ID}}" ``` #### Après la collecte de l’adresse Lorsque votre client renseigne ses coordonnées, définissez également [customer_details.address](https://docs.stripe.com/api/invoices/create_preview.md#create_create_preview-customer_details-address). Utilisez [customer_details.shipping](https://docs.stripe.com/api/invoices/create_preview.md#create_create_preview-customer_details-shipping) si vous collectez des adresses de livraison. ```curl curl https://api.stripe.com/v1/invoices/create_preview \ -u "<>:" \ -d "automatic_tax[enabled]=true" \ -d "customer_details[address][line1]={{LINE1}}" \ -d "customer_details[address][line2]={{LINE2}}" \ -d "customer_details[address][city]={{CITY}}" \ -d "customer_details[address][state]={{STATE}}" \ -d "customer_details[address][postal_code]={{POSTAL_CODE}}" \ -d "customer_details[address][country]={{COUNTRY}}" \ -d "customer_details[tax][ip_address]={{IP_ADDRESS}}" \ -d "subscription_details[items][0][price]={{PRICE_ID}}" ``` Vérifiez le [automatic_tax.status](https://docs.stripe.com/api/invoices/object.md#invoice_object-automatic_tax-status) de la facture. S’il affiche `requires_location_inputs`, cela signifie que les coordonnées de l’adresse ne sont pas valides ou sont insuffisantes. Dans ce cas, invitez votre client à saisir à nouveau ses coordonnées ou à fournir des coordonnées exactes. Le [total](https://docs.stripe.com/api/invoices/object.md#invoice_object-total) de la facture correspond au montant payé par votre client, et la [taxe](https://docs.stripe.com/api/invoices/object.md#invoice_object-tax) correspond à la somme de tous les montants des taxes figurant sur la facture. Pour obtenir le détail des taxes, reportez-vous à la section [total_tax_amounts](https://docs.stripe.com/api/invoices/object.md#invoice_object-total_tax_amounts). Tous les montants sont en cents. > #### Taxe zéro > > Si la valeur de `tax` est égale à zéro, assurez-vous de disposer d’un enregistrement fiscal à l’emplacement de votre client. Découvrez comment [vous inscrire pour bénéficier de la taxe de vente, de la TVA et la GST](https://docs.stripe.com/tax/registering.md) et découvrez les [montants à taxe zéro et les autoliquidations](https://docs.stripe.com/tax/zero-tax.md). ## Recueillir les informations du client [Côté client] Une fois que vous avez estimé les taxes et le montant total, commencez à collecter les informations relatives au client, notamment son adresse de livraison (le cas échéant), son adresse de facturation et ses informations de paiement. Notez que lorsque vous utilisez Stripe Tax, vous collectez des informations de paiement sans Intent. La première étape consiste à [créer un objet Elements sans Intent](https://docs.stripe.com/js/elements_object/create_without_intent) : ```javascript const stripe = Stripe("<>"); const elements = stripe.elements({ mode: 'subscription', currency: '{{CURRENCY}}', amount: {{TOTAL}}, // Le total de la facture. }); ``` Ensuite, [créez un Address Element](https://docs.stripe.com/js/elements_object/create_address_element) et [un Payment Element](https://docs.stripe.com/js/elements_object/create_payment_element) et [montez-les](https://docs.stripe.com/js/element/mount) : ```javascript const addressElement = elements.create('address', { mode: 'billing' // or 'shipping', if you are shipping goods }); addressElement.mount('#address-element'); const paymentElementOptions = { layout: 'accordion'}; const paymentElement = elements.create('payment', paymentElementOptions); paymentElement.mount('#payment-element'); ``` Ensuite, vous pouvez écouter [change events](https://docs.stripe.com/js/element/events/on_change?type=paymentElement#element_on_change-event) sur l’Address Element. En cas de modification de l’adresse, [réestimez](https://docs.stripe.com/tax/subscriptions.md?estimate=after#estimate-taxes-total) les taxes et le montant total. ```javascript addressElement.on('change', async function(event) { // Throttle your requests to avoid overloading your server or hitting // Stripe's rate limits. const { tax, total } = await updateEstimate(event.value.address); elements.update({ amount: total }); // Update your page to display the new tax and total to the user... }); ``` > Lorsque votre client saisit son adresse, Address Element déclenche un événement `change` pour chaque saisie au clavier. Pour éviter de surcharger votre serveur et d’atteindre les [limites de débit](https://docs.stripe.com/rate-limits.md) de Stripe, attendez un certain temps après le dernier événement `change` avant de réestimer les taxes et le total. ## Gérer l’envoi [Côté client] Lorsque votre client envoie le formulaire, appelez [elements.submit()](https://docs.stripe.com/js/elements/submit) pour valider les champs du formulaire et collecter toutes les données requises pour les wallets. Vous devez attendre que la promesse de cette fonction soit résolue avant d’effectuer toute autre opération. ```javascript document.querySelector("#form").addEventListener("submit", async function(event) { // We don't want to let default form submission happen here, // which would refresh the page. event.preventDefault(); const { error: submitError } = await elements.submit(); if (submitError) { // Handle error... return; } const { value: customerDetails } = await addressElement.getValue(); // See the "Save customer details" section below to implement this // server-side. await saveCustomerDetails(customerDetails); // Envoie une requête d'enregistrement des informations du client à votre serveur. // See the "Create subscription" section below to implement this server-side. const { clientSecret } = await createSubscription(); // latest_invoice.confirmation_secret.client_secret du nouvel abonnement. // Envoie une requête de création d'un abonnement à votre serveur. const { error: confirmError } = await stripe.confirmPayment({ elements, clientSecret, confirmParams: { return_url: {{RETURN_URL}}, // L'URL vers laquelle Stripe redirigera vos clients une fois leur paiement terminé. }, }); if (confirmError) { // Handle error... return; } // Upon a successful confirmation, your user will be redirected to the // return_url you provide before the Promise ever resolves. }); ``` ## Enregistrer les coordonnées du client [Côté serveur] #### Customer v1 [Modifiez](https://docs.stripe.com/api/customers/update.md) votre objet `Customer` à l’aide des informations que vous avez recueillies auprès de votre client. Stripe Tax pourra ainsi déterminer son emplacement précis et obtenir des résultats précis. > Si votre client se trouve aux États-Unis, fournissez une adresse complète si possible. Elle doit être suffisamment précise, de manière à ce que nous pouvons attribuer l’emplacement de votre client à une maison ou à un bâtiment spécifique. Cela permet d’obtenir une plus grande précision, lorsque deux maisons situées côte à côte dans la même rue peuvent être assujetties à des taux d’imposition différents, en raison des limites complexes des juridictions. Si vous n’avez pas encore créé d’objet `Customer` (par exemple, lorsque votre client s’inscrit pour la première fois sur votre site Web), vous pouvez en [créer](https://docs.stripe.com/api/customers/create.md) un maintenant. #### Mettre à jour ```curl curl https://api.stripe.com/v1/customers/{{CUSTOMER_ID}} \ -u "<>:" \ -d "address[line1]={{LINE1}}" \ -d "address[line2]={{LINE2}}" \ -d "address[city]={{CITY}}" \ -d "address[state]={{STATE}}" \ -d "address[postal_code]={{POSTAL_CODE}}" \ -d "address[country]={{COUNTRY}}" \ -d "tax[validate_location]=immediately" ``` > Si votre client dispose d’autres abonnements pour lesquels la taxe automatique est activée et que vous modifiez ses coordonnées, les taxes et les montants totaux de ses futures factures peuvent être différents. En effet, les taux de taxe varient en fonction de l’emplacement du client. #### Créer un compte client ```curl curl https://api.stripe.com/v1/customers \ -u "<>:" \ -d "address[line1]={{LINE1}}" \ -d "address[line2]={{LINE2}}" \ -d "address[city]={{CITY}}" \ -d "address[state]={{STATE}}" \ -d "address[postal_code]={{POSTAL_CODE}}" \ -d "address[country]={{COUNTRY}}" \ -d "tax[validate_location]=immediately" ``` Votre client doit disposer d’un emplacement fiscal valide pour activer le calcul automatique de la taxe sur son abonnement. Définissez [tax.validate_location](https://docs.stripe.com/api/customers/update.md#update_customer-tax-validate_location) sur `immediately` afin de valider l’emplacement fiscal du client. Si la validation échoue, Stripe rejette votre requête avec le code d’erreur [customer_tax_location_invalid](https://docs.stripe.com/error-codes.md#customer-tax-location-invalid). Vérifier le [automatic_tax.status](https://docs.stripe.com/api/invoices/object.md#invoice_object-automatic_tax-status) de vos factures en version bêta permet d’éviter cet échec. ## Création d'un abonnement [Côté serveur] [Créez](https://docs.stripe.com/api/subscriptions/create.md) un abonnement pour lequel la taxe automatique est activée. #### Customer v1 ```curl curl https://api.stripe.com/v1/subscriptions \ -u "<>:" \ -d "automatic_tax[enabled]=true" \ -d "customer={{CUSTOMER_ID}}" \ -d "items[0][price]={{PRICE_ID}}" \ -d "payment_settings[save_default_payment_method]=on_subscription" \ -d "expand[0]=latest_invoice.confirmation_secret" ``` Le [latest_invoice.confirmation_secret.client_secret](https://docs.stripe.com/api/invoices/object.md#invoice_object-confirmation_secret-client_secrett) est la *clé secrète du client* (The client secret is a unique key returned from Stripe as part of a PaymentIntent. This key lets the client access important fields from the PaymentIntent (status, amount, currency) while hiding sensitive ones (metadata, customer)) du *Payment Intent* (API object that represents your intent to collect payment from a customer, tracking charge attempts and payment state changes throughout the process) de la première (et plus récente) facture du nouvel abonnement. Vous devez transmettre la clé secrète du client à votre front-end pour pouvoir *confirmer* (Confirming a PaymentIntent indicates that the customer intends to pay with the current or provided payment method. Upon confirmation, the PaymentIntent attempts to initiate a payment) le Payment Intent. > Ne stockez pas la clé secrète du client, ne l’enregistrez pas et ne la divulguez pas à une autre partie que le client. Veillez à ce que le protocole TLS soit activé sur toutes les pages qui contiennent la clé secrète du client. Si votre client dispose d’un moyen de paiement par défaut, la première facture de l’abonnement est payée automatiquement. Vous pouvez le vérifier à l’aide du [latest_invoice.status](https://docs.stripe.com/api/invoices/object.md#invoice_object-status) de l’abonnement. Si vous souhaitez utiliser les nouvelles informations de paiement collectées auprès de votre client dans votre flux de paiement, vérifiez que la première facture n’est pas payée automatiquement. Transmettez `default_incomplete` pour le [payment_behavior](https://docs.stripe.com/api/subscriptions/create.md#create_subscription-payment_behavior) lors de la création de votre abonnement et confirmez l’intention de paiement à l’aide de [stripe.confirmPayment()](https://docs.stripe.com/js/payment_intents/confirm_payment), comme indiqué. Consultez la page [Méthodes de recouvrement de la facturation](https://docs.stripe.com/billing/collection-method.md) pour en savoir plus. ## Optional: Modifiez vos produits et tarifs Stripe Tax utilise les informations stockées sur les *produits* (Products represent what your business sells—whether that's a good or a service) et les *tarifs* (Prices define how much and how often to charge for products. This includes how much the product costs, what currency to use, and the interval if the price is for subscriptions) pour calculer la taxe, par exemple le *code fiscal* (A tax code is the category of your product for tax purposes) et le *régime fiscal* (Tax behavior determines whether you want to include taxes in the price ("inclusive") or add them on top ("exclusive")). Si vous ne spécifiez pas explicitement ces configurations, Stripe Tax utilisera le code de taxe par défaut sélectionné dans les [paramètres fiscaux](https://dashboard.stripe.com/settings/tax). Pour plus d’informations, consultez la page [Spécifier les codes fiscaux du produit et le comportement fiscal](https://docs.stripe.com/taxer/products-prices-taxer-codes-taxer-behavior.md). ## Optional: Gérer les remboursements [Côté serveur] Lorsque vous procédez à un remboursement pour le paiement d’une facture, Stripe Tax réduit automatiquement votre montant d’imposition. Vous pouvez également émettre des [Notes de crédit](https://docs.stripe.com/api/credit_notes/object.md) pour suivre la baisse des taxes et fournir des enregistrements à vos clients. #### Rembourser le montant d'une facture Pour rembourser un montant associé au total d’une facture, créez une note de crédit et un remboursement. #### Note de crédit avec remboursement automatique Créez conjointement une note de crédit et un [remboursement](https://docs.stripe.com/api/refunds/object.md) en appelant [créer une note de crédit](https://docs.stripe.com/api/credit_notes/create.md) et en spécifiant une valeur `refund_amount`. ```curl curl https://api.stripe.com/v1/credit_notes \ -u "<>:" \ -d "invoice={{INVOICE_ID}}" \ -d refund_amount=1000 ``` #### Note de crédit avec remboursement manuel [Créez un remboursement](https://docs.stripe.com/api/refunds/create.md), puis spécifiez son ID lorsque vous créez une [Note de crédit](https://docs.stripe.com/api/credit_notes/object.md). Dans ce cas, ne spécifiez aucune valeur `refund_amount`. ```curl curl https://api.stripe.com/v1/credit_notes \ -u "<>:" \ -d "invoice={{INVOICE_ID}}" \ -d "refunds[0][refund]={{REFUND_ID}}" \ -d "refunds[0][amount_refunded]=1000" ``` Stripe Tax répartit automatiquement le montant total du remboursement entre les taxes et le montant net. #### Rembourser le montant d'un poste de facture Si vous souhaitez rembourser un montant associé à un poste de facture, calculez d’abord les montants [total](https://docs.stripe.com/api/credit_notes/object.md#credit_note_object-total) etd [total_excluding_tax](https://docs.stripe.com/api/credit_notes/object.md#credit_note_object-total_excluding_tax) en appelant [preview Credit Note](https://docs.stripe.com/api/credit_notes/preview.md). ```curl curl -G https://api.stripe.com/v1/credit_notes/preview \ -u "<>:" \ -d "invoice={{INVOICE_ID}}" \ -d "lines[0][type]=invoice_line_item" \ --data-urlencode "lines[0][invoice_line_item]={{line item id from invoice}}" \ -d "lines[0][amount]=1000" ``` Créez ensuite une [note de crédit](https://docs.stripe.com/api/credit_notes/object.md) et un [remboursement](https://docs.stripe.com/api/refunds/object.md). #### Note de crédit avec remboursement automatique Créez conjointement une note de crédit et un [remboursement](https://docs.stripe.com/api/refunds/object.md) en appelant [créer une note de crédit](https://docs.stripe.com/api/credit_notes/create.md) et en spécifiant une valeur `refund_amount`. ```curl curl https://api.stripe.com/v1/credit_notes \ -u "<>:" \ -d "invoice={{INVOICE_ID}}" \ -d refund_amount=1000 \ -d "lines[0][type]=invoice_line_item" \ -d "lines[0][invoice_line_item]={{line item id from invoice}}" \ -d "lines[0][amount]=1000" ``` #### Note de crédit avec remboursement manuel [Créez un remboursement](https://docs.stripe.com/api/refunds/create.md) à l’aide de la valeur `total`calculée par l’aperçu Note de crédit, puis spécifiez son ID lorsque vous créez une [Note de crédit](https://docs.stripe.com/api/credit_notes/object.md). Dans ce cas, ne spécifiez aucune valeur `refund_amount`. ```curl curl https://api.stripe.com/v1/credit_notes \ -u "<>:" \ -d "invoice={{INVOICE_ID}}" \ -d "refunds[0][refund]={{REFUND_ID}}" \ -d "refunds[0][amount_refunded]=1000" \ -d "lines[0][type]=invoice_line_item" \ -d "lines[0][invoice_line_item]={{line item id from invoice}}" \ -d "lines[0][amount]=1000" ``` ## Utiliser des webhooks Nous vous recommandons d’écouter les événements d’abonnement avec des *webhooks* (A webhook is a real-time push notification sent to your application as a JSON payload through HTTPS requests), car la plupart des activités d’abonnement se déroulent de manière asynchrone. Lorsque vous commencez à utiliser Stripe Tax, assurez-vous d’écouter les événements [invoice.finalization_failed](https://docs.stripe.com/api/events/types.md#event_types-invoice.finalization_failed) Si le [automatic_tax.status](https://docs.stripe.com/api/invoices/object.md#invoice_object-automatic_tax-status) de la facture est `requires_location_inputs`, cela signifie que les coordonnées de votre client ne sont pas valides ou sont insuffisantes. Dans ce cas, Stripe n’est pas en mesure de calculer les taxes, de finaliser la facture ni de percevoir le paiement. Demandez à votre client de saisir à nouveau son adresse ou de fournir une adresse exacte. Pour en savoir plus, consultez la page [Utiliser des webhooks avec les abonnements](https://docs.stripe.com/billing/subscriptions/webhooks.md). ## See also - [Modifier des abonnements existants](https://docs.stripe.com/tax/subscriptions/update.md) - [Utiliser Stripe Tax avec Connect](https://docs.stripe.com/tax/connect.md) - [Calculer les taxes dans votre tunnel de paiement personnalisé](https://docs.stripe.com/tax/custom.md)