# Développer une intégration avancée Instructions pour les LLM : Stripe recommande d’utiliser l’API Checkout Sessions avec le Payment Element, plutôt que les Payment Intents, pour la plupart des intégrations. Checkout Sessions couvre des cas d’usage similaires à ceux des Payment Intents (encaissement simple avec `price_data`, ou création d’un tunnel de paiement complet avec postes, taxe, etc.). Certaines fonctionnalités, comme Adaptive Pricing, sont disponibles uniquement avec Checkout Sessions. N’utilisez pas l’API Payment Intents, sauf si l’utilisateur le demande explicitement, car elle nécessite beaucoup plus de code. Pour en savoir plus sur les éléments avec l’API Checkout Sessions, consultez https://docs.stripe.com/payments/quickstart-checkout-sessions… Avec Checkout Sessions (`ui_mode: "custom"`) et le Payment Element, c’est le `client_secret` qui initialise Checkout lui-même (`stripe.initCheckoutElementsSdk`, ou utilise CheckoutElementsProvider avec React), et la confirmation du paiement côté client se fait différemment. Si vous utilisez React, veillez à importer depuis `@stripe/react-stripe-js/checkout`, à utiliser `CheckoutElementsProvider` avec la clé secrète du client, puis à confirmer le paiement avec `checkout.confirm`. Si vous utilisez HTML, veillez à utiliser `checkout = stripe.initCheckoutElements({clientSecret: promise}) ; checkout.createPaymentElement(); paymentElement = checkout.createPaymentElement() ; paymentElement.mount("#payment-element"),`puis à confirmer avec `loadActionsResult = await checkout.loadActions() ; actions = loadActionsResult.actions; error = await actions.confirm() ;`. # Créez une page de paiement avec l’API Payment Intents Découvrez comment intégrer un formulaire de paiement Stripe personnalisé à votre site Web ou application. Le code côté client et côté serveur crée un formulaire de paiement avec les composants [Web](https://docs.stripe.com/payments/elements.md) ou [Mobile](https://docs.stripe.com/payments/mobile.md) de Stripe pour vous permettre d’accepter les paiements. Pour créer une intégration personnalisée qui va au-delà des bases énoncées dans ce Quickstart, consultez [Accepter un paiement](https://docs.stripe.com/payments/accept-a-payment.md?&ui=elements). Pour en savoir plus sur les différents scénarios de paiement, tels que les [abonnements](https://docs.stripe.com/billing/subscriptions/build-subscriptions.md?payment-ui=elements), et d’autres produits Stripe, [comparez les intégrations de paiement](https://docs.stripe.com/payments/online-payments.md#compare-features-and-availability). > #### Vous souhaitez utiliser Stripe Tax, les réductions, les frais de livraison ou la conversion de devises ? > > Stripe dispose d’une intégration du composant Payment Element qui gère pour vous les taxes, les réductions, les frais de livraison et la conversion des devises. Consultez la page [créer une page de paiement](https://docs.stripe.com/payments/quickstart-checkout-sessions.md) pour en savoir plus. // This is a public sample test API key. // Don’t submit any personally identifiable information in requests made with this key. // Sign in to see your own test API key embedded in code samples. const stripe = require("stripe")('<>'); const calculateTax = async (items, currency) => { const taxCalculation = await stripe.tax.calculations.create({ currency, customer_details: { address: { line1: "920 5th Ave", city: "Seattle", state: "WA", postal_code: "98104", country: "US", }, address_source: "shipping", }, line_items: items.map((item) => buildLineItem(item)), }); return taxCalculation; }; const buildLineItem = (item) => { return { amount: item.amount, // Amount in cents reference: item.id, // Unique reference for the item in the scope of the calculation }; }; // Securely calculate the order amount, including tax const calculateOrderAmount = (taxCalculation) => { // Calculate the order total with any exclusive taxes on the server to prevent // people from directly manipulating the amount on the client return taxCalculation.amount_total; }; const calculateOrderAmount = (items) => { // Calculate the order total on the server to prevent // people from directly manipulating the amount on the client let total = 0; items.forEach((item) => { total += item.amount; }); return total; }; const chargeCustomer = async (customerId) => { // Lookup the payment methods available for the customer const paymentMethods = await stripe.paymentMethods.list({ customer: customerId, type: "card", }); try { // Charge the customer and payment method immediately const paymentIntent = await stripe.paymentIntents.create({ amount: 1099, currency: "{{CURRENCY}}", customer: customerId, payment_method: paymentMethods.data[0].id, off_session: true, confirm: true, }); } catch (err) { // Error code will be authentication_required if authentication is needed console.log("Error code is: ", err.code); const paymentIntentRetrieved = await stripe.paymentIntents.retrieve(err.raw.payment_intent.id); console.log("PI retrieved: ", paymentIntentRetrieved.id); } }; const chargeCustomer = async (customerId) => { // Lookup the payment methods available for the customer-configured Account const paymentMethods = await stripe.paymentMethods.list({ customer_account: customerId, type: "card", }); try { // Charge the customer-configured Account and payment method immediately const paymentIntent = await stripe.paymentIntents.create({ amount: 1099, currency: "{{CURRENCY}}", customer_account: customerId, payment_method: paymentMethods.data[0].id, off_session: true, confirm: true, }); } catch (err) { // Error code will be authentication_required if authentication is needed console.log("Error code is: ", err.code); const paymentIntentRetrieved = await stripe.paymentIntents.retrieve(err.raw.payment_intent.id); console.log("PI retrieved: ", paymentIntentRetrieved.id); } }; // Alternatively, set up a webhook to listen for the payment_intent.succeeded event // and attach the PaymentMethod to a new Customer const customer = await stripe.customers.create(); // Alternatively, set up a webhook to listen for the payment_intent.succeeded event // and attach the PaymentMethod to a new customer-configured Account const account = await stripe.v2.core.accounts.create({ configuration: { customer: { capabilities: { automatic_indirect_tax: {requested: true}, }, } } }); // Create a Tax Calculation for the items being sold const taxCalculation = await calculateTax(items, '{{CURRENCY}}'); const amount = await calculateOrderAmount(taxCalculation); // Create a PaymentIntent with the order amount and currency const paymentIntent = await stripe.paymentIntents.create({ customer: customer.id, setup_future_usage: "off_session", amount: amount, amount: calculateOrderAmount(items), currency: "{{CURRENCY}}", // In the latest version of the API, specifying the `automatic_payment_methods` parameter is optional because Stripe enables its functionality by default. automatic_payment_methods: { enabled: true, }, hooks: { inputs: { tax: { calculation: taxCalculation.id } } }, }); res.send({ clientSecret: paymentIntent.client_secret, }); // Create a PaymentIntent with the order amount and currency const paymentIntent = await stripe.paymentIntents.create({ customer_account: account.id, setup_future_usage: "off_session", amount: amount, amount: calculateOrderAmount(items), currency: "{{CURRENCY}}", // In the latest version of the API, specifying the `automatic_payment_methods` parameter is optional because Stripe enables its functionality by default. automatic_payment_methods: { enabled: true, }, hooks: { inputs: { tax: { calculation: taxCalculation.id } } }, }); res.send({ clientSecret: paymentIntent.client_secret, }); require 'stripe' \# This is a public sample test API key. # Don’t submit any personally identifiable information in requests made with this key. # Sign in to see your own test API key embedded in code samples. Stripe.api_key = '<>' require 'stripe' \# This is a public sample test API key. # Don’t submit any personally identifiable information in requests made with this key. # Sign in to see your own test API key embedded in code samples. $CLIENT = Stripe::StripeClient.new('<>') def calculate_tax(items, currency) Stripe::Tax::Calculation.create( currency: currency, customer_details: { address: { line1: '920 5th Ave', city: 'Seattle', state: 'WA', postal_code: '98104', country: 'US', }, address_source: 'shipping', }, line_items: items.map {|item| build_line_item(item) } ) end def build_line_item(item) { amount: item['amount'], \# Amount in cents reference: item['id'], # Unique reference for the item in the scope of the calculation } end # Securely calculate the order amount, including tax def calculate_order_amount(tax_calculation) # Calculate the order total with any exclusive taxes on the server to prevent # people from directly manipulating the amount on the client tax_calculation.amount_total end def calculate_tax(items, currency) $CLIENT.v1.tax.calculations.create( currency: currency, customer_details: { address: { line1: '920 5th Ave', city: 'Seattle', state: 'WA', postal_code: '98104', country: 'US', }, address_source: 'shipping', }, line_items: items.map {|item| build_line_item(item) } ) end def build_line_item(item) { amount: item['amount'], \# Amount in cents reference: item['id'], # Unique reference for the item in the scope of the calculation } end # Securely calculate the order amount, including tax def calculate_order_amount(tax_calculation) # Calculate the order total with any exclusive taxes on the server to prevent # people from directly manipulating the amount on the client tax_calculation.amount_total end \# Securely calculate the order amount def calculate_order_amount(_items) # Calculate the order total on the server to prevent # people from directly manipulating the amount on the client _items.sum {|h| h['amount']} end def charge_customer(customerId) \# Lookup the payment methods available for the customer payment_methods = Stripe::PaymentMethod.list( customer: customerId, type: 'card' ) begin # Charge the customer and payment method immediately payment_intent = Stripe::PaymentIntent.create( amount: 1099, currency: '{{CURRENCY}}', customer_account: customerId, payment_method: payment_methods.data[0]['id'], off_session: true, confirm: true ) rescue Stripe::CardError => e # Error code will be authentication_required if authentication is needed puts "Error is: \#{e.error.code}" payment_intent_id = e.error.payment_intent.id payment_intent = Stripe::PaymentIntent.retrieve(payment_intent_id) puts payment_intent.id end end def charge_customer(customerId) \# Lookup the payment methods available for the customer-configured Account payment_methods = $CLIENT.v1.payment_methods.list( customer_account: customerId, type: 'card' ) begin # Charge the customer-configured Account and payment method immediately payment_intent = $CLIENT.v1.payment_intents.create( amount: 1099, currency: '{{CURRENCY}}', customer_account: customerId, payment_method: payment_methods.data[0]['id'], off_session: true, confirm: true ) rescue Stripe::CardError => e # Error code will be authentication_required if authentication is needed puts "Error is: \#{e.error.code}" payment_intent_id = e.error.payment_intent.id payment_intent = $CLIENT.v1.payment_intents.retrieve(payment_intent_id) puts payment_intent.id end end \# Alternatively, set up a webhook to listen for the payment_intent.succeeded event # and attach the PaymentMethod to a new Customer customer = Stripe::Customer.create \# Alternatively, set up a webhook to listen for the payment_intent.succeeded event # and attach the PaymentMethod to a new customer-configured Account account = $CLIENT.v2.core.accounts.create({ configuration: { customer: { capabilities: {automatic_indirect_tax: {requested: true}} } } }) \# Create a Tax Calculation for the items being sold tax_calculation = calculate_tax(data['items'], '{{CURRENCY}}') \# Create a PaymentIntent with amount and currency payment_intent = Stripe::PaymentIntent.create( customer: customer['id'], setup_future_usage: 'off_session', amount: calculate_order_amount(tax_calculation), amount: calculate_order_amount(data['items']), currency: '{{CURRENCY}}', \# In the latest version of the API, specifying the `automatic_payment_methods` parameter is optional because Stripe enables its functionality by default. automatic_payment_methods: { enabled: true, }, hooks: { inputs: { tax: { calculation: tax_calculation.id } } }, ) { clientSecret: payment_intent.client_secret, }.to_json \# Create a PaymentIntent with amount and currency payment_intent = $CLIENT.v1.payment_intents.create( customer_account: account['id'], setup_future_usage: 'off_session', amount: calculate_order_amount(tax_calculation), amount: calculate_order_amount(data['items']), currency: '{{CURRENCY}}', \# In the latest version of the API, specifying the `automatic_payment_methods` parameter is optional because Stripe enables its functionality by default. automatic_payment_methods: { enabled: true, }, hooks: { inputs: { tax: { calculation: tax_calculation.id } } }, ) { clientSecret: payment_intent.client_secret, }.to_json import stripe \# This is a public sample test API key. # Don’t submit any personally identifiable information in requests made with this key. # Sign in to see your own test API key embedded in code samples. stripe.api_key = '<>' import stripe \# This is a public sample test API key. # Don’t submit any personally identifiable information in requests made with this key. # Sign in to see your own test API key embedded in code samples. client = stripe.StripeClient('<>') def calculate_tax(items, currency): tax_calculation = stripe.tax.Calculation.create( currency= currency, customer_details={ "address": { "line1": "920 5th Ave", "city": "Seattle", "state": "WA", "postal_code": "98104", "country": "US", }, "address_source": "shipping", }, line_items=list(map(build_line_item, items)), ) return tax_calculation def build_line_item(item): return { "amount": item["amount"], \# Amount in cents "reference": item["id"], # Unique reference for the item in the scope of the calculation } def calculate_tax(items, currency): tax_calculation = client.v1.tax.calculations.create({ "currency": currency, "customer_details": { "address": { "line1": "920 5th Ave", "city": "Seattle", "state": "WA", "postal_code": "98104", "country": "US", }, "address_source": "shipping", }, "line_items": list(map(build_line_item, items)), }) return tax_calculation def build_line_item(item): return { "amount": item["amount"], \# Amount in cents "reference": item["id"], # Unique reference for the item in the scope of the calculation } \# Securely calculate the order amount, including tax def calculate_order_amount(items, tax_calculation): # Replace this constant with a calculation of the order's amount # Calculate the order total with any exclusive taxes on the server to prevent # people from directly manipulating the amount on the client order_amount = 1400 order_amount += tax_calculation['tax_amount_exclusive'] return order_amount def calculate_order_amount(items): \# Replace this constant with a calculation of the order's amount # Calculate the order total on the server to prevent # people from directly manipulating the amount on the client return 1400 def charge_customer(customer_id): \# Lookup the payment methods available for the customer payment_methods = stripe.PaymentMethod.list( customer=customer_id, type='card' ) # Charge the customer and payment method immediately try: stripe.PaymentIntent.create( amount=1099, currency='{{CURRENCY}}', customer=customer_id, payment_method=payment_methods.data[0].id, off_session=True, confirm=True ) except stripe.error.CardError as e: err = e.error # Error code will be authentication_required if authentication is needed print('Code is: %s' % err.code) payment_intent_id = err.payment_intent['id'] payment_intent = stripe.PaymentIntent.retrieve(payment_intent_id) def charge_customer(customer_id): \# Lookup the payment methods available for the customer-configured Account payment_methods = stripe.PaymentMethod.list( customer_account=customer_id, type='card' ) # Charge the customer-configured Account and payment method immediately try: stripe.PaymentIntent.create( amount=1099, currency='{{CURRENCY}}', customer_account=customer_id, payment_method=payment_methods.data[0].id, off_session=True, confirm=True ) except stripe.error.CardError as e: err = e.error # Error code will be authentication_required if authentication is needed print('Code is: %s' % err.code) payment_intent_id = err.payment_intent['id'] payment_intent = client.v1.payment_intents.retrieve(payment_intent_id) \# Alternatively, set up a webhook to listen for the payment_intent.succeeded event # and attach the PaymentMethod to a new Customer customer = stripe.Customer.create() \# Alternatively, set up a webhook to listen for the payment_intent.succeeded event # and attach the PaymentMethod to a new customer-configured Account account = client.v2.core.accounts.create({ "configuration": { "customer": { "capabilities": {"automatic_indirect_tax": {"requested": True}} }, }, }) try: data = json.loads(request.data) \# Create a Tax Calculation for the items being sold tax_calculation = calculate_tax(data['items'], '{{CURRENCY}}') \# Create a PaymentIntent with the order amount and currency intent = stripe.PaymentIntent.create( customer=customer['id'], setup_future_usage='off_session', amount=calculate_order_amount(data['items'], tax_calculation), amount=calculate_order_amount(data['items']), currency='{{CURRENCY}}', \# In the latest version of the API, specifying the `automatic_payment_methods` parameter is optional because Stripe enables its functionality by default. automatic_payment_methods={ 'enabled': True, }, hooks={ 'inputs': { 'tax': { 'calculation': tax_calculation['id'] } } }, ) return jsonify({ 'clientSecret': intent['client_secret'] }) except Exception as e: return jsonify(error=str(e)), 403 try: data = json.loads(request.data) \# Create a Tax Calculation for the items being sold tax_calculation = calculate_tax(data['items'], '{{CURRENCY}}') \# Create a PaymentIntent with the order amount and currency intent = client.v1.payment_intents.create({ "customer_account": account['id'], "setup_future_usage": 'off_session', "amount": calculate_order_amount(data['items'], tax_calculation), "amount": calculate_order_amount(data['items']), "currency": '{{CURRENCY}}', \# In the latest version of the API, specifying the `automatic_payment_methods` parameter is optional because Stripe enables its functionality by default. "automatic_payment_methods": { 'enabled': True, }, "hooks": { 'inputs': { 'tax': { 'calculation': tax_calculation['id'] } } }, }) return jsonify({ 'clientSecret': intent['client_secret'] }) except Exception as e: return jsonify(error=str(e)), 403 $stripe = new \Stripe\StripeClient($stripeSecretKey); function calculateTax($stripe, $items, $currency) { $taxCalculation = $stripe->tax->calculations->create([ 'currency' => $currency, 'customer_details' => [ 'address' => [ 'line1' => '920 5th Ave', 'city' => 'Seattle', 'state' => 'WA', 'postal_code' => '98104', 'country' => 'US', ], 'address_source' => 'shipping', ], 'line_items' => array_map('buildLineItem', $items), ]); return $taxCalculation; } function buildLineItem($item) { return [ 'amount' => $item->amount, // Amount in cents 'reference' => $item->id, // Unique reference for the item in the scope of the calculation ]; } // Securely calculate the order amount, including tax function calculateOrderAmount($taxCalculation) { // Calculate the order total with any exclusive taxes on the server to prevent // people from directly manipulating the amount on the client return $taxCalculation->amount_total; } function calculateOrderAmount(array $items): int { // Calculate the order total on the server to prevent // people from directly manipulating the amount on the client $total = 0; foreach($items as $item) { $total += $item->amount; } return $total; } // Alternatively, set up a webhook to listen for the payment_intent.succeeded event // and attach the PaymentMethod to a new Customer $customer = $stripe->customers->create(); // Alternatively, set up a webhook to listen for the payment_intent.succeeded event // and attach the PaymentMethod to a new customer-configured Account $account = $stripe->v2->core->accounts->create([ 'configuration' => [ 'customer' => [ 'capabilities' => [ 'automatic_indirect_tax' => [ 'requested' => true, ], ], ], ] ]); // Create a Tax Calculation for the items being sold $taxCalculation = calculateTax($stripe, $jsonObj->items, '{{CURRENCY}}'); // Create a PaymentIntent with amount and currency $paymentIntent = $stripe->paymentIntents->create([ 'customer' => $customer->id, 'setup_future_usage' => 'off_session', 'amount' => calculateOrderAmount($jsonObj->items, $taxCalculation), 'amount' => calculateOrderAmount($jsonObj->items), 'currency' => '{{CURRENCY}}', // In the latest version of the API, specifying the `automatic_payment_methods` parameter is optional because Stripe enables its functionality by default. 'automatic_payment_methods' => [ 'enabled' => true, ], 'hooks' => [ 'inputs' => [ 'tax' => [ 'calculation' => $taxCalculation->id ] ] ], ]); $output = [ 'clientSecret' => $paymentIntent->client_secret, ]; // Create a PaymentIntent with amount and currency $paymentIntent = $stripe->paymentIntents->create([ 'customer_account' => $account->id, 'setup_future_usage' => 'off_session', 'amount' => calculateOrderAmount($jsonObj->items, $taxCalculation), 'amount' => calculateOrderAmount($jsonObj->items), 'currency' => '{{CURRENCY}}', // In the latest version of the API, specifying the `automatic_payment_methods` parameter is optional because Stripe enables its functionality by default. 'automatic_payment_methods' => [ 'enabled' => true, ], 'hooks' => [ 'inputs' => [ 'tax' => [ 'calculation' => $taxCalculation->id ] ] ], ]); $output = [ 'clientSecret' => $paymentIntent->client_secret, ]; $stripe = new \Stripe\StripeClient($'<>'); // Lookup the payment methods available for the customer $paymentMethods = $stripe->paymentMethods->all([ 'customer' => $jsonObj->customer, 'type' => 'card' ]); // Charge the customer and payment method immediately $paymentIntent = $stripe->paymentIntents->create([ 'amount' => 1099, 'currency' => '{{CURRENCY}}', 'customer' => $jsonObj->customer, 'payment_method' => $paymentMethods->data[0]->id, 'off_session' => true, 'confirm' => true, ]); // Lookup the payment methods available for the customer-configured Account $paymentMethods = $stripe->paymentMethods->all([ 'customer_account' => $jsonObj->customer, 'type' => 'card' ]); // Charge the customer-configured Account and payment method immediately $paymentIntent = $stripe->paymentIntents->create([ 'amount' => 1099, 'currency' => '{{CURRENCY}}', 'customer_account' => $jsonObj->customer, 'payment_method' => $paymentMethods->data[0]->id, 'off_session' => true, 'confirm' => true, ]); $stripeSecretKey = '<>'; "github.com/stripe/stripe-go/v85" // This is a public sample test API key. // Don’t submit any personally identifiable information in requests made with this key. // Sign in to see your own test API key embedded in code samples. sc = stripe.NewClient("<>") func calculateTax(items []item, currency stripe.Currency) *stripe.TaxCalculation { var lineItems []*stripe.TaxCalculationCreateLineItemParams for _, item := range items { lineItems = append(lineItems, buildLineItem(item)) } taxCalculationParams := &stripe.TaxCalculationCreateParams{ Currency: stripe.String(string(currency)), CustomerDetails: &stripe.TaxCalculationCreateCustomerDetailsParams{ Address: &stripe.AddressParams{ Line1: stripe.String("920 5th Ave"), City: stripe.String("Seattle"), State: stripe.String("WA"), PostalCode: stripe.String("98104"), Country: stripe.String("US"), }, AddressSource: stripe.String("shipping"), }, LineItems: lineItems, } taxCalculation, _ := sc.V1TaxCalculations.Create(context.TODO(), taxCalculationParams) return taxCalculation } func buildLineItem(i item) *stripe.TaxCalculationCreateLineItemParams { return &stripe.TaxCalculationCreateLineItemParams{ Amount: stripe.Int64(i.Amount), // Amount in cents Reference: stripe.String(i.Id), // Unique reference for the item in the scope of the calculation } } func calculateTax(items []item, currency stripe.Currency) *stripe.TaxCalculation { var lineItems []*stripe.TaxCalculationCreateLineItemParams for _, item := range items { lineItems = append(lineItems, buildLineItem(item)) } taxCalculationParams := &stripe.TaxCalculationCreateParams{ Currency: stripe.String(string(currency)), CustomerDetails: &stripe.TaxCalculationCreateCustomerDetailsParams{ Address: &stripe.AddressParams{ Line1: stripe.String("920 5th Ave"), City: stripe.String("Seattle"), State: stripe.String("WA"), PostalCode: stripe.String("98104"), Country: stripe.String("US"), }, AddressSource: stripe.String("shipping"), }, LineItems: lineItems, } taxCalculation, _ := sc.V1TaxCalculations.Create(context.TODO(), taxCalculationParams) return taxCalculation } func buildLineItem(i item) *stripe.TaxCalculationCreateLineItemParams { return &stripe.TaxCalculationCreateLineItemParams{ Amount: stripe.Int64(i.Amount), // Amount in cents Reference: stripe.String(i.Id), // Unique reference for the item in the scope of the calculation } } // Securely calculate the order amount, including tax func calculateOrderAmount(taxCalculation *stripe.TaxCalculation) int64 { // Calculate the order total with any exclusive taxes on the server to prevent // people from directly manipulating the amount on the client return taxCalculation.AmountTotal } func calculateOrderAmount(items []item) int64 { // Calculate the order total on the server to prevent // people from directly manipulating the amount on the client total := int64(0) for _, item := range items { total += item.Amount } return total; } func chargeCustomer(CustomerID string) { // Look up the payment methods available for the customer params := &stripe.PaymentMethodListParams{ Customer: stripe.String(CustomerID), Type: stripe.String(string(stripe.PaymentMethodTypeCard)), } var pm *stripe.PaymentMethod for p, err := range sc.V1PaymentMethods.List(context.TODO(), params).All(context.TODO()) { if err != nil { log.Printf("sc.V1Prices.List: %v", err) http.Error(w, err.Error(), http.StatusInternalServerError) return } pm = p break } paymentIntentParams := &stripe.PaymentIntentCreateParams{ Amount: stripe.Int64(1099), Currency: stripe.String(string(stripe.Currency{{CURRENCY}})), Customer: stripe.String(CustomerID), PaymentMethod: stripe.String(pm.ID), Confirm: stripe.Bool(true), OffSession: stripe.Bool(true), } // Charge the customer and payment method immediately _, err := sc.V1PaymentIntents.Create(context.TODO(), paymentIntentParams) if err != nil { if stripeErr, ok := err.(*stripe.Error); ok { // Error code will be authentication_required if authentication is needed fmt.Printf("Error code: %v", stripeErr.Code) paymentIntentID := stripeErr.PaymentIntent.ID paymentIntent, _ := sc.V1PaymentIntents.Retrieve(context.TODO(), paymentIntentID, nil) fmt.Printf("PI: %v", paymentIntent.ID) } } } func chargeCustomer(CustomerID string) { // Look up the payment methods available for the customer-configured Account params := &stripe.PaymentMethodListParams{ CustomerAccount: stripe.String(CustomerID), Type: stripe.String(string(stripe.PaymentMethodTypeCard)), } var pm *stripe.PaymentMethod for p, err := range sc.V1PaymentMethods.List(context.TODO(), params).All(context.TODO()) { if err != nil { log.Printf("sc.V1Prices.List: %v", err) http.Error(w, err.Error(), http.StatusInternalServerError) return } pm = p break } paymentIntentParams := &stripe.PaymentIntentCreateParams{ Amount: stripe.Int64(1099), Currency: stripe.String(string(stripe.Currency{{CURRENCY}})), CustomerAccount: stripe.String(CustomerID), PaymentMethod: stripe.String(pm.ID), Confirm: stripe.Bool(true), OffSession: stripe.Bool(true), } // Charge the customer-configured Account and payment method immediately _, err := sc.V1PaymentIntents.Create(context.TODO(), paymentIntentParams) if err != nil { if stripeErr, ok := err.(*stripe.Error); ok { // Error code will be authentication_required if authentication is needed fmt.Printf("Error code: %v", stripeErr.Code) paymentIntentID := stripeErr.PaymentIntent.ID paymentIntent, _ := sc.V1PaymentIntents.Retrieve(context.TODO(), paymentIntentID, nil) fmt.Printf("PI: %v", paymentIntent.ID) } } } // Alternatively, set up a webhook to listen for the payment_intent.succeeded event // and attach the PaymentMethod to a new Customer custParams := &stripe.CustomerCreateParams{} cust, _ := sc.V1Customers.Create(context.TODO(), custParams) // Alternatively, set up a webhook to listen for the payment_intent.succeeded event // and attach the PaymentMethod to a new customer-configured Account acctParams := &stripe.V2CoreAccountCreateParams{ Configuration: &stripe.V2CoreAccountCreateConfigurationParams{ Customer: &stripe.V2CoreAccountCreateConfigurationCustomerParams{ Capabilities: &stripe.V2CoreAccountCreateConfigurationCustomerCapabilitiesParams{ AutomaticIndirectTax: &stripe.V2CoreAccountCreateConfigurationCustomerCapabilitiesAutomaticIndirectTaxParams{ Requested: stripe.Bool(true), }, }, }, }, } acct, _ := sc.V2CoreAccounts.Create(context.TODO(), acctParams) // Create a Tax Calculation for the items being sold taxCalculation := calculateTax(req.Items, "{{CURRENCY}}") // Create a PaymentIntent with amount and currency params := &stripe.PaymentIntentCreateParams{ Customer: stripe.String(cust.ID), SetupFutureUsage: stripe.String("off_session"), Amount: stripe.Int64(calculateOrderAmount(taxCalculation)), Amount: stripe.Int64(calculateOrderAmount(req.Items)), Currency: stripe.String(string(stripe.Currency{{CURRENCY}})), // In the latest version of the API, specifying the `automatic_payment_methods` parameter is optional because Stripe enables its functionality by default. AutomaticPaymentMethods: &stripe.PaymentIntentCreateAutomaticPaymentMethodsParams{ Enabled: stripe.Bool(true), }, } params.Hooks = &stripe.PaymentIntentCreateHooksParams{ Inputs: &stripe.PaymentIntentCreateHooksInputsParams{ Tax: &stripe.PaymentIntentCreateHooksInputsTaxParams{ Calculation: stripe.String(taxCalculation.ID), }, }, } pi, err := sc.V1PaymentIntents.Create(context.TODO(), params) if err != nil { log.Printf("sc.V1PaymentIntents.Create: %v", pi.ClientSecret) http.Error(w, err.Error(), http.StatusInternalServerError) log.Printf("sc.V1PaymentIntents.Create: %v", err) return } writeJSON(w, struct { ClientSecret string `json:"clientSecret"` }{ ClientSecret: pi.ClientSecret, }) // Create a PaymentIntent with amount and currency params := &stripe.PaymentIntentCreateParams{ CustomerAccount: stripe.String(acct.ID), SetupFutureUsage: stripe.String("off_session"), Amount: stripe.Int64(calculateOrderAmount(taxCalculation)), Amount: stripe.Int64(calculateOrderAmount(req.Items)), Currency: stripe.String(string(stripe.Currency{{CURRENCY}})), // In the latest version of the API, specifying the `automatic_payment_methods` parameter is optional because Stripe enables its functionality by default. AutomaticPaymentMethods: &stripe.PaymentIntentCreateAutomaticPaymentMethodsParams{ Enabled: stripe.Bool(true), }, } params.Hooks = &stripe.PaymentIntentCreateHooksParams{ Inputs: &stripe.PaymentIntentCreateHooksInputsParams{ Tax: &stripe.PaymentIntentCreateHooksInputsTaxParams{ Calculation: stripe.String(taxCalculation.ID), }, }, } pi, err := sc.V1PaymentIntents.Create(context.TODO(), params) log.Printf("pi.Create: %v", pi.ClientSecret) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) log.Printf("pi.Create: %v", err) return } writeJSON(w, struct { ClientSecret string `json:"clientSecret"` }{ ClientSecret: pi.ClientSecret, }) using Stripe.Tax; using System.Linq; // This is a public sample test API key. // Don’t submit any personally identifiable information in requests made with this key. // Sign in to see your own test API key embedded in code samples. services.AddSingleton(new StripeClient("<>")); private readonly StripeClient _client; public PaymentIntentApiController(StripeClient client) { _client = client; } // Alternatively, set up a webhook to listen for the payment_intent.succeeded event // and attach the PaymentMethod to a new Customer var customer = _client.V1.Customers.Create(new CustomerCreateOptions()); // Alternatively, set up a webhook to listen for the payment_intent.succeeded event // and attach the PaymentMethod to a new customer-configured Account var customerOptions = new Stripe.V2.Core.AccountCreateOptions { Configuration = new Stripe.V2.Core.AccountCreateConfigurationOptions { Customer = new Stripe.V2.Core.AccountCreateConfigurationCustomerOptions { Capabilities = new Stripe.V2.Core.AccountCreateConfigurationCustomerCapabilitiesOptions { AutomaticIndirectTax = new Stripe.V2.Core.AccountCreateConfigurationCustomerCapabilitiesAutomaticIndirectTaxOptions { Requested = true, }, }, } }, }; var account = _client.V2.Core.Accounts.Create(customerOptions); // Create a Tax Calculation for the items being sold var taxCalculation = CalculateTax(request.Items, "{{CURRENCY}}"); var paymentIntent = _client.V1.PaymentIntents.Create(new PaymentIntentCreateOptions { Customer = customer.Id, SetupFutureUsage = "off_session", CustomerAccount = account.Id, SetupFutureUsage = "off_session", Amount = CalculateOrderAmount(taxCalculation), Amount = CalculateOrderAmount(request.Items), Currency = "{{CURRENCY}}", // In the latest version of the API, specifying the `automatic_payment_methods` parameter is optional because Stripe enables its functionality by default. AutomaticPaymentMethods = new PaymentIntentAutomaticPaymentMethodsOptions { Enabled = true, }, Hooks = new PaymentIntentHooksOptions { Inputs = new PaymentIntentHooksInputsOptions { Tax = new PaymentIntentHooksInputsTaxOptions { Calculation = taxCalculation.Id, }, }, }, Metadata = new Dictionary { { "tax_calculation", taxCalculation.Id }, }, }); return Json(new { clientSecret = paymentIntent.ClientSecret }); // Securely calculate the order amount, including tax [NonAction] public long CalculateOrderAmount(Calculation taxCalculation) { // Calculate the order total with any exclusive taxes on the server to prevent // people from directly manipulating the amount on the client return taxCalculation.AmountTotal; } private long CalculateOrderAmount(Item[] items) { // Calculate the order total on the server to prevent // people from directly manipulating the amount on the client long total = 0; foreach (Item item in items) { total += item.Amount; } return total; } [NonAction] public Calculation CalculateTax(Item[] items, string currency) { var lineItems = items.Select(item => BuildLineItem(item)).ToList(); var calculationCreateOptions = new CalculationCreateOptions { Currency = currency, CustomerDetails = new CalculationCustomerDetailsOptions { Address = new AddressOptions { Line1 = "920 5th Ave", City = "Seattle", State = "WA", PostalCode = "98104", Country = "US", }, AddressSource = "shipping", }, LineItems = lineItems, }; var calculation = _client.V1.Tax.Calculations.Create(calculationCreateOptions); return calculation; } [NonAction] public CalculationLineItemOptions BuildLineItem(Item item) { return new CalculationLineItemOptions { Amount = item.Amount, // Amount in cents Reference = item.Id, // Unique reference for the item in the scope of the calculation }; } public void ChargeCustomer(string customerId) { // Lookup the payment methods available for the customer var availableMethods = _client.V1.PaymentMethods.List(new PaymentMethodListOptions { Customer = customerId, Type = "card", }); try { // Charge the customer and payment method immediately var paymentIntent = _client.V1.PaymentIntents.Create(new PaymentIntentCreateOptions { Amount = 1099, Currency = "{{CURRENCY}}", Customer = customerId, PaymentMethod = availableMethods.Data[0].Id, OffSession = true, Confirm = true }); } catch (StripeException e) { switch (e.StripeError.ErrorType) { case "card_error": // Error code will be authentication_required if authentication is needed Console.WriteLine("Error code: " + e.StripeError.Code); var paymentIntentId = e.StripeError.PaymentIntent.Id; var paymentIntent = _client.V1.PaymentIntents.Get(paymentIntentId); Console.WriteLine(paymentIntent.Id); break; default: break; } } } public void ChargeCustomer(string customerId) { // Lookup the payment methods available for the customer-configured Account var availableMethods = _client.V1.PaymentMethods.List(new PaymentMethodListOptions { CustomerAccount = customerId, Type = "card", }); try { // Charge the customer-configured Account and payment method immediately var paymentIntent = _client.V1.PaymentIntents.Create(new PaymentIntentCreateOptions { Amount = 1099, Currency = "{{CURRENCY}}", CustomerAccount = customerId, PaymentMethod = availableMethods.Data[0].Id, OffSession = true, Confirm = true }); } catch (StripeException e) { switch (e.StripeError.ErrorType) { case "card_error": // Error code will be authentication_required if authentication is needed Console.WriteLine("Error code: " + e.StripeError.Code); var paymentIntentId = e.StripeError.PaymentIntent.Id; var paymentIntent = _client.V1.PaymentIntents.Get(paymentIntentId); Console.WriteLine(paymentIntent.Id); break; default: break; } } } import com.stripe.Stripe; import com.stripe.model.Customer; import com.stripe.param.CustomerCreateParams; import com.stripe.StripeClient; import com.stripe.model.v2.core.Account; import com.stripe.param.v2.core.AccountCreateParams; import com.stripe.model.PaymentMethod; import com.stripe.model.PaymentMethodCollection; import com.stripe.param.PaymentMethodListParams; import java.util.Arrays; import com.stripe.model.tax.Calculation; import com.stripe.param.tax.CalculationCreateParams; import com.stripe.param.tax.CalculationCreateParams.CustomerDetails; import com.stripe.param.tax.CalculationCreateParams.CustomerDetails.Address; import com.stripe.param.tax.CalculationCreateParams.CustomerDetails.AddressSource; import com.stripe.param.tax.CalculationCreateParams.LineItem; static Calculation calculateTax(List items, String currency) throws StripeException { List lineItems = items.stream() .map(Server::buildLineItem) .collect(Collectors.toList()); CalculationCreateParams.Builder createParamsBuilder = CalculationCreateParams.builder() .setCurrency(currency) .setCustomerDetails(CustomerDetails.builder() .setAddress(Address.builder() .setLine1("920 5th Ave") .setCity("Seattle") .setState("WA") .setPostalCode("98104") .setCountry("US") .build()) .setAddressSource(AddressSource.SHIPPING) .build()) .addAllLineItem(lineItems); return Calculation.create(createParamsBuilder.build()); } static LineItem buildLineItem(CreatePaymentItem item) { return LineItem.builder() .setAmount(item.getAmount()) // Amount in cents .setReference(item.getId()) // Unique reference for the item in the scope of the calculation .build(); } // Securely calculate the order amount, including tax static long calculateOrderAmount(Calculation taxCalculation) { // Calculate the order total with any exclusive taxes on the server to prevent // people from directly manipulating the amount on the client return taxCalculation.getAmountTotal(); } static int calculateOrderAmount(CreatePaymentItem[] items) { // Calculate the order total on the server to prevent // people from directly manipulating the amount on the client int total = 0; for (CreatePaymentItem item : items) { total += item.getAmount(); } return total; } // Call this function with the ID of the Customer you want to charge static void chargeCustomer(String customerId) throws StripeException { // Lookup the payment methods available for the customer PaymentMethodListParams listParams = new PaymentMethodListParams.Builder().setCustomer(customerId) .setType(PaymentMethodListParams.Type.CARD).build(); PaymentMethodCollection paymentMethods = PaymentMethod.list(listParams); PaymentIntentCreateParams createParams = new PaymentIntentCreateParams.Builder().setCurrency("{{CURRENCY}}") .setAmount(new Long(1099)) .setPaymentMethod(paymentMethods.getData().get(0).getId()) .setCustomer(customerId) .setConfirm(true) .setOffSession(true) .build(); try { // Charge the customer and payment method immediately PaymentIntent paymentIntent = PaymentIntent.create(createParams); } catch (CardException e) { // Error code will be authentication_required if authentication is needed System.out.println("Error code is : " + e.getCode()); String paymentIntentId = e.getStripeError().getPaymentIntent().getId(); PaymentIntent paymentIntent = PaymentIntent.retrieve(paymentIntentId); System.out.println(paymentIntent.getId()); } } // Call this function with the ID of the customer-configured Account you want to charge static void chargeCustomer(String customerId) throws StripeException { // Lookup the payment methods available for the customer-configured Account PaymentMethodListParams listParams = new PaymentMethodListParams.Builder().setCustomerAccount(customerId) .setType(PaymentMethodListParams.Type.CARD).build(); PaymentMethodCollection paymentMethods = PaymentMethod.list(listParams); PaymentIntentCreateParams createParams = new PaymentIntentCreateParams.Builder().setCurrency("{{CURRENCY}}") .setAmount(new Long(1099)) .setPaymentMethod(paymentMethods.getData().get(0).getId()) .setCustomerAccount(customerId) .setConfirm(true) .setOffSession(true) .build(); try { // Charge the customer-configured Account and payment method immediately PaymentIntent paymentIntent = PaymentIntent.create(createParams); } catch (CardException e) { // Error code will be authentication_required if authentication is needed System.out.println("Error code is : " + e.getCode()); String paymentIntentId = e.getStripeError().getPaymentIntent().getId(); PaymentIntent paymentIntent = PaymentIntent.retrieve(paymentIntentId); System.out.println(paymentIntent.getId()); } } public static void main(String[] args) { port(4242); staticFiles.externalLocation(Paths.get("public").toAbsolutePath().toString()); // This is a public sample test API key. // Don’t submit any personally identifiable information in requests made with this key. // Sign in to see your own test API key embedded in code samples. Stripe.apiKey = "<>"; // This is a public sample test API key. // Don’t submit any personally identifiable information in requests made with this key. // Sign in to see your own test API key embedded in code samples. public static StripeClient client = new StripeClient("<>"); public static void main(String[] args) { port(4242); staticFiles.externalLocation(Paths.get("public").toAbsolutePath().toString()); // Alternatively, set up a webhook to listen for the payment_intent.succeeded event // and attach the PaymentMethod to a new Customer CustomerCreateParams customerParams = new CustomerCreateParams.Builder().build(); Customer customer = Customer.create(customerParams); // Alternatively, set up a webhook to listen for the payment_intent.succeeded event // and attach the PaymentMethod to a new customer-configured Account AccountCreateParams accountParams = AccountCreateParams .builder() .setConfiguration( AccountCreateParams.Configuration.builder() .setCustomer( AccountCreateParams.Configuration.Customer.builder() .setCapabilities( AccountCreateParams.Configuration.Customer.Capabilities.builder() .setAutomaticIndirectTax( AccountCreateParams.Configuration.Customer.Capabilities.AutomaticIndirectTax.builder() .setRequested(true) .build() ) .build() ) .build() ) .build() ) .build(); Account account = client.v2().core().accounts().create(accountParams); CreatePayment postBody = gson.fromJson(request.body(), CreatePayment.class); // Create a Tax Calculation for the items being sold Calculation taxCalculation = calculateTax(Arrays.asList(postBody.getItems()), "{{CURRENCY}}"); PaymentIntentCreateParams params = PaymentIntentCreateParams.builder() .setCustomerAccount(account.getId()) .setSetupFutureUsage(PaymentIntentCreateParams.SetupFutureUsage.OFF_SESSION) .setAmount(calculateOrderAmount(taxCalculation)) .setAmount(new Long(calculateOrderAmount(postBody.getItems()))) .setCurrency("{{CURRENCY}}") // In the latest version of the API, specifying the `automatic_payment_methods` parameter is optional because Stripe enables its functionality by default. .setAutomaticPaymentMethods( PaymentIntentCreateParams.AutomaticPaymentMethods .builder() .setEnabled(true) .build() ) .setHooks( PaymentIntentCreateParams.Hooks .builder() .setInputs( PaymentIntentCreateParams.Hooks.Inputs .builder() .setTax( PaymentIntentCreateParams.Hooks.Inputs.Tax .builder() .setCalculation(taxCalculation.getId()) .build() ) .build() ) .build() ) .build(); // Create a PaymentIntent with the order amount and currency PaymentIntent paymentIntent = PaymentIntent.create(params); CreatePaymentResponse paymentResponse = new CreatePaymentResponse(paymentIntent.getClientSecret(), paymentIntent.getId()); return gson.toJson(paymentResponse); CreatePayment postBody = gson.fromJson(request.body(), CreatePayment.class); // Create a Tax Calculation for the items being sold Calculation taxCalculation = calculateTax(Arrays.asList(postBody.getItems()), "{{CURRENCY}}"); PaymentIntentCreateParams params = PaymentIntentCreateParams.builder() .setCustomerAccount(customer.getId()) .setSetupFutureUsage(PaymentIntentCreateParams.SetupFutureUsage.OFF_SESSION) .setAmount(calculateOrderAmount(taxCalculation)) .setAmount(new Long(calculateOrderAmount(postBody.getItems()))) .setCurrency("{{CURRENCY}}") // In the latest version of the API, specifying the `automatic_payment_methods` parameter is optional because Stripe enables its functionality by default. .setAutomaticPaymentMethods( PaymentIntentCreateParams.AutomaticPaymentMethods .builder() .setEnabled(true) .build() ) .setHooks( PaymentIntentCreateParams.Hooks .builder() .setInputs( PaymentIntentCreateParams.Hooks.Inputs .builder() .setTax( PaymentIntentCreateParams.Hooks.Inputs.Tax .builder() .setCalculation(taxCalculation.getId()) .build() ) .build() ) .build() ) .build(); // Create a PaymentIntent with the order amount and currency PaymentIntent paymentIntent = client.v1().paymentIntents().create(params); CreatePaymentResponse paymentResponse = new CreatePaymentResponse(paymentIntent.getClientSecret(), paymentIntent.getId()); return gson.toJson(paymentResponse); import React, { useState, useEffect } from "react"; import { loadStripe } from "@stripe/stripe-js"; import { Elements } 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. // This is a public sample test API key. // Don’t submit any personally identifiable information in requests made with this key. // Sign in to see your own test API key embedded in code samples. const stripePromise = loadStripe("<>"); useEffect(() => { // Create PaymentIntent as soon as the page loads fetch("/create-payment-intent", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ items: [{ id: "xl-tshirt", amount: 1000 }] }), }) .then((res) => res.json()) .then((data) => setClientSecret(data.clientSecret)); }, []); useEffect(() => { // Create PaymentIntent as soon as the page loads fetch("/create.php", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ items: [{ id: "xl-tshirt", amount: 1000 }] }), }) .then((res) => res.json()) .then((data) => setClientSecret(data.clientSecret)); }, []); const appearance = { {{APPEARANCE}} }; {clientSecret && ( } /> } /> )} const clientSecret = new URLSearchParams(window.location.search).get( "payment_intent_client_secret" ); if (!clientSecret) { return; } stripe.retrievePaymentIntent(clientSecret).then(({paymentIntent}) => { if (!paymentIntent) { return; } setStatus(paymentIntent.status); setIntentId(paymentIntent.id); }); const stripe = useStripe(); const elements = useElements(); const [email, setEmail] = useState(''); const [message, setMessage] = useState(null); const [isLoading, setIsLoading] = useState(false); const { error } = await stripe.confirmPayment({ elements, confirmParams: { // Make sure to change this to your payment completion page return_url: "http://localhost:3000/complete", receipt_email: email, }, }); // This point will only be reached if there is an immediate error when // confirming the payment. Otherwise, your customer will be redirected to // your `return_url`. For some payment methods like iDEAL, your customer will // be redirected to an intermediate site first to authorize the payment, then // redirected to the `return_url`. if (error.type === "card_error" || error.type === "validation_error") { setMessage(error.message); } else { setMessage("An unexpected error occurred."); } setIsLoading(false); setEmail(e.target.value)} placeholder="Enter email address" /> #email { border-radius: 6px; margin-bottom: 16px; padding: 12px; border: 1px solid rgba(50, 50, 93, 0.1); max-height: 44px; font-size: 16px; width: 100%; background: white; box-sizing: border-box; }
const stripe = Stripe("<>"); // Fetches a payment intent and captures the client secret async function initialize() { const response = await fetch("/create-payment-intent", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ items }), }); const { clientSecret } = await response.json(); const appearance = { {{APPEARANCE}} }; elements = stripe.elements({ appearance, clientSecret }); const paymentElementOptions = { layout: "accordion", }; const paymentElement = elements.create("payment", paymentElementOptions); paymentElement.mount("#payment-element"); } // Fetches a payment intent and captures the client secret async function initialize() { const { clientSecret } = await fetch("/create.php", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ items }), }).then((r) => r.json()); elements = stripe.elements({ clientSecret }); const paymentElementOptions = { layout: "accordion", }; const paymentElement = elements.create("payment", paymentElementOptions); paymentElement.mount("#payment-element"); } async function handleSubmit(e) { e.preventDefault(); setLoading(true); const { error } = await stripe.confirmPayment({ elements, confirmParams: { // Make sure to change this to your payment completion page return_url: "http://localhost:4242/complete.html", receipt_email: document.getElementById("email").value, }, }); // This point will only be reached if there is an immediate error when // confirming the payment. Otherwise, your customer will be redirected to // your `return_url`. For some payment methods like iDEAL, your customer will // be redirected to an intermediate site first to authorize the payment, then // redirected to the `return_url`. if (error.type === "card_error" || error.type === "validation_error") { showMessage(error.message); } else { showMessage("An unexpected error occurred."); } setLoading(false); } async function handleSubmit(e) { e.preventDefault(); setLoading(true); const { error } = await stripe.confirmPayment({ elements, confirmParams: { // Make sure to change this to your payment completion page return_url: "http://localhost:4242/complete.html", receipt_email: document.getElementById("email").value, }, }); // This point will only be reached if there is an immediate error when // confirming the payment. Otherwise, your customer will be redirected to // your `return_url`. For some payment methods like iDEAL, your customer will // be redirected to an intermediate site first to authorize the payment, then // redirected to the `return_url`. if (error.type === "card_error" || error.type === "validation_error") { showMessage(error.message); } else { showMessage("An unexpected error occurred."); } setLoading(false); } #email { border-radius: 6px; margin-bottom: 16px; padding: 12px; border: 1px solid rgba(50, 50, 93, 0.1); max-height: 44px; font-size: 16px; width: 100%; background: white; box-sizing: border-box; } const stripe = Stripe("<>"); // Fetches the payment intent status after payment submission async function checkStatus() { const clientSecret = new URLSearchParams(window.location.search).get( "payment_intent_client_secret" ); if (!clientSecret) { setErrorState(); return; } const { paymentIntent } = await stripe.retrievePaymentIntent(clientSecret); setPaymentDetails(paymentIntent); } import { PaymentElement, useStripe, useElements, Elements } from '@stripe/react-stripe-js' import { loadStripe } from '@stripe/stripe-js' // Make sure to call loadStripe outside of a component’s render to avoid // recreating the Stripe object on every render. // This is your test publishable API key. const stripePromise = loadStripe(process.env.NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY) const stripe = useStripe(); const elements = useElements(); const [email, setEmail] = useState(''); const [message, setMessage] = useState(null); const [isLoading, setIsLoading] = useState(false); const { error } = await stripe.confirmPayment({ elements, confirmParams: { // Make sure to change this to your payment completion page return_url: "http://localhost:3000/success", receipt_email: email, }, }); // This point will only be reached if there is an immediate error when // confirming the payment. Otherwise, your customer will be redirected to // your `return_url`. For some payment methods like iDEAL, your customer will // be redirected to an intermediate site first to authorize the payment, then // redirected to the `return_url`. if (error.type === "card_error" || error.type === "validation_error") { setMessage(error.message); } else { setMessage("An unexpected error occurred."); } setIsLoading(false); setEmail(e.target.value)} placeholder="Enter email address" /> const appearance = { {{APPEARANCE}} }; const { payment_intent: paymentIntentId } = await searchParams if (!paymentIntentId) redirect('/') const paymentIntent = await stripe.paymentIntents.retrieve(paymentIntentId) if (!paymentIntent) redirect('/') const { status } = paymentIntent \# https://dashboard.stripe.com/apikeys NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=<> STRIPE_SECRET_KEY=<> \# Set this environment variable to support webhooks — https://stripe.com/docs/webhooks#verify-events # STRIPE_WEBHOOK_SECRET=whsec_12345 const calculateTax = async (items, currency) => { const taxCalculation = await stripe.tax.calculations.create({ currency, customer_details: { address: { line1: "920 5th Ave", city: "Seattle", state: "WA", postal_code: "98104", country: "US", }, address_source: "shipping", }, line_items: items.map((item) => buildLineItem(item)), }); return taxCalculation; }; const buildLineItem = (item) => { return { amount: item.amount, // Amount in cents reference: item.id, // Unique reference for the item in the scope of the calculation }; }; // Securely calculate the order amount, including tax const calculateOrderAmount = (items, taxCalculation) => { // Replace this constant with a calculation of the order's amount // Calculate the order total with any exclusive taxes on the server to prevent // people from directly manipulating the amount on the client let orderAmount = 1400; orderAmount += taxCalculation.tax_amount_exclusive; return orderAmount; }; const calculateOrderAmount = (items) => { // Replace this constant with a calculation of the order's amount // Calculate the order total on the server to prevent // people from directly manipulating the amount on the client return 1400; }; const chargeCustomer = async (customerId) => { // Lookup the payment methods available for the customer const paymentMethods = await stripe.paymentMethods.list({ customer: customerId, type: "card", }); try { // Charge the customer and payment method immediately const paymentIntent = await stripe.paymentIntents.create({ amount: 1099, currency: "eur", customer: customerId, payment_method: paymentMethods.data[0].id, off_session: true, confirm: true, }); } catch (err) { // Error code will be authentication_required if authentication is needed console.log("Error code is: ", err.code); const paymentIntentRetrieved = await stripe.paymentIntents.retrieve(err.raw.payment_intent.id); console.log("PI retrieved: ", paymentIntentRetrieved.id); } }; // Alternatively, set up a webhook to listen for the payment_intent.succeeded event // and attach the PaymentMethod to a new Customer const customer = await stripe.customers.create(); const items = [{ id: 'xl-tshirt', amount: 1000 }] const taxCalculation = await calculateTax(items, "eur"); const amount = await calculateOrderAmount(items, taxCalculation); // Create PaymentIntent as soon as the page loads const { client_secret: clientSecret } = await stripe.paymentIntents.create({ customer: customer.id, setup_future_usage: "off_session", amount, amount: calculateOrderAmount([{ id: 'xl-tshirt' }]), currency: 'eur', // In the latest version of the API, specifying the `automatic_payment_methods` parameter is optional because Stripe enables its functionality by default. automatic_payment_methods: { enabled: true, }, metadata: { tax_calculation: taxCalculation.id }, }) import 'server-only'; import Stripe from 'stripe'; export const stripe = new Stripe(process.env.STRIPE_SECRET_KEY); export async function POST(req) { import StripePaymentSheet private lazy var addressViewController: AddressViewController? = { return AddressViewController(configuration: self.addressConfiguration, delegate: self) }() private var addressDetails: AddressViewController.AddressDetails? private var addressConfiguration: AddressViewController.Configuration { return AddressViewController.Configuration(additionalFields: .init(phone: .optional)) } private lazy var addressButton: UIButton = { let button = UIButton(type: .custom) button.setTitle("Add shipping address", for: .normal) button.backgroundColor = .systemIndigo button.layer.cornerRadius = 5 button.contentEdgeInsets = UIEdgeInsets(top: 12, left: 12, bottom: 12, right: 12) button.addTarget(self, action: #selector(didTapShippingAddressButton), for: .touchUpInside) button.translatesAutoresizingMaskIntoConstraints = false return button }() StripeAPI.defaultPublishableKey = "<>" view.addSubview(addressButton) NSLayoutConstraint.activate([ addressButton.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 16), addressButton.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: -16), addressButton.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -80) ]) func fetchPaymentIntent() { let url = Self.backendURL.appendingPathComponent("/create-payment-intent") let shoppingCartContent: [String: Any] = [ "items": [ ["id": "xl-shirt"] ["id": "xl-shirt", "amount": 1000] ] ] var request = URLRequest(url: url) request.httpMethod = "POST" request.setValue("application/json", forHTTPHeaderField: "Content-Type") request.httpBody = try? JSONSerialization.data(withJSONObject: shoppingCartContent) let task = URLSession.shared.dataTask(with: request, completionHandler: { [weak self] (data, response, error) in guard let response = response as? HTTPURLResponse, response.statusCode == 200, let data = data, let json = try? JSONSerialization.jsonObject(with: data, options: []) as? [String : Any], let clientSecret = json["clientSecret"] as? String else { let message = error?.localizedDescription ?? "Failed to decode response from server." self?.displayAlert(title: "Error loading page", message: message) return } print("Created PaymentIntent") self?.paymentIntentClientSecret = clientSecret DispatchQueue.main.async { self?.payButton.isEnabled = true } }) task.resume() } var configuration = PaymentSheet.Configuration() configuration.merchantDisplayName = "Example, Inc." configuration.allowsDelayedPaymentMethods = true configuration.primaryButtonColor = UIColor(red: 1.0, green: 0.82, blue: 0.04, alpha: 1.0) configuration.applePay = .init( merchantId: "com.example.appname", merchantCountryCode: "US" ) configuration.shippingDetails = { [weak self] in return self?.addressDetails } let paymentSheet = PaymentSheet( paymentIntentClientSecret: paymentIntentClientSecret, configuration: configuration) paymentSheet.present(from: self) { [weak self] (paymentResult) in switch paymentResult { case .completed: self?.displayAlert(title: "Payment complete!") case .canceled: print("Payment canceled!") case .failed(let error): self?.displayAlert(title: "Payment failed", message: error.localizedDescription) } @objc func didTapShippingAddressButton() { present(UINavigationController(rootViewController: addressViewController!), animated: true) } // MARK: - AddressViewControllerDelegate extension CheckoutViewController: AddressViewControllerDelegate { func addressViewControllerDidFinish(_ addressViewController: AddressViewController, with address: AddressViewController.AddressDetails?) { addressViewController.dismiss(animated: true) self.addressDetails = address } } NSCameraUsageDescription Allow the app to scan cards. PaymentConfiguration.init( applicationContext, "<>" ) import androidx.compose.foundation.layout.Column import androidx.compose.ui.platform.LocalContext import com.stripe.android.PaymentConfiguration import com.stripe.android.paymentsheet.addresselement.AddressDetails import com.stripe.android.paymentsheet.addresselement.AddressLauncher import com.stripe.android.paymentsheet.addresselement.AddressLauncher.AdditionalFieldsConfiguration import com.stripe.android.paymentsheet.addresselement.AddressLauncherResult import com.stripe.android.paymentsheet.addresselement.rememberAddressLauncher private val addressConfiguration = AddressLauncher.Configuration.Builder() .additionalFields( AdditionalFieldsConfiguration( AdditionalFieldsConfiguration.FieldConfiguration.REQUIRED ) ) .allowedCountries(setOf("US", "CA", "GB")) .title("Shipping Address") .googlePlacesApiKey("(optional) YOUR KEY HERE") .build() when (paymentResult) { is PaymentSheetResult.Completed -> showToast("Payment complete!") is PaymentSheetResult.Canceled -> showToast("Payment canceled!") is PaymentSheetResult.Failed -> { error = paymentResult.error.localizedMessage ?: paymentResult.error.message } } val context = LocalContext.current var shippingDetails by remember { mutableStateOf(null) } val addressLauncher = rememberAddressLauncher { result -> when (result) { is AddressLauncherResult.Succeeded -> { shippingDetails = result.address showToast("Address selection complete!") } is AddressLauncherResult.Canceled -> showToast("Address selection canceled!") } } Column( modifier = Modifier.fillMaxWidth() ) { AddressButton { addressLauncher.present( publishableKey = PaymentConfiguration.getInstance(context).publishableKey, configuration = addressConfiguration ) } PayButton( enabled = paymentIntentClientSecret != null, onClick = { paymentIntentClientSecret?.let { onPayClicked( paymentSheet = paymentSheet, paymentIntentClientSecret = it, shippingDetails = shippingDetails, ) } } ) } PayButton( enabled = paymentIntentClientSecret != null, onClick = { paymentIntentClientSecret?.let { onPayClicked( paymentSheet = paymentSheet, paymentIntentClientSecret = it, ) } } ) @Composable private fun AddressButton( onClick: () -> Unit ) { Button( modifier = Modifier.fillMaxWidth(), onClick = onClick ) { Text("Add shipping address") } } private suspend fun fetchPaymentIntent(): Result = suspendCoroutine { continuation -> val url = "$BACKEND_URL/create-payment-intent" val shoppingCartContent = """ { "items": [ {"id":"xl-tshirt"} {"id":"xl-tshirt", "amount":1000} ] } """ val mediaType = "application/json; charset=utf-8".toMediaType() val body = shoppingCartContent.toRequestBody(mediaType) val request = Request.Builder() .url(url) .post(body) .build() OkHttpClient() .newCall(request) .enqueue(object: Callback { override fun onFailure(call: Call, e: IOException) { continuation.resume(Result.failure(e)) } override fun onResponse(call: Call, response: Response) { if (!response.isSuccessful) { continuation.resume(Result.failure(Exception(response.message))) } else { val clientSecret = extractClientSecretFromResponse(response) clientSecret?.let { secret -> continuation.resume(Result.success(secret)) } ?: run { val error = Exception("Could not find payment intent client secret in response!") continuation.resume(Result.failure(error)) } } } }) } private fun extractClientSecretFromResponse(response: Response): String? { return try { val responseData = response.body?.string() val responseJson = responseData?.let { JSONObject(it) } ?: JSONObject() responseJson.getString("clientSecret") } catch (exception: JSONException) { null } } shippingDetails: AddressDetails?, val configuration = PaymentSheet.Configuration.Builder(merchantDisplayName = "Example, Inc.") .shippingDetails(shippingDetails) .allowsDelayedPaymentMethods(true) .appearance( PaymentSheet.Appearance( primaryButton = PaymentSheet.PrimaryButton( colorsLight = PaymentSheet.PrimaryButtonColors( background = Color(red = 248, green = 72, blue = 94), onBackground = Color.White, border = Color.Unspecified ) ) ) ) .googlePay( PaymentSheet.GooglePayConfiguration( environment = PaymentSheet.GooglePayConfiguration.Environment.Test, countryCode = "US" ) ) .build() // Present Payment Sheet paymentSheet.presentWithPaymentIntent(paymentIntentClientSecret, configuration) PaymentConfiguration.init( getApplicationContext(), "<>" ); import com.stripe.android.paymentsheet.addresselement.AddressDetails; import com.stripe.android.paymentsheet.addresselement.AddressLauncher; import com.stripe.android.paymentsheet.addresselement.AddressLauncherResult; private AddressLauncher addressLauncher; private AddressDetails shippingDetails; private Button addressButton; private final AddressLauncher.Configuration configuration = new AddressLauncher.Configuration.Builder() .additionalFields( new AddressLauncher.AdditionalFieldsConfiguration( AddressLauncher.AdditionalFieldsConfiguration.FieldConfiguration.REQUIRED ) ) .allowedCountries(new HashSet<>(Arrays.asList("US", "CA", "GB"))) .title("Shipping Address") .googlePlacesApiKey("(optional) YOUR KEY HERE") .build(); // Hook up the address button addressButton = findViewById(R.id.address_button); addressButton.setOnClickListener(this::onAddressClicked); addressLauncher = new AddressLauncher(this, this::onAddressLauncherResult); private void fetchPaymentIntent() { final String shoppingCartContent = "{\"items\": [ {\"id\":\"xl-tshirt\"}]}"; final String shoppingCartContent = "{\"items\": [ {\"id\":\"xl-tshirt\", \"amount\":1000}]}"; final RequestBody requestBody = RequestBody.create( shoppingCartContent, MediaType.get("application/json; charset=utf-8") ); Request request = new Request.Builder() .url(BACKEND_URL + "/create-payment-intent") .post(requestBody) .build(); new OkHttpClient() .newCall(request) .enqueue(new Callback() { @Override public void onFailure(@NonNull Call call, @NonNull IOException e) { showAlert("Failed to load data", "Error: " + e.toString()); } @Override public void onResponse( @NonNull Call call, @NonNull Response response ) throws IOException { if (!response.isSuccessful()) { showAlert( "Failed to load page", "Error: " + response.toString() ); } else { final JSONObject responseJson = parseResponse(response.body()); paymentIntentClientSecret = responseJson.optString("clientSecret"); runOnUiThread(() -> payButton.setEnabled(true)); Log.i(TAG, "Retrieved PaymentIntent"); } } }); } PaymentSheet.Configuration configuration = new PaymentSheet.Configuration.Builder("Example, Inc.") .allowsDelayedPaymentMethods(true) .primaryButtonColor(ColorStateList.valueOf(Color.rgb(248, 72, 94))) .googlePay(new PaymentSheet.GooglePayConfiguration( PaymentSheet.GooglePayConfiguration.Environment.Test, "US")) .build(); // Present Payment Sheet paymentSheet.presentWithPaymentIntent(paymentIntentClientSecret, configuration); private void onAddressClicked(View view) { AddressLauncher.Configuration addressConfiguration = new AddressLauncher.Configuration.Builder().address(shippingDetails).build(); String publishableKey = PaymentConfiguration.getInstance(this.getApplicationContext()).getPublishableKey(); addressLauncher.present( publishableKey, addressConfiguration ); } if (paymentSheetResult instanceof PaymentSheetResult.Completed) { showToast("Payment complete!"); } else if (paymentSheetResult instanceof PaymentSheetResult.Canceled) { Log.i(TAG, "Payment canceled!"); } else if (paymentSheetResult instanceof PaymentSheetResult.Failed) { Throwable error = ((PaymentSheetResult.Failed) paymentSheetResult).getError(); showAlert("Payment failed", error.getLocalizedMessage()); } private void onAddressLauncherResult(AddressLauncherResult result) { // TODO: Handle result and update your UI if (result instanceof AddressLauncherResult.Succeeded) { shippingDetails = ((AddressLauncherResult.Succeeded) result).getAddress(); } else if (result instanceof AddressLauncherResult.Canceled) { // TODO: Handle cancel } } { "name": "stripe-sample", "version": "1.0.0", "description": "A sample Stripe implementation", "main": "server.js", "scripts": { "start": "node server.js" }, "author": "stripe-samples", "license": "ISC", "dependencies": { "express": "^4.17.1", "stripe": "^21.0.1" } } { "name": "stripe-sample", "version": "0.1.0", "dependencies": { "@stripe/react-stripe-js": "^3.7.0", "@stripe/stripe-js": "^7.3.0", "express": "^4.17.1", "react": "^18.2.0", "react-dom": "^18.2.0", "react-scripts": "^3.4.0", "stripe": "21.0.1" }, "devDependencies": { "concurrently": "4.1.2" }, "homepage": "http://localhost:3000/checkout", "proxy": "http://localhost:4242", "scripts": { "start-client": "react-scripts start", "start-server": "node server.js", "build": "react-scripts build", "test": "react-scripts test", "eject": "react-scripts eject", "start": "concurrently \"yarn start-client\" \"yarn start-server\"" }, "eslintConfig": { "extends": "react-app" }, "browserslist": { "production": [ ">0.2%", "not dead", "not op_mini all" ], "development": [ "last 1 chrome version", "last 1 firefox version", "last 1 safari version" ] } } require github.com/stripe/stripe-go/v85 v85.0.0 certifi==2026.1.4 chardet==5.2.0 click==8.3.1 Flask==3.1.2 idna==3.11 itsdangerous==2.2.0 Jinja2==3.1.6 MarkupSafe==3.0.3 requests==2.32.5 stripe==15.0.0 toml==0.10.2 Werkzeug==3.1.5 { "name": "stripe-sample", "version": "0.2.0", "license": "ISC", "dependencies": { "@stripe/react-stripe-js": "^3.7.0", "@stripe/stripe-js": "^7.3.0", "express": "^4.21.0", "react": "^18.3.1", "react-dom": "^18.3.1", "react-router-dom": "^6.26.2", "react-scripts": "^5.0.1", "stripe": "^16.12.0" }, "devDependencies": { "@babel/plugin-transform-private-property-in-object": "^7.25.7", "concurrently": "^9.0.1" }, "homepage": "http://localhost:3000/checkout", "proxy": "http://localhost:4242", "scripts": { "start-client": "react-scripts start", "start-server": "node server.js", "build": "react-scripts build", "test": "react-scripts test", "eject": "react-scripts eject", "start": "concurrently \"yarn start-client\" \"yarn start-server\"" }, "eslintConfig": { "extends": "react-app" }, "browserslist": { "production": [ ">0.2%", "not dead", "not op_mini all" ], "development": [ "last 1 chrome version", "last 1 firefox version", "last 1 safari version" ] } } { "name": "client", "version": "0.1.0", "private": true, "dependencies": { "@stripe/react-stripe-js": "^3.7.0", "@stripe/stripe-js": "^7.3.0", "react": "^18.2.0", "react-dom": "^18.2.0", "react-router-dom": "^6.26.1", "react-scripts": "^5.0.1" }, "homepage": "http://localhost:3000/checkout", "proxy": "http://localhost:4242", "scripts": { "start": "react-scripts start", "build": "react-scripts build", "test": "react-scripts test", "eject": "react-scripts eject" }, "eslintConfig": { "extends": "react-app" }, "browserslist": { "production": [ ">0.2%", "not dead", "not op_mini all" ], "development": [ "last 1 chrome version", "last 1 firefox version", "last 1 safari version" ] } } 1. Build the server ~~~ pip3 install -r requirements.txt ~~~ 1. Build the server ~~~ bundle install ~~~ 1. Build the server ~~~ composer install ~~~ 1. Build the server ~~~ dotnet restore ~~~ 1. Build the server ~~~ mvn package ~~~ 2. Run the server ~~~ export FLASK_APP=server.py python3 -m flask run --port=4242 ~~~ 2. Run the server ~~~ ruby server.rb -o 0.0.0.0 ~~~ 2. Run the server ~~~ php -S 127.0.0.1:4242 --docroot=public ~~~ 2. Run the server ~~~ dotnet run ~~~ 2. Run the server ~~~ java -cp target/sample-jar-with-dependencies.jar com.stripe.sample.Server ~~~ 3. Build the client app ~~~ npm install ~~~ 4. Run the client app ~~~ npm start ~~~ 5. Go to [http://localhost:3000/checkout](http://localhost:3000/checkout) 3. Go to [http://localhost:4242/checkout.html](http://localhost:4242/checkout.html) 3. Build the client app ~~~ npm install ~~~ 4. Run the client app ~~~ npm start ~~~ 5. Go to [http://localhost:3000/checkout](http://localhost:3000/checkout) 3. Go to [http://localhost:4242/checkout.html](http://localhost:4242/checkout.html) 3. Build the client app ~~~ npm install ~~~ 4. Run the client app ~~~ npm start ~~~ 5. Go to [http://localhost:3000/checkout](http://localhost:3000/checkout) 3. Go to [http://localhost:4242/checkout.html](http://localhost:4242/checkout.html) 3. Build the client app ~~~ npm install ~~~ 4. Run the client app ~~~ npm start ~~~ 5. Go to [http://localhost:3000/checkout](http://localhost:3000/checkout) 3. Go to [http://localhost:4242/checkout.html](http://localhost:4242/checkout.html) 3. Build the client app ~~~ npm install ~~~ 4. Run the client app ~~~ npm start ~~~ 5. Go to [http://localhost:3000/checkout](http://localhost:3000/checkout) 3. Go to [http://localhost:4242/checkout.html](http://localhost:4242/checkout.html) 1. Run the server ~~~ go run server.go ~~~ 2. Build the client app ~~~ npm install ~~~ 3. Run the client app ~~~ npm start ~~~ 4. Go to [http://localhost:3000/checkout](http://localhost:3000/checkout) 1. Run the server ~~~ go run server.go ~~~ 2. Go to [http://localhost:4242/checkout.html](http://localhost:4242/checkout.html) 1. Build the application ~~~ npm install ~~~ 2. Run the application ~~~ npm start ~~~ 3. Go to [http://localhost:3000/checkout](http://localhost:3000/checkout) \## API Keys This code sample uses a public sample test API key. Don’t submit any personally identifiable information in requests made with this key. The "View details" link to see the PaymentIntent details in the Dashboard won't work until you use your own test [API key](https://docs.stripe.com/keys). 1. Build the server ~~~ npm install ~~~ 2. Run the server ~~~ npm start ~~~ 3. Go to [http://localhost:4242/checkout.html](http://localhost:4242/checkout.html) \### Development 1. Build the application ~~~shell $ npm install ~~~ 2. Download and run the [Stripe CLI](https://stripe.com/docs/stripe-cli). The Stripe CLI is a developer tool that helps you build, test, and manage your integration with Stripe directly from the command line. ~~~shell $ stripe listen --forward-to localhost:3000/api/webhooks ~~~ 3. Run the application ~~~shell $ STRIPE_WEBHOOK_SECRET=$(stripe listen --print-secret) npm run dev ~~~ 4. Go to [localhost:3000](http://localhost:3000) ### Production 1. Build the application ~~~shell $ npm install $ npm build ~~~ 2. Run the application ~~~shell $ npm start ~~~ ### Installer la bibliothèque Node de Stripe Installez le package et importez-le dans votre code. Si vous partez de zéro et qu’il vous faut un fichier package.json, vous pouvez également télécharger les fichiers du projet à l’aide du lien de téléchargement dans l’éditeur de code. #### npm Installez la bibliothèque : ```bash npm install --save stripe ``` #### GitHub Vous pouvez sinon télécharger le code source de la bibliothèque Node de Stripe directement [depuis GitHub](https://github.com/stripe/stripe-node). ### Installer la bibliothèque Ruby de Stripe Installez le gem Ruby de Stripe et exigez-le dans votre code. Si vous partez de zéro et avez besoin d’un Gemfile, téléchargez les fichiers du projet à l’aide du lien dans l’éditeur de code. #### Terminal Installez le gem : ```bash gem install stripe ``` #### Bundler Ajoutez cette ligne à votre Gemfile : ```bash gem 'stripe' ``` #### GitHub Vous pouvez sinon télécharger le code source du gem Ruby de Stripe directement [depuis GitHub](https://github.com/stripe/stripe-ruby). ### Installer la bibliothèque Java Ajoutez la dépendance à votre build et importez la bibliothèque. Ou bien, si vous partez de zéro et avez besoin d’un exemple de fichier pom.xml (pour Maven), téléchargez les fichiers du projet à l’aide du lien de téléchargement dans l’éditeur de code. #### Maven Ajoutez la dépendance suivante à votre POM et remplacez {VERSION} par le numéro de version que vous souhaitez utiliser. ```bash \ncom.stripe\nstripe-java\n{VERSION}\n ``` #### Gradle Ajoutez la dépendance à votre fichier build.gradle et remplacez {VERSION} par le numéro de version que vous souhaitez utiliser. ```bash implementation "com.stripe:stripe-java:{VERSION}" ``` #### GitHub Téléchargez le fichier JAR directement [depuis GitHub](https://github.com/stripe/stripe-java/releases/latest). ### Installer le package Python de Stripe Installez le package Stripe et importez-le dans votre code. Si vous partez de zéro et qu’il vous faut un fichier requirements.txt, téléchargez les fichiers du projet à l’aide du lien de téléchargement dans l’éditeur de code. #### pip Installez le package via pip : ```bash pip3 install stripe ``` #### GitHub Téléchargez le code source de la bibliothèque stripe-python directement [depuis GitHub](https://github.com/stripe/stripe-python). ### Installer la bibliothèque PHP Installez la bibliothèque avec composer et initialisez-la avec votre clé API secrète. Si vous partez de zéro et que vous avez besoin d’un fichier composer.json, vous pouvez également télécharger les fichiers à l’aide du lien de téléchargement dans l’éditeur de code. #### Composer Installez la bibliothèque : ```bash composer require stripe/stripe-php ``` #### GitHub Vous pouvez sinon télécharger le code source de la bibliothèque php de Stripe directement [depuis GitHub](https://github.com/stripe/stripe-php). ### Configurer votre serveur Ajoutez la dépendance à votre build et importez la bibliothèque. Si vous partez de zéro et avez besoin d’un fichier go.mod, téléchargez les fichiers du projet à l’aide du lien de téléchargement dans l’éditeur de code. #### Go Veillez à initialiser avec des modules Go : ```bash go get -u github.com/stripe/stripe-go/v85 ``` #### GitHub Vous pouvez sinon télécharger le code source de la bibliothèque Go de Stripe directement [depuis GitHub](https://github.com/stripe/stripe-go). ### Installer la bibliothèque Stripe.net Installez le package avec .NET ou NuGet. Si vous partez de zéro, vous pouvez également télécharger les fichiers qui contiennent un fichier .csproj configuré. #### .NET Installez la bibliothèque : ```bash dotnet add package Stripe.net ``` #### NuGet Installez la bibliothèque : ```bash Install-Package Stripe.net ``` #### GitHub Vous pouvez sinon télécharger le code source de la bibliothèque .NET de Stripe directement [depuis GitHub](https://github.com/stripe/stripe-dotnet). ### Installer les bibliothèques Stripe Installez les packages et importez-les dans votre code. Si vous partez de zéro et qu’il vous faut un fichier `package.json`, vous pouvez également télécharger les fichiers du projet à l’aide du lien de téléchargement dans l’éditeur de code. Installez les bibliothèques : ```bash npm install --save stripe @stripe/stripe-js next ``` ### Créer un PaymentIntent Ajoutez sur votre serveur un endpoint qui crée un [PaymentIntent](https://docs.stripe.com/api/payment_intents.md). Un PaymentIntent suit le cycle de vie du paiement du client, en gardant une trace des tentatives de paiement échouées et en s’assurant que le client n’est facturé qu’une seule fois. Renvoyez 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)) dans la réponse pour finaliser le paiement côté client. ### Configurer des moyens de paiement Par défaut, Stripe active les cartes bancaires et d’autres moyens de paiement courants avec les [moyens de paiement dynamiques](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Vous pouvez modifier et configurer les moyens de paiement à partir du [Dashboard](https://dashboard.stripe.com/settings/payment_methods) sans avoir à rédiger une seule ligne de code. Stripe filtre les moyens de paiement en fonction de leur admissibilité et des préférences de paiement, puis les classe et les affiche par ordre de probabilité en fonction de facteurs tels que le montant, la devise et la localisation de l’acheteur. ### Configurer des moyens de paiement Par défaut, Stripe active les cartes bancaires et d’autres moyens de paiement courants avec les [moyens de paiement dynamiques](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Vous pouvez modifier et configurer les moyens de paiement à partir du [Dashboard](https://dashboard.stripe.com/settings/payment_methods) sans avoir à rédiger une seule ligne de code. Stripe filtre les moyens de paiement en fonction de leur admissibilité et des préférences de paiement, puis les classe et les affiche par ordre de probabilité en fonction de facteurs tels que le montant, la devise et la localisation de l’acheteur. ### Configurer des moyens de paiement Par défaut, Stripe active les cartes bancaires et d’autres moyens de paiement courants avec les [moyens de paiement dynamiques](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Vous pouvez modifier et configurer les moyens de paiement à partir du [Dashboard](https://dashboard.stripe.com/settings/payment_methods) sans avoir à rédiger une seule ligne de code. Stripe filtre les moyens de paiement en fonction de leur admissibilité et des préférences de paiement, puis les classe et les affiche par ordre de probabilité en fonction de facteurs tels que le montant, la devise et la localisation de l’acheteur. ### Configurer des moyens de paiement Par défaut, Stripe active les cartes bancaires et d’autres moyens de paiement courants avec les [moyens de paiement dynamiques](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Vous pouvez modifier et configurer les moyens de paiement à partir du [Dashboard](https://dashboard.stripe.com/settings/payment_methods) sans avoir à rédiger une seule ligne de code. Stripe filtre les moyens de paiement en fonction de leur admissibilité et des préférences de paiement, puis les classe et les affiche par ordre de probabilité en fonction de facteurs tels que le montant, la devise et la localisation de l’acheteur. ### Configurer des moyens de paiement Par défaut, Stripe active les cartes bancaires et d’autres moyens de paiement courants avec les [moyens de paiement dynamiques](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Vous pouvez modifier et configurer les moyens de paiement à partir du [Dashboard](https://dashboard.stripe.com/settings/payment_methods) sans avoir à rédiger une seule ligne de code. Stripe filtre les moyens de paiement en fonction de leur admissibilité et des préférences de paiement, puis les classe et les affiche par ordre de probabilité en fonction de facteurs tels que le montant, la devise et la localisation de l’acheteur. ### Configurer des moyens de paiement Par défaut, Stripe active les cartes bancaires et d’autres moyens de paiement courants avec les [moyens de paiement dynamiques](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Vous pouvez modifier et configurer les moyens de paiement à partir du [Dashboard](https://dashboard.stripe.com/settings/payment_methods) sans avoir à rédiger une seule ligne de code. Stripe filtre les moyens de paiement en fonction de leur admissibilité et des préférences de paiement, puis les classe et les affiche par ordre de probabilité en fonction de facteurs tels que le montant, la devise et la localisation de l’acheteur. ### Configurer des moyens de paiement Par défaut, Stripe active les cartes bancaires et d’autres moyens de paiement courants avec les [moyens de paiement dynamiques](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Vous pouvez modifier et configurer les moyens de paiement à partir du [Dashboard](https://dashboard.stripe.com/settings/payment_methods) sans avoir à rédiger une seule ligne de code. Stripe filtre les moyens de paiement en fonction de leur admissibilité et des préférences de paiement, puis les classe et les affiche par ordre de probabilité en fonction de facteurs tels que le montant, la devise et la localisation de l’acheteur. ### Configurer des moyens de paiement Par défaut, Stripe active les cartes bancaires et d’autres moyens de paiement courants avec les [moyens de paiement dynamiques](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Vous pouvez modifier et configurer les moyens de paiement à partir du [Dashboard](https://dashboard.stripe.com/settings/payment_methods) sans avoir à rédiger une seule ligne de code. Stripe filtre les moyens de paiement en fonction de leur admissibilité et des préférences de paiement, puis les classe et les affiche par ordre de probabilité en fonction de facteurs tels que le montant, la devise et la localisation de l’acheteur. ### Ajouter Stripe à votre application React Utilisez *Stripe.js* (Use Stripe.js’ APIs to tokenize customer information, collect sensitive card data, and accept payments with browser payment APIs) et la [bibliothèque de l’interface utilisateur de Stripe Elements](https://docs.stripe.com/sdks/stripejs-react.md) pour rester *en conformité avec la norme PCI* (Any party involved in processing, transmitting, or storing credit card data must comply with the rules specified in the Payment Card Industry (PCI) Data Security Standards. PCI compliance is a shared responsibility and applies to both Stripe and your business) en veillant à ce que les informations de paiement soient transmises directement à Stripe et ne transitent jamais par votre serveur. ```bash npm install --save @stripe/react-stripe-js @stripe/stripe-js ``` ### Ajouter Stripe à votre application React Utilisez *Stripe.js* (Use Stripe.js’ APIs to tokenize customer information, collect sensitive card data, and accept payments with browser payment APIs) et la [bibliothèque de l’interface utilisateur de Stripe Elements](https://docs.stripe.com/sdks/stripejs-react.md) pour rester *en conformité avec la norme PCI* (Any party involved in processing, transmitting, or storing credit card data must comply with the rules specified in the Payment Card Industry (PCI) Data Security Standards. PCI compliance is a shared responsibility and applies to both Stripe and your business) en veillant à ce que les informations de paiement soient transmises directement à Stripe et ne transitent jamais par votre serveur. ```bash npm install --save @stripe/react-stripe-js @stripe/stripe-js ``` ### Charger Stripe.js Appelez `loadStripe()` avec votre [clé API publiable](https://docs.stripe.com/keys.md#obtain-api-keys) Stripe pour configurer la bibliothèque Stripe. ### Charger Stripe.js Appelez `loadStripe()` avec votre [clé API publiable](https://docs.stripe.com/keys.md#obtain-api-keys) Stripe pour configurer la bibliothèque Stripe. ### Charger Stripe.js Utilisez *Stripe.js* (Use Stripe.js’ APIs to tokenize customer information, collect sensitive card data, and accept payments with browser payment APIs) pour rester en conformité avec la *norme PCI* (Any party involved in processing, transmitting, or storing credit card data must comply with the rules specified in the Payment Card Industry (PCI) Data Security Standards. PCI compliance is a shared responsibility and applies to both Stripe and your business) en veillant à ce que les informations de paiement soient envoyées directement à Stripe sans passer par votre serveur. Chargez toujours Stripe.js directement à partir de js.stripe.com pour maintenir votre conformité. Vous ne devez pas inclure le script dans un lot ni en héberger de copie. ### Définir le formulaire de paiement Dans votre formulaire de paiement, ajoutez un espace réservé vide `div` pour chaque composant Element à intégrer. Stripe insère une balise iframe dans chaque espace `div` afin de collecter l’adresse e-mail et les informations de paiement du client en toute sécurité. ### Initialiser Stripe.js Initialisez Stripe.js avec vos [clés API publiables](https://docs.stripe.com/keys.md#obtain-api-keys). Vous utiliserez Stripe.js pour créer le Payment Element et effectuer le paiement côté client. ### Récupérer un PaymentIntent Faites immédiatement une requête à l’endpoint sur votre serveur pour créer un nouveau PaymentIntent dès que la page de paiement est chargée. La clé `clientSecret` renvoyée par votre endpoint est utilisée pour finaliser le paiement. ### Initialiser Stripe Elements Transmettez la promesse générée par `loadStripe` au fournisseur Elements. Les composants enfants pourront ainsi accéder au service Stripe à l’aide du consommateur Elements. En outre, transmettez au fournisseur Elements la clé secrète du client en tant qu’option. ### Initialiser Stripe Elements Transmettez la promesse générée par `loadStripe` au fournisseur Elements. Les composants enfants pourront ainsi accéder au service Stripe via le consommateur Elements. En outre, transmettez au fournisseur Elements la clé secrète du client en tant qu’option. ### Initialiser Stripe Elements Initialisez la [bibliothèque de l’interface utilisateur de Stripe Elements](https://docs.stripe.com/js/elements_object/create) avec la clé secrète du client. Elements gère les composants d’interface dont vous avez besoin pour collecter les informations de paiement. ### Configurer l’état Initialisez un état pour garder la trace du paiement, afficher les erreurs et gérer l’interface utilisateur. ### Configurer l’état Initialisez un état pour garder la trace du paiement, afficher les erreurs et gérer l’interface utilisateur. ### Sauvegarder une référence à Stripe Accédez à la bibliothèque Stripe dans votre composant CheckoutForm en utilisant les hooks `useStripe()` et `useElements()`. Si vous devez accéder à Elements à l’aide d’un composant de classe, utilisez plutôt [ElementsConsumer](https://docs.stripe.com/sdks/stripejs-react.md#elements-consumer). ### Sauvegarder une référence à Stripe Accédez à la bibliothèque Stripe dans votre composant CheckoutForm en utilisant les hooks `useStripe()` et `useElements()`. Si vous devez accéder à Elements à l’aide d’un composant de classe, utilisez plutôt [ElementsConsumer](https://docs.stripe.com/sdks/stripejs-react.md#elements-consumer). ### Ajouter le PaymentElement Ajoutez [PaymentElement](https://docs.stripe.com/js/elements_object/create_payment_element) à votre formulaire de paiement. Cela permet d’intégrer un iframe avec un formulaire dynamique, qui collecte les informations de paiement pour divers moyens de paiement. Votre client choisit alors son type de moyen de paiement et le formulaire collecte automatiquement les informations de paiement requises correspondantes. ### Ajouter le PaymentElement Ajoutez le [PaymentElement](https://docs.stripe.com/js/elements_object/create_payment_element) à votre formulaire de paiement. Cela permet d’intégrer un iframe avec un formulaire dynamique, qui collecte les informations de paiement pour divers moyens de paiement. Votre client choisit alors son type de moyen de paiement et le formulaire collecte automatiquement les informations de paiement requises correspondantes. ### Créer le PaymentElement Créez un [PaymentElement](https://docs.stripe.com/js/elements_object/create_payment_element) et placez-le dans l’espace réservé `
` de votre formulaire de paiement. Un iframe est alors intégré à un formulaire dynamique qui affiche les types de moyens de paiement disponibles à partir du PaymentIntent, ce qui permet à votre client de sélectionner un moyen de paiement. Le formulaire collecte automatiquement les informations de paiement associées pour le type de moyen de paiement sélectionné. ### (Facultatif) Stylisez le composant Payment Element Personnalisez l’interface utilisateur du composant Element Payment en créant un [objet Appearance](https://docs.stripe.com/elements/appearance-api.md) et en le transmettant comme option au fournisseur Elements. Utilisez la palette de couleurs et la police de votre entreprise pour l’harmoniser avec le reste de votre page de paiement. Utilisez des polices personnalisées (par exemple, Google Fonts) en initialisant Elements avec un [jeu de polices](https://docs.stripe.com/js/elements_object/create#stripe_elements-options-fonts). N’oubliez pas d’ouvrir l’aperçu à droite pour voir vos modifications en temps réel. > Certaines parties de la démonstration bêta pourraient ne pas correspondre à votre page de paiement réelle. Les paramètres ci-dessus ne représentent qu’un sous-ensemble des variables de l’[objet Appearance](https://docs.stripe.com/elements/appearance-api.md), et l’[objet Appearance](https://docs.stripe.com/elements/appearance-api.md) ne contrôle que certains attributs de Stripe Elements. Vous êtes responsable du style du reste de votre page de paiement. ### (Facultatif) Stylisez le composant Payment Element Personnalisez l’interface utilisateur du composant Element Payment en créant un [objet Appearance](https://docs.stripe.com/elements/appearance-api.md) et en le transmettant comme option au fournisseur Elements. Utilisez la palette de couleurs et la police de votre entreprise pour l’harmoniser avec le reste de votre page de paiement. Utilisez des polices personnalisées (par exemple, Google Fonts) en initialisant Elements avec un [jeu de polices](https://docs.stripe.com/js/elements_object/create#stripe_elements-options-fonts). N’oubliez pas d’ouvrir l’aperçu à droite pour voir vos modifications en temps réel. > Certaines parties de la version d’essai de démonstration peuvent ne pas correspondre à votre page de paiement réelle. Les paramètres ci-dessus ne représentent qu’un sous-ensemble des variables de l’objet Appearance, et l’objet Appearance ne contrôle que certains attributs de Stripe Elements. Vous avez la responsabilité de personnaliser le reste de votre page de paiement. ### (Facultatif) Stylisez le composant Payment Element Personnalisez l’interface utilisateur du composant Element Payment en créant un [objet Appearance](https://docs.stripe.com/elements/appearance-api.md) et en initialisant Elements avec celui-ci. Utilisez la palette de couleurs et la police de votre entreprise pour l’harmoniser avec le reste de votre page de paiement. Utilisez des polices personnalisées (par exemple, Google Fonts) en initialisant Elements avec un [jeu de polices](https://docs.stripe.com/js/elements_object/create#stripe_elements-options-fonts). N’oubliez pas d’ouvrir l’aperçu à droite pour voir vos modifications en temps réel. > Certaines parties de la démonstration bêta pourraient ne pas correspondre à votre page de paiement réelle. Les paramètres ci-dessus ne représentent qu’un sous-ensemble des variables de l’[objet Appearance](https://docs.stripe.com/elements/appearance-api.md), et l’[objet Appearance](https://docs.stripe.com/elements/appearance-api.md) ne contrôle que certains attributs de Stripe Elements. Vous êtes responsable du style du reste de votre page de paiement. ### Gérer l’événement de soumission Écoutez l’événement de soumission du formulaire pour savoir quand confirmer le paiement via l’API de Stripe. ### Finaliser le paiement Lorsque votre client clique sur le bouton de paiement, appelez [confirmPayment](https://docs.stripe.com/js/payment_intents/confirm_payment) avec le PaymentElement et passez une [return_url](https://docs.stripe.com/api/payment_intents/create.md#create_payment_intent-return_url) pour indiquer où Stripe redirige le client après qu’il a finalisé le paiement. Pour les paiements qui nécessitent une authentification, Stripe affiche une modale pour l’authentification *3D Secure* (3D Secure (3DS) provides an additional layer of authentication for credit card transactions that protects businesses from liability for fraudulent card payments) ou redirige le client vers une page d’authentification, selon le moyen de paiement. Une fois que le client a terminé le processus d’authentification, il est redirigé vers la `return_url`. ### Finaliser le paiement Lorsque votre client clique sur le bouton de paiement, appelez [confirmPayment](https://docs.stripe.com/js/payment_intents/confirm_payment) avec le PaymentElement et passez une [return_url](https://docs.stripe.com/api/payment_intents/create.md#create_payment_intent-return_url) pour indiquer où Stripe redirige le client après qu’il a finalisé le paiement. Pour les paiements qui nécessitent une authentification, Stripe affiche une modale pour l’authentification *3D Secure* (3D Secure (3DS) provides an additional layer of authentication for credit card transactions that protects businesses from liability for fraudulent card payments) ou redirige le client vers une page d’authentification, selon le moyen de paiement. Une fois que le client a terminé le processus d’authentification, il est redirigé vers la `return_url`. ### Finaliser le paiement Appelez [confirmPayment](https://docs.stripe.com/js/payment_intents/confirm_payment) avec l’instance Element et une [return_url](https://docs.stripe.com/api/payment_intents/create.md#create_payment_intent-return_url) pour indiquer où Stripe redirige le client après qu’il a finalisé le paiement. Pour les paiements qui nécessitent une authentification, Stripe affiche une modale pour l’authentification *3D Secure* (3D Secure (3DS) provides an additional layer of authentication for credit card transactions that protects businesses from liability for fraudulent card payments) ou redirige le client vers une page d’authentification, selon le moyen de paiement. Une fois que le client a terminé le processus d’authentification, il est redirigé vers la `return_url`. ### Gérer les erreurs En cas d’[erreurs](https://docs.stripe.com/error-codes.md) immédiate (par exemple, la carte de votre client est refusée), Stripe.js renvoie une erreur. Affichez-la à l’intention de votre client pour qu’il puisse effectuer une nouvelle tentative de paiement. ### Afficher un message sur l’état du paiement Lorsque Stripe redirige le client vers la `return_url`, le paramètre de requête `payment_intent_client_secret` est ajouté par Stripe.je. Utilisez-le pour récupérer la [mise à jour de l’état du PaymentIntent](https://docs.stripe.com/payments/payment-intents/verifying-status.md) et déterminer les données à afficher à votre client. ### Afficher un message sur l’état du paiement Lorsque Stripe redirige le client vers le `return_url`, le paramètre de requête `payment_intent` est ajouté par Stripe.js. Utilisez-le pour récupérer la [mise à jour de l’état du PaymentIntent](https://docs.stripe.com/payments/payment-intents/verifying-status.md) et déterminer les données à afficher à votre client. ### Utiliser un webhook Stripe envoie plusieurs événements pendant le processus de paiement et après sa finalisation. Créez une [destination d’événements](https://docs.stripe.com/event-destinations.md) pour un [endpoint de webhook](https://docs.stripe.com/webhooks/quickstart.md) afin de recevoir ces événements et exécuter des actions, comme envoyer une confirmation de commande par e-mail à votre client, enregistrer la vente dans une base de données ou lancer un flux de livraison. Stripe vous recommande de gérer les événements [payment_intent.succeeded](https://docs.stripe.com/api/events/types.md?lang=php#event_types-payment_intent.succeeded), [payment_intent.processing](https://docs.stripe.com/api/events/types.md?lang=php#event_types-payment_intent.processing) et [payment_intent.payment_failed](https://docs.stripe.com/api/events/types.md?lang=php#event_types-payment_intent.payment_failed). Nous vous conseillons d’écouter ces événements plutôt que d’attendre un rappel du client. Côté client, il arrive en effet que l’utilisateur ferme la fenêtre de son navigateur ou quitte l’application avant l’exécution du rappel, et des tentatives de manipulation de la réponse par des clients malintentionnés ne sont par ailleurs pas à exclure. En configurant votre intégration de manière à ce qu’elle écoute les événements asynchrones, vous pourrez accepter [plusieurs types de moyens de paiement](https://stripe.com/payments/payment-methods-guide) avec une seule et même intégration. ### Exécuter l’application Exécutez l’application React et le serveur. Accédez à [localhost :3000/checkout](http://localhost:3000/checkout) pour consulter votre page de paiement. ```bash npm start ``` ### Exécuter l’application Exécutez l’application Next.js. Accédez à [localhost:3000](http://localhost:3000) pour consulter votre page de paiement. ```bash npm run dev ``` ### Exécuter l’application Exécutez votre serveur Node et allez à [localhost:4242/checkout.html](http://localhost:4242/checkout.html). ```bash npm start ``` ### Exécuter l’application serveur Exécutez l’application React et le serveur. Accédez à [localhost :3000/checkout](http://localhost:3000/checkout) pour consulter votre page de paiement. ```bash ruby server.rb ``` ### Exécuter l’application Exécutez votre serveur Ruby et allez à [localhost:4242/checkout.html](http://localhost:4242/checkout.html). ```bash ruby server.rb ``` ### Exécuter l’application serveur Exécutez l’application React et le serveur. Accédez à [localhost :3000/checkout](http://localhost:3000/checkout) pour consulter votre page de paiement. ```bash python3 -m flask run --port=4242 ``` ### Exécuter l’application Exécutez votre serveur Python et allez à [localhost:4242/checkout.html](http://localhost:4242/checkout.html). ```bash python3 -m flask run --port=4242 ``` ### Exécuter l’application serveur Exécutez l’application React et le serveur. Accédez à [localhost :3000/checkout](http://localhost:3000/checkout) pour consulter votre page de paiement. ```bash php -S 127.0.0.1:4242 --docroot=public ``` ### Exécuter l’application Exécutez votre serveur et allez à [localhost:4242/checkout.html](http://localhost:4242/checkout.html). ```bash php -S 127.0.0.1:4242 --docroot=public ``` ### Exécuter l’application serveur Exécutez l’application React et le serveur. Accédez à [localhost :3000/checkout](http://localhost:3000/checkout) pour consulter votre page de paiement. ```bash go run server.go ``` ### Exécuter l’application Exécutez votre serveur Go et allez à [localhost:4242/checkout.html](http://localhost:4242/checkout.html). ```bash go run server.go ``` ### Exécuter l’application serveur Exécutez l’application React et le serveur. Accédez à [localhost :3000/checkout](http://localhost:3000/checkout) pour consulter votre page de paiement. ```bash dotnet run ``` ### Exécuter l’application Exécutez votre serveur ASP.NET MVC et allez à [localhost:4242/checkout.html](http://localhost:4242/checkout.html). ```bash dotnet run ``` ### Exécuter l’application Exécutez votre serveur et allez à [localhost:4242/checkout.html](http://localhost:4242/checkout.html). ```bash java -cp target/sample-jar-with-dependencies.jar com.stripe.sample.Server ``` ### Exécuter l’application serveur Exécutez l’application React et le serveur. Accédez à [localhost :3000/checkout](http://localhost:3000/checkout) pour consulter votre page de paiement. ```bash java -cp target/sample-jar-with-dependencies.jar com.stripe.sample.Server ``` ### Exécuter l’application Exécutez l’application React et accédez à [localhost:3000/checkout](http://localhost:3000/checkout). ```bash npm start ``` ### Effectuer un paiement test Pour vérifier que votre intégration fonctionne, effectuez un paiement de test en utilisant les [informations de paiement de test](https://docs.stripe.com/payments/accept-a-payment.md?payment-ui=elements&api-integration=paymentintents#web-test-the-integration). ### Consulter votre paiement dans le Dashboard Accédez au [Dashboard Stripe](https://dashboard.stripe.com/test/payments) pour afficher votre paiement test. ## Accepter les paiements et améliorer votre intégration Vous pouvez maintenant accepter des paiements avec Stripe. Passez à présent aux étapes ci-dessous pour ajouter d’autres fonctionnalités. ### Automatiser l’encaissement des taxes Calculez et percevez le montant de taxes approprié sur les transactions Stripe. Avant d’utiliser Stripe Tax, vous devez l’activer dans le [Dashboard](https://dashboard.stripe.com/tax). En savoir plus sur [Stripe Tax](https://docs.stripe.com/tax.md) et la [manière de l’intégrer à votre intégration Payments](https://docs.stripe.com/tax/custom.md). ### Utiliser l’API Stripe Tax pour calculer les taxes Utilisez l’[API Stripe Tax](https://docs.stripe.com/api/tax/calculations/create.md) pour calculer les taxes sur la transaction. Indiquez les `currency`, `customer_details` et `line_items` de la commande dans le corps de la requête. Utilisez l’attribut `tax_amount_exclusive` du calcul des taxes obtenu pour ajouter les taxes au total de la commande. ### Enregistrer une transaction fiscale en cas de paiement réussi Reliez le calcul de la taxe à PaymentIntent à l’aide des `hooks[inputs][tax][calculation]`. Enregistrer les taxes collectées dans votre compte Stripe. Vous pouvez ensuite les exporter à des fins comptables. D’autres [actions Stripe](https://docs.stripe.com/tax/payment-intent.md#automatic-actions) sont alors déclenchées. ### Envoyer un reçu par e-mail Stripe peut envoyer à votre client un e-mail contenant un reçu aux couleurs de votre marque et portant votre logo. Ces paramètres sont configurables dans le [Dashboard](https://dashboard.stripe.com/settings/branding). ### Recueillir l’adresse e-mail du client Ajoutez un champ de saisie à votre formulaire de paiement pour recueillir l’adresse e-mail. ### Ajouter un e-mail à l’état Ajoutez une variable pour garder la trace de l’e-mail saisi par le client. ### Ajouter un e-mail à l’état Ajoutez une variable pour garder la trace de l’e-mail saisi par le client. ### Fournir l’adresse e-mail à Stripe Transmettez l’adresse e-mail fournie comme valeur `receipt_email`. Stripe envoie un reçu par e-mail lorsque le paiement est effectué en mode production (mais n’en envoie pas dans un *environnement de test* (A sandbox is an isolated test environment that allows you to test Stripe functionality in your account without affecting your live integration. Use sandboxes to safely experiment with new features and changes)). ### Enregistrer les informations de paiement après le paiement Cette option est souvent utilisée par les entreprises SaaS ou e-commerce pour les clients récurrents. ### Importer des ressources Stripe supplémentaires Importez les paquets `customer` et `paymentmethod` de Stripe. Utilisez ces paquets pour sauvegarder des informations concernant votre client. ### Importer des ressources Stripe supplémentaires Importez les modèles Customer et PaymentMethod de Stripe. Utilisez ces modèles pour sauvegarder des informations concernant votre client. ### Créer un client Stripe sauvegarde la carte sur un objet *Customer* (Customer objects represent customers of your business. They let you reuse payment methods and give you the ability to track multiple payments). Créez un nouveau client avant de créer un PaymentIntent. Vous pouvez également sauvegarder le nom, l’adresse e-mail, l’adresse de livraison et d’autres informations concernant le client. ### Créer un client Stripe stocke la carte bancaire sur un l’objet du [Compte](https://docs.stripe.com/api/v2/core/accounts/object.md) représentant le [client](https://docs.stripe.com/connect/account-capabilities.md?accounts-namespace=v2#customer). Créez un nouveau compte avant de créer un PaymentIntent. Vous pouvez également enregistrer sur ce compte le nom, l’e-mail, l’adresse de livraison et d’autres informations du client. ### Ajouter le client au Paymentintent Transmettez l’ID du client au PaymentIntent et définissez `setup_future_usage` sur `off_session`. `setup_future_usage` indique à Stripe comment vous prévoyez d’utiliser le moyen de paiement. Certaines régions, comme l’Europe et l’Inde, ont des conditions à respecter concernant la réutilisation des informations de paiement. [En savoir plus](https://docs.stripe.com/payments/payment-intents.md#future-usage) sur la manière la plus efficace d’appliquer `setup_future_usage`. Vous pouvez également consulter la [liste des moyens de paiement pris en charge](https://docs.stripe.com/payments/payment-methods/payment-method-support.md#additional-api-supportability). Une fois le PaymentIntent réussi, Stripe [rattache](https://docs.stripe.com/api/payment_methods/attach.md) automatiquement les informations de paiement (dans un objet *PaymentMethod* (PaymentMethods represent your customer's payment instruments, used with the Payment Intents or Setup Intents APIs)) à votre client. ### Ajouter le client au Paymentintent Transmettez l’ID du compte au PaymentIntent et définissez `setup_future_utilisation` sur `off_session`. L’option `setup_future_utilisation` indique à Stripe comment vous prévoyez d’utiliser le moyen de paiement. Certaines régions, comme l’Europe et l’Inde, imposent des règles sur la réutilisation des informations de paiement. [En savoir plus](https://docs.stripe.com/payments/payment-intents.md#future-usage) sur la manière la plus efficace d’appliquer l’option `setup_future_utilisation`. Vous pouvez également consulter une [liste des moyens de paiement pris en charge](https://docs.stripe.com/payments/payment-methods/payment-method-support.md#additional-api-supportability). Après la réussite du PaymentIntent, Stripe [associe](https://docs.stripe.com/api/payment_methods/attach.md) automatiquement les informations de paiement (dans un objet *PaymentMethod* (PaymentMethods represent your customer's payment instruments, used with the Payment Intents or Setup Intents APIs)) au Compte configuré par le client. ### Débiter le PaymentMethod enregistré Lorsque vous êtes prêt(e) à débiter à nouveau le PaymentMethod, créez un nouveau PaymentIntent avec l’identifiant du client et celui du PaymentMethod que vous souhaitez débiter, puis définissez les indicateurs `off_session` et `confirm` sur true. ### Installer la bibliothèque Node de Stripe Installez le package et importez-le dans votre code. Si vous partez de zéro et qu’il vous faut un fichier package.json, vous pouvez également télécharger les fichiers du projet à l’aide du lien de téléchargement dans l’éditeur de code. #### npm Installez la bibliothèque : ```bash npm install --save stripe ``` #### GitHub Vous pouvez sinon télécharger le code source de la bibliothèque Node de Stripe directement [depuis GitHub](https://github.com/stripe/stripe-node). ### Installer la bibliothèque Ruby de Stripe Installez le gem Ruby de Stripe et exigez-le dans votre code. Si vous partez de zéro et avez besoin d’un Gemfile, téléchargez les fichiers du projet à l’aide du lien dans l’éditeur de code. #### Terminal Installez le gem : ```bash gem install stripe ``` #### Bundler Ajoutez cette ligne à votre Gemfile : ```bash gem 'stripe' ``` #### GitHub Vous pouvez sinon télécharger le code source du gem Ruby de Stripe directement [depuis GitHub](https://github.com/stripe/stripe-ruby). ### Installer la bibliothèque Java Ajoutez la dépendance à votre build et importez la bibliothèque. Ou bien, si vous partez de zéro et avez besoin d’un exemple de fichier pom.xml (pour Maven), téléchargez les fichiers du projet à l’aide du lien de téléchargement dans l’éditeur de code. #### Maven Ajoutez la dépendance suivante à votre POM et remplacez {VERSION} par le numéro de version que vous souhaitez utiliser. ```bash \ncom.stripe\nstripe-java\n{VERSION}\n ``` #### Gradle Ajoutez la dépendance à votre fichier build.gradle et remplacez {VERSION} par le numéro de version que vous souhaitez utiliser. ```bash implementation "com.stripe:stripe-java:{VERSION}" ``` #### GitHub Téléchargez le fichier JAR directement [depuis GitHub](https://github.com/stripe/stripe-java/releases/latest). ### Installer le package Python de Stripe Installez le package Stripe et importez-le dans votre code. Si vous partez de zéro et qu’il vous faut un fichier requirements.txt, téléchargez les fichiers du projet à l’aide du lien de téléchargement dans l’éditeur de code. #### pip Installez le package via pip : ```bash pip3 install stripe ``` #### GitHub Téléchargez le code source de la bibliothèque stripe-python directement [depuis GitHub](https://github.com/stripe/stripe-python). ### Installer la bibliothèque PHP Installez la bibliothèque avec composer et initialisez-la avec votre clé API secrète. Si vous partez de zéro et que vous avez besoin d’un fichier composer.json, vous pouvez également télécharger les fichiers à l’aide du lien de téléchargement dans l’éditeur de code. #### Composer Installez la bibliothèque : ```bash composer require stripe/stripe-php ``` #### GitHub Vous pouvez sinon télécharger le code source de la bibliothèque php de Stripe directement [depuis GitHub](https://github.com/stripe/stripe-php). ### Configurer votre serveur Ajoutez la dépendance à votre build et importez la bibliothèque. Si vous partez de zéro et avez besoin d’un fichier go.mod, téléchargez les fichiers du projet à l’aide du lien de téléchargement dans l’éditeur de code. #### Go Veillez à initialiser avec des modules Go : ```bash go get -u github.com/stripe/stripe-go/v85 ``` #### GitHub Vous pouvez sinon télécharger le code source de la bibliothèque Go de Stripe directement [depuis GitHub](https://github.com/stripe/stripe-go). ### Installer la bibliothèque Stripe.net Installez le package avec .NET ou NuGet. Si vous partez de zéro, vous pouvez également télécharger les fichiers qui contiennent un fichier .csproj configuré. #### .NET Installez la bibliothèque : ```bash dotnet add package Stripe.net ``` #### NuGet Installez la bibliothèque : ```bash Install-Package Stripe.net ``` #### GitHub Vous pouvez sinon télécharger le code source de la bibliothèque .NET de Stripe directement [depuis GitHub](https://github.com/stripe/stripe-dotnet). ### Installer les bibliothèques Stripe Installez les packages et importez-les dans votre code. Si vous partez de zéro et qu’il vous faut un fichier `package.json`, vous pouvez également télécharger les fichiers du projet à l’aide du lien de téléchargement dans l’éditeur de code. Installez les bibliothèques : ```bash npm install --save stripe @stripe/stripe-js next ``` ### Créer un PaymentIntent Ajoutez sur votre serveur un endpoint qui crée un [PaymentIntent](https://docs.stripe.com/api/payment_intents.md). Un PaymentIntent suit le cycle de vie du paiement du client, en gardant une trace des tentatives de paiement échouées et en s’assurant que le client n’est facturé qu’une seule fois. Renvoyez 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)) dans la réponse pour finaliser le paiement côté client. ### Configurer des moyens de paiement Par défaut, Stripe active les cartes bancaires et d’autres moyens de paiement courants avec les [moyens de paiement dynamiques](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Vous pouvez modifier et configurer les moyens de paiement à partir du [Dashboard](https://dashboard.stripe.com/settings/payment_methods) sans avoir à rédiger une seule ligne de code. Stripe filtre les moyens de paiement en fonction de leur admissibilité et des préférences de paiement, puis les classe et les affiche par ordre de probabilité en fonction de facteurs tels que le montant, la devise et la localisation de l’acheteur. ### Configurer des moyens de paiement Par défaut, Stripe active les cartes bancaires et d’autres moyens de paiement courants avec les [moyens de paiement dynamiques](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Vous pouvez modifier et configurer les moyens de paiement à partir du [Dashboard](https://dashboard.stripe.com/settings/payment_methods) sans avoir à rédiger une seule ligne de code. Stripe filtre les moyens de paiement en fonction de leur admissibilité et des préférences de paiement, puis les classe et les affiche par ordre de probabilité en fonction de facteurs tels que le montant, la devise et la localisation de l’acheteur. ### Configurer des moyens de paiement Par défaut, Stripe active les cartes bancaires et d’autres moyens de paiement courants avec les [moyens de paiement dynamiques](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Vous pouvez modifier et configurer les moyens de paiement à partir du [Dashboard](https://dashboard.stripe.com/settings/payment_methods) sans avoir à rédiger une seule ligne de code. Stripe filtre les moyens de paiement en fonction de leur admissibilité et des préférences de paiement, puis les classe et les affiche par ordre de probabilité en fonction de facteurs tels que le montant, la devise et la localisation de l’acheteur. ### Configurer des moyens de paiement Par défaut, Stripe active les cartes bancaires et d’autres moyens de paiement courants avec les [moyens de paiement dynamiques](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Vous pouvez modifier et configurer les moyens de paiement à partir du [Dashboard](https://dashboard.stripe.com/settings/payment_methods) sans avoir à rédiger une seule ligne de code. Stripe filtre les moyens de paiement en fonction de leur admissibilité et des préférences de paiement, puis les classe et les affiche par ordre de probabilité en fonction de facteurs tels que le montant, la devise et la localisation de l’acheteur. ### Configurer des moyens de paiement Par défaut, Stripe active les cartes bancaires et d’autres moyens de paiement courants avec les [moyens de paiement dynamiques](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Vous pouvez modifier et configurer les moyens de paiement à partir du [Dashboard](https://dashboard.stripe.com/settings/payment_methods) sans avoir à rédiger une seule ligne de code. Stripe filtre les moyens de paiement en fonction de leur admissibilité et des préférences de paiement, puis les classe et les affiche par ordre de probabilité en fonction de facteurs tels que le montant, la devise et la localisation de l’acheteur. ### Configurer des moyens de paiement Par défaut, Stripe active les cartes bancaires et d’autres moyens de paiement courants avec les [moyens de paiement dynamiques](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Vous pouvez modifier et configurer les moyens de paiement à partir du [Dashboard](https://dashboard.stripe.com/settings/payment_methods) sans avoir à rédiger une seule ligne de code. Stripe filtre les moyens de paiement en fonction de leur admissibilité et des préférences de paiement, puis les classe et les affiche par ordre de probabilité en fonction de facteurs tels que le montant, la devise et la localisation de l’acheteur. ### Configurer des moyens de paiement Par défaut, Stripe active les cartes bancaires et d’autres moyens de paiement courants avec les [moyens de paiement dynamiques](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Vous pouvez modifier et configurer les moyens de paiement à partir du [Dashboard](https://dashboard.stripe.com/settings/payment_methods) sans avoir à rédiger une seule ligne de code. Stripe filtre les moyens de paiement en fonction de leur admissibilité et des préférences de paiement, puis les classe et les affiche par ordre de probabilité en fonction de facteurs tels que le montant, la devise et la localisation de l’acheteur. ### Configurer des moyens de paiement Par défaut, Stripe active les cartes bancaires et d’autres moyens de paiement courants avec les [moyens de paiement dynamiques](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Vous pouvez modifier et configurer les moyens de paiement à partir du [Dashboard](https://dashboard.stripe.com/settings/payment_methods) sans avoir à rédiger une seule ligne de code. Stripe filtre les moyens de paiement en fonction de leur admissibilité et des préférences de paiement, puis les classe et les affiche par ordre de probabilité en fonction de facteurs tels que le montant, la devise et la localisation de l’acheteur. ### Installer le SDK Le SDK iOS de Stripe est [open source](https://github.com/stripe/stripe-ios) et [possède une documentation complète](https://stripe.dev/stripe-ios/). Il est compatible avec les applications prenant en charge iOS 13 ou une version ultérieure. Importez le SDK Stripe dans le contrôleur d’affichage de votre écran de paiement. #### Swift Package Manager Dans Xcode, sélectionnez **File** > **Add Package Dependencies…** puis saisissez `https://github.com/stripe/stripe-ios-spm` en tant qu’URL du référentiel. Sélectionnez le dernier numéro de version sur notre [page des versions](https://github.com/stripe/stripe-ios/releases), puis ajoutez le module `StripePaymentSheet` à la cible de votre application. #### CocoaPods Ajoutez cette ligne à votre Podfile, et à partir de maintenant, utilisez le fichier .xcworkspace pour ouvrir votre projet dans Xcode, au lieu du fichier .xcodeproj. ```bash pod 'StripePaymentSheet' ``` #### Carthage Ajouter cette ligne à votre Cartfile. ```bash github "stripe/stripe-ios" ``` #### Cadre manuel Pour inclure Stripe dans votre projet, téléchargez et décompressez Stripe.xcframework.zip depuis une [version sur GitHub](https://github.com/stripe/stripe-ios/releases). Faites glisser les fichiers xcframework nécessaires dans les paramètres « Binaires embarqués » de votre projet Xcode. Veillez à sélectionner « Copier les éléments si nécessaire ». ### Configurer le SDK Configurez le SDK Stripe avec votre [clé API publiable](https://docs.stripe.com/keys.md#obtain-api-keys) Stripe. Le codage en dur de la clé API publiable dans le SDK n’est utilisé qu’à des fins de démonstration. Dans une application de production, vous devez récupérer la clé API depuis votre serveur. ### Récupérer un PaymentIntent Envoyez une requête à votre serveur pour un PaymentIntent dès que la vue est chargée. Conservez 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 PaymentIntent renvoyée par le serveur ; le formulaire de paiement utilise cette clé secrète pour finaliser le paiement par la suite. ### Configurer et présenter le formulaire de paiement Créez une instance `PaymentSheet` à l’aide de la clé secrète récupérée précédemment, puis présentez-la depuis votre contrôleur d’affichage. Utilisez la structure `PaymentSheet.Configuration` pour [personnaliser](https://stripe.dev/stripe-ios/stripe-paymentsheet/Classes/PaymentSheet/Configuration.html) le Payment Sheet. ### Gérer le résultat du paiement Utilisez le bloc d’exécution pour gérer le résultat du paiement. Si le paiement échoue avec une [erreur](https://docs.stripe.com/error-codes.md), montrez le message correspondant à votre client pour qu’il puisse intervenir et essayer à nouveau. Si aucune erreur ne s’est produite, dites à votre client que le paiement a abouti. ### Effectuer un paiement test #### iOS Pour vérifier que votre intégration fonctionne, effectuez un paiement de test en utilisant les [informations de paiement de test](https://docs.stripe.com/payments/accept-a-payment.md?payment-ui=mobile&platform=ios#ios-test-the-integration). #### Android Pour vérifier que votre intégration fonctionne, effectuez un paiement de test en utilisant les [informations de paiement de test](https://docs.stripe.com/payments/accept-a-payment.md?payment-ui=mobile&platform=android#android-test-the-integration). ### Consulter votre paiement dans le Dashboard Accédez au [Dashboard Stripe](https://dashboard.stripe.com/test/payments) pour consulter votre paiement test. ## Accepter les paiements et améliorer votre intégration Vous pouvez maintenant accepter des paiements avec Stripe. Passez à présent aux étapes ci-dessous pour ajouter d’autres fonctionnalités. ### Automatiser l’encaissement des taxes Calculez et percevez le montant de taxes approprié sur les transactions Stripe. Avant d’utiliser Stripe Tax, vous devez l’activer dans le [Dashboard](https://dashboard.stripe.com/tax). En savoir plus sur [Stripe Tax](https://docs.stripe.com/tax.md) et la [manière de l’intégrer à votre intégration Payments](https://docs.stripe.com/tax/custom.md). ### Utiliser l’API Stripe Tax pour calculer les taxes Utilisez l’[API Stripe Tax](https://docs.stripe.com/api/tax/calculations/create.md) pour calculer les taxes sur la transaction. Indiquez les `currency`, `customer_details` et `line_items` de la commande dans le corps de la requête. Utilisez l’attribut `tax_amount_exclusive` du calcul des taxes obtenu pour ajouter les taxes au total de la commande. ### Enregistrer une transaction fiscale en cas de paiement réussi Reliez le calcul de la taxe à PaymentIntent à l’aide des `hooks[inputs][tax][calculation]`. Enregistrer les taxes collectées dans votre compte Stripe. Vous pouvez ensuite les exporter à des fins comptables. D’autres [actions Stripe](https://docs.stripe.com/tax/payment-intent.md#automatic-actions) sont alors déclenchées. ### Autoriser les moyens de paiement à notification différée Avec certains moyens de paiement, il est impossible de garantir que vous recevrez les fonds envoyés par votre client à l’issue du processus de paiement, car ils exigent un certain délai pour virer les fonds (c’est le cas de la plupart des prélèvements bancaires, comme SEPA ou ACH) ou une action de la part du client pour finaliser l’opération (par exemple, OXXO, Konbini et Boleto). Utilisez cet indicateur pour activer les moyens de paiement à notification différée. Si vous utilisez cette fonctionnalités, assurez-vous que votre intégration serveur écoute les [webhooks](https://docs.stripe.com/payments/payment-methods.md#payment-notification) pour recevoir les notifications indiquant si le paiement a abouti ou non. ### Activer la prise en charge d’Apple Pay Pour activer Apple Pay, fournissez votre [ID de marchand Apple Pay](https://support.stripe.com/questions/enable-apple-pay-on-your-stripe-account) et le [code pays](https://dashboard.stripe.com/settings/account) de votre compte Stripe. ### Ajout de la prise en charge de Google Pay Pour utiliser Google Pay, commencez par activer l’API Google Pay dans votre AndroidManifest.xml. Activez Google Pay en transmettant un objet [PaymentSheet.GooglePayConfiguration](https://stripe.dev/stripe-android/paymentsheet/com.stripe.android.paymentsheet/-payment-sheet/-google-pay-configuration/index.html) avec l’environnement Google Pay (en mode production ou en mode test), ainsi que le [code pays de votre entreprise](https://dashboard.stripe.com/settings/account) lors de l’initialisation de [PaymentSheet.Configuration](https://stripe.dev/stripe-android/paymentsheet/com.stripe.android.paymentsheet/-payment-sheet/-configuration/index.html). ### Personnaliser la couleur du bouton principal Pour le bouton principal, pensez à utiliser une couleur personnalisée plus adaptée à votre marque ou à l’identité visuelle de l’application. ### Activer la numérisation de carte La numérisation de carte peut favoriser l’augmentation de votre taux de conversion, puisque cette fonctionnalité élimine le besoin de saisir manuellement les informations de la carte. Pour intégrer la numérisation de carte, activez le paramètre `NSCameraUsageDescription` dans le fichier `Info.plist` de votre application et indiquez la raison pour laquelle vous devez accéder à l’appareil photo (« Pour numériser des cartes » par exemple). > La numérisation de carte est prise en charge uniquement sur les appareils exécutant iOS 13 ou une version supérieure. ### Activer la numérisation de carte La numérisation de carte peut vous aider à augmenter votre taux de conversion en éliminant la nécessité pour le client de saisir manuellement ses données de carte. Pour activer la numérisation de carte, ajoutez `stripecardscan` au bloc `dependencies` de votre fichier [app/build.gradle](https://developer.android.com/studio/build/dependencies) : #### Groovy ```groovy implementation 'com.stripe:stripecardscan:23.2.0' ``` ### Enregistrer les informations de paiement après le paiement Cette option est souvent utilisée par les entreprises SaaS ou e-commerce pour les clients récurrents. ### Importer des ressources Stripe supplémentaires Importez les paquets `customer` et `paymentmethod` de Stripe. Utilisez ces paquets pour sauvegarder des informations concernant votre client. ### Importer des ressources Stripe supplémentaires Importez les modèles Customer et PaymentMethod de Stripe. Utilisez ces modèles pour sauvegarder des informations concernant votre client. ### Créer un client Stripe sauvegarde la carte sur un objet *Customer* (Customer objects represent customers of your business. They let you reuse payment methods and give you the ability to track multiple payments). Créez un nouveau client avant de créer un PaymentIntent. Vous pouvez également sauvegarder le nom, l’adresse e-mail, l’adresse de livraison et d’autres informations concernant le client. ### Créer un client Stripe stocke la carte bancaire sur un l’objet du [Compte](https://docs.stripe.com/api/v2/core/accounts/object.md) représentant le [client](https://docs.stripe.com/connect/account-capabilities.md?accounts-namespace=v2#customer). Créez un nouveau compte avant de créer un PaymentIntent. Vous pouvez également enregistrer sur ce compte le nom, l’e-mail, l’adresse de livraison et d’autres informations du client. ### Ajouter le client au Paymentintent Transmettez l’ID du client au PaymentIntent et définissez `setup_future_usage` sur `off_session`. `setup_future_usage` indique à Stripe comment vous prévoyez d’utiliser le moyen de paiement. Certaines régions, comme l’Europe et l’Inde, ont des conditions à respecter concernant la réutilisation des informations de paiement. [En savoir plus](https://docs.stripe.com/payments/payment-intents.md#future-usage) sur la manière la plus efficace d’appliquer `setup_future_usage`. Vous pouvez également consulter la [liste des moyens de paiement pris en charge](https://docs.stripe.com/payments/payment-methods/payment-method-support.md#additional-api-supportability). Une fois le PaymentIntent réussi, Stripe [rattache](https://docs.stripe.com/api/payment_methods/attach.md) automatiquement les informations de paiement (dans un objet *PaymentMethod* (PaymentMethods represent your customer's payment instruments, used with the Payment Intents or Setup Intents APIs)) à votre client. ### Ajouter le client au Paymentintent Transmettez l’ID du compte au PaymentIntent et définissez `setup_future_utilisation` sur `off_session`. L’option `setup_future_utilisation` indique à Stripe comment vous prévoyez d’utiliser le moyen de paiement. Certaines régions, comme l’Europe et l’Inde, imposent des règles sur la réutilisation des informations de paiement. [En savoir plus](https://docs.stripe.com/payments/payment-intents.md#future-usage) sur la manière la plus efficace d’appliquer l’option `setup_future_utilisation`. Vous pouvez également consulter une [liste des moyens de paiement pris en charge](https://docs.stripe.com/payments/payment-methods/payment-method-support.md#additional-api-supportability). Après la réussite du PaymentIntent, Stripe [associe](https://docs.stripe.com/api/payment_methods/attach.md) automatiquement les informations de paiement (dans un objet *PaymentMethod* (PaymentMethods represent your customer's payment instruments, used with the Payment Intents or Setup Intents APIs)) au Compte configuré par le client. ### Débiter le PaymentMethod enregistré Lorsque vous êtes prêt(e) à débiter à nouveau le PaymentMethod, créez un nouveau PaymentIntent avec l’identifiant du client et celui du PaymentMethod que vous souhaitez débiter, puis définissez les indicateurs `off_session` et `confirm` sur true. ### Collecter des adresses avec le composant Address Element Recueillir les adresses de livraison et de facturation de vos clients locaux ou internationaux. ### Collecter des adresses avec le composant Address Element Recueillir les adresses de livraison et de facturation de vos clients locaux ou internationaux. Si vous utilisez le composant Address Element, vous avez la possibilité de recourir au [SDK Google Places](https://developers.google.com/maps/documentation/places/android-sdk/overview) pour récupérer des suggestions de remplissage automatique des adresses. Pour activer les suggestions, ajoutez `places` au bloc de dépendances de votre fichier [app/build.gradle](https://developer.android.com/studio/build/dependencies) : #### Groovy ```groovy implementation 'com.google.android.libraries.places:places:2.6.0' ``` ### Installer la bibliothèque Node de Stripe Installez le package et importez-le dans votre code. Si vous partez de zéro et qu’il vous faut un fichier package.json, vous pouvez également télécharger les fichiers du projet à l’aide du lien de téléchargement dans l’éditeur de code. #### npm Installez la bibliothèque : ```bash npm install --save stripe ``` #### GitHub Vous pouvez sinon télécharger le code source de la bibliothèque Node de Stripe directement [depuis GitHub](https://github.com/stripe/stripe-node). ### Installer la bibliothèque Ruby de Stripe Installez le gem Ruby de Stripe et exigez-le dans votre code. Si vous partez de zéro et avez besoin d’un Gemfile, téléchargez les fichiers du projet à l’aide du lien dans l’éditeur de code. #### Terminal Installez le gem : ```bash gem install stripe ``` #### Bundler Ajoutez cette ligne à votre Gemfile : ```bash gem 'stripe' ``` #### GitHub Vous pouvez sinon télécharger le code source du gem Ruby de Stripe directement [depuis GitHub](https://github.com/stripe/stripe-ruby). ### Installer la bibliothèque Java Ajoutez la dépendance à votre build et importez la bibliothèque. Ou bien, si vous partez de zéro et avez besoin d’un exemple de fichier pom.xml (pour Maven), téléchargez les fichiers du projet à l’aide du lien de téléchargement dans l’éditeur de code. #### Maven Ajoutez la dépendance suivante à votre POM et remplacez {VERSION} par le numéro de version que vous souhaitez utiliser. ```bash \ncom.stripe\nstripe-java\n{VERSION}\n ``` #### Gradle Ajoutez la dépendance à votre fichier build.gradle et remplacez {VERSION} par le numéro de version que vous souhaitez utiliser. ```bash implementation "com.stripe:stripe-java:{VERSION}" ``` #### GitHub Téléchargez le fichier JAR directement [depuis GitHub](https://github.com/stripe/stripe-java/releases/latest). ### Installer le package Python de Stripe Installez le package Stripe et importez-le dans votre code. Si vous partez de zéro et qu’il vous faut un fichier requirements.txt, téléchargez les fichiers du projet à l’aide du lien de téléchargement dans l’éditeur de code. #### pip Installez le package via pip : ```bash pip3 install stripe ``` #### GitHub Téléchargez le code source de la bibliothèque stripe-python directement [depuis GitHub](https://github.com/stripe/stripe-python). ### Installer la bibliothèque PHP Installez la bibliothèque avec composer et initialisez-la avec votre clé API secrète. Si vous partez de zéro et que vous avez besoin d’un fichier composer.json, vous pouvez également télécharger les fichiers à l’aide du lien de téléchargement dans l’éditeur de code. #### Composer Installez la bibliothèque : ```bash composer require stripe/stripe-php ``` #### GitHub Vous pouvez sinon télécharger le code source de la bibliothèque php de Stripe directement [depuis GitHub](https://github.com/stripe/stripe-php). ### Configurer votre serveur Ajoutez la dépendance à votre build et importez la bibliothèque. Si vous partez de zéro et avez besoin d’un fichier go.mod, téléchargez les fichiers du projet à l’aide du lien de téléchargement dans l’éditeur de code. #### Go Veillez à initialiser avec des modules Go : ```bash go get -u github.com/stripe/stripe-go/v85 ``` #### GitHub Vous pouvez sinon télécharger le code source de la bibliothèque Go de Stripe directement [depuis GitHub](https://github.com/stripe/stripe-go). ### Installer la bibliothèque Stripe.net Installez le package avec .NET ou NuGet. Si vous partez de zéro, vous pouvez également télécharger les fichiers qui contiennent un fichier .csproj configuré. #### .NET Installez la bibliothèque : ```bash dotnet add package Stripe.net ``` #### NuGet Installez la bibliothèque : ```bash Install-Package Stripe.net ``` #### GitHub Vous pouvez sinon télécharger le code source de la bibliothèque .NET de Stripe directement [depuis GitHub](https://github.com/stripe/stripe-dotnet). ### Installer les bibliothèques Stripe Installez les packages et importez-les dans votre code. Si vous partez de zéro et qu’il vous faut un fichier `package.json`, vous pouvez également télécharger les fichiers du projet à l’aide du lien de téléchargement dans l’éditeur de code. Installez les bibliothèques : ```bash npm install --save stripe @stripe/stripe-js next ``` ### Créer un PaymentIntent Ajoutez sur votre serveur un endpoint qui crée un [PaymentIntent](https://docs.stripe.com/api/payment_intents.md). Un PaymentIntent suit le cycle de vie du paiement du client, en gardant une trace des tentatives de paiement échouées et en s’assurant que le client n’est facturé qu’une seule fois. Renvoyez 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)) dans la réponse pour finaliser le paiement côté client. ### Configurer des moyens de paiement Par défaut, Stripe active les cartes bancaires et d’autres moyens de paiement courants avec les [moyens de paiement dynamiques](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Vous pouvez modifier et configurer les moyens de paiement à partir du [Dashboard](https://dashboard.stripe.com/settings/payment_methods) sans avoir à rédiger une seule ligne de code. Stripe filtre les moyens de paiement en fonction de leur admissibilité et des préférences de paiement, puis les classe et les affiche par ordre de probabilité en fonction de facteurs tels que le montant, la devise et la localisation de l’acheteur. ### Configurer des moyens de paiement Par défaut, Stripe active les cartes bancaires et d’autres moyens de paiement courants avec les [moyens de paiement dynamiques](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Vous pouvez modifier et configurer les moyens de paiement à partir du [Dashboard](https://dashboard.stripe.com/settings/payment_methods) sans avoir à rédiger une seule ligne de code. Stripe filtre les moyens de paiement en fonction de leur admissibilité et des préférences de paiement, puis les classe et les affiche par ordre de probabilité en fonction de facteurs tels que le montant, la devise et la localisation de l’acheteur. ### Configurer des moyens de paiement Par défaut, Stripe active les cartes bancaires et d’autres moyens de paiement courants avec les [moyens de paiement dynamiques](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Vous pouvez modifier et configurer les moyens de paiement à partir du [Dashboard](https://dashboard.stripe.com/settings/payment_methods) sans avoir à rédiger une seule ligne de code. Stripe filtre les moyens de paiement en fonction de leur admissibilité et des préférences de paiement, puis les classe et les affiche par ordre de probabilité en fonction de facteurs tels que le montant, la devise et la localisation de l’acheteur. ### Configurer des moyens de paiement Par défaut, Stripe active les cartes bancaires et d’autres moyens de paiement courants avec les [moyens de paiement dynamiques](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Vous pouvez modifier et configurer les moyens de paiement à partir du [Dashboard](https://dashboard.stripe.com/settings/payment_methods) sans avoir à rédiger une seule ligne de code. Stripe filtre les moyens de paiement en fonction de leur admissibilité et des préférences de paiement, puis les classe et les affiche par ordre de probabilité en fonction de facteurs tels que le montant, la devise et la localisation de l’acheteur. ### Configurer des moyens de paiement Par défaut, Stripe active les cartes bancaires et d’autres moyens de paiement courants avec les [moyens de paiement dynamiques](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Vous pouvez modifier et configurer les moyens de paiement à partir du [Dashboard](https://dashboard.stripe.com/settings/payment_methods) sans avoir à rédiger une seule ligne de code. Stripe filtre les moyens de paiement en fonction de leur admissibilité et des préférences de paiement, puis les classe et les affiche par ordre de probabilité en fonction de facteurs tels que le montant, la devise et la localisation de l’acheteur. ### Configurer des moyens de paiement Par défaut, Stripe active les cartes bancaires et d’autres moyens de paiement courants avec les [moyens de paiement dynamiques](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Vous pouvez modifier et configurer les moyens de paiement à partir du [Dashboard](https://dashboard.stripe.com/settings/payment_methods) sans avoir à rédiger une seule ligne de code. Stripe filtre les moyens de paiement en fonction de leur admissibilité et des préférences de paiement, puis les classe et les affiche par ordre de probabilité en fonction de facteurs tels que le montant, la devise et la localisation de l’acheteur. ### Configurer des moyens de paiement Par défaut, Stripe active les cartes bancaires et d’autres moyens de paiement courants avec les [moyens de paiement dynamiques](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Vous pouvez modifier et configurer les moyens de paiement à partir du [Dashboard](https://dashboard.stripe.com/settings/payment_methods) sans avoir à rédiger une seule ligne de code. Stripe filtre les moyens de paiement en fonction de leur admissibilité et des préférences de paiement, puis les classe et les affiche par ordre de probabilité en fonction de facteurs tels que le montant, la devise et la localisation de l’acheteur. ### Configurer des moyens de paiement Par défaut, Stripe active les cartes bancaires et d’autres moyens de paiement courants avec les [moyens de paiement dynamiques](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Vous pouvez modifier et configurer les moyens de paiement à partir du [Dashboard](https://dashboard.stripe.com/settings/payment_methods) sans avoir à rédiger une seule ligne de code. Stripe filtre les moyens de paiement en fonction de leur admissibilité et des préférences de paiement, puis les classe et les affiche par ordre de probabilité en fonction de facteurs tels que le montant, la devise et la localisation de l’acheteur. ### Installer le SDK Le SDK Android de Stripe est [open source](https://github.com/stripe/stripe-android) et [possède une documentation complète](https://stripe.dev/stripe-android/). Il est compatible avec les appareils fonctionnant sous Android 5.0 (API de niveau 21) et les versions supérieures. Pour installer le SDK, ajoutez `stripe-android` au bloc des dépendances de votre fichier `build.gradle` : #### Groovy ```groovy implementation 'com.stripe:stripe-android:23.2.0' ``` > Pour plus de détails sur la version la plus récente du SDK et ses versions antérieures, consultez la [page des versions](https://github.com/stripe/stripe-android/releases) sur GitHub. ### Configurer le SDK Configurez le SDK Stripe avec votre [clé API publiable](https://docs.stripe.com/keys.md#obtain-api-keys) Stripe. Le codage en dur de la clé API publiable dans le SDK n’est utilisé qu’à des fins de démonstration. Dans une application de production, vous devez récupérer la clé API depuis votre serveur. ### Récupérer un PaymentIntent Envoyez une requête à votre serveur pour un PaymentIntent dès que la vue est chargée. Conservez 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 PaymentIntent renvoyée par le serveur ; le formulaire de paiement utilise cette clé secrète pour finaliser le paiement par la suite. ### Configurer et présenter le formulaire de paiement Créez une instance `PaymentSheet` à l’aide de la clé secrète récupérée précédemment, puis présentez-la depuis votre contrôleur d’affichage. Utilisez la structure `PaymentSheet.Configuration` pour [personnaliser](https://stripe.dev/stripe-ios/stripe-paymentsheet/Classes/PaymentSheet/Configuration.html) le Payment Sheet. ### Gérer le résultat du paiement Utilisez le bloc d’exécution pour gérer le résultat du paiement. Si le paiement échoue avec une [erreur](https://docs.stripe.com/error-codes.md), montrez le message correspondant à votre client pour qu’il puisse intervenir et essayer à nouveau. Si aucune erreur ne s’est produite, dites à votre client que le paiement a abouti. ### Effectuer un paiement test #### iOS Pour vérifier que votre intégration fonctionne, effectuez un paiement de test en utilisant les [informations de paiement de test](https://docs.stripe.com/payments/accept-a-payment.md?payment-ui=mobile&platform=ios#ios-test-the-integration). #### Android Pour vérifier que votre intégration fonctionne, effectuez un paiement de test en utilisant les [informations de paiement de test](https://docs.stripe.com/payments/accept-a-payment.md?payment-ui=mobile&platform=android#android-test-the-integration). ### Consulter votre paiement dans le Dashboard Accédez au [Dashboard Stripe](https://dashboard.stripe.com/test/payments) pour consulter votre paiement test. ## Accepter les paiements et améliorer votre intégration Vous pouvez maintenant accepter des paiements avec Stripe. Passez à présent aux étapes ci-dessous pour ajouter d’autres fonctionnalités. ### Automatiser l’encaissement des taxes Calculez et percevez le montant de taxes approprié sur les transactions Stripe. Avant d’utiliser Stripe Tax, vous devez l’activer dans le [Dashboard](https://dashboard.stripe.com/tax). En savoir plus sur [Stripe Tax](https://docs.stripe.com/tax.md) et la [manière de l’intégrer à votre intégration Payments](https://docs.stripe.com/tax/custom.md). ### Utiliser l’API Stripe Tax pour calculer les taxes Utilisez l’[API Stripe Tax](https://docs.stripe.com/api/tax/calculations/create.md) pour calculer les taxes sur la transaction. Indiquez les `currency`, `customer_details` et `line_items` de la commande dans le corps de la requête. Utilisez l’attribut `tax_amount_exclusive` du calcul des taxes obtenu pour ajouter les taxes au total de la commande. ### Enregistrer une transaction fiscale en cas de paiement réussi Reliez le calcul de la taxe à PaymentIntent à l’aide des `hooks[inputs][tax][calculation]`. Enregistrer les taxes collectées dans votre compte Stripe. Vous pouvez ensuite les exporter à des fins comptables. D’autres [actions Stripe](https://docs.stripe.com/tax/payment-intent.md#automatic-actions) sont alors déclenchées. ### Autoriser les moyens de paiement à notification différée Avec certains moyens de paiement, il est impossible de garantir que vous recevrez les fonds envoyés par votre client à l’issue du processus de paiement, car ils exigent un certain délai pour virer les fonds (c’est le cas de la plupart des prélèvements bancaires, comme SEPA ou ACH) ou une action de la part du client pour finaliser l’opération (par exemple, OXXO, Konbini et Boleto). Utilisez cet indicateur pour activer les moyens de paiement à notification différée. Si vous utilisez cette fonctionnalités, assurez-vous que votre intégration serveur écoute les [webhooks](https://docs.stripe.com/payments/payment-methods.md#payment-notification) pour recevoir les notifications indiquant si le paiement a abouti ou non. ### Activer la prise en charge d’Apple Pay Pour activer Apple Pay, fournissez votre [ID de marchand Apple Pay](https://support.stripe.com/questions/enable-apple-pay-on-your-stripe-account) et le [code pays](https://dashboard.stripe.com/settings/account) de votre compte Stripe. ### Ajout de la prise en charge de Google Pay Pour utiliser Google Pay, commencez par activer l’API Google Pay dans votre AndroidManifest.xml. Activez Google Pay en transmettant un objet [PaymentSheet.GooglePayConfiguration](https://stripe.dev/stripe-android/paymentsheet/com.stripe.android.paymentsheet/-payment-sheet/-google-pay-configuration/index.html) avec l’environnement Google Pay (en mode production ou en mode test), ainsi que le [code pays de votre entreprise](https://dashboard.stripe.com/settings/account) lors de l’initialisation de [PaymentSheet.Configuration](https://stripe.dev/stripe-android/paymentsheet/com.stripe.android.paymentsheet/-payment-sheet/-configuration/index.html). ### Personnaliser la couleur du bouton principal Pour le bouton principal, pensez à utiliser une couleur personnalisée plus adaptée à votre marque ou à l’identité visuelle de l’application. ### Activer la numérisation de carte La numérisation de carte peut favoriser l’augmentation de votre taux de conversion, puisque cette fonctionnalité élimine le besoin de saisir manuellement les informations de la carte. Pour intégrer la numérisation de carte, activez le paramètre `NSCameraUsageDescription` dans le fichier `Info.plist` de votre application et indiquez la raison pour laquelle vous devez accéder à l’appareil photo (« Pour numériser des cartes » par exemple). > La numérisation de carte est prise en charge uniquement sur les appareils exécutant iOS 13 ou une version supérieure. ### Activer la numérisation de carte La numérisation de carte peut vous aider à augmenter votre taux de conversion en éliminant la nécessité pour le client de saisir manuellement ses données de carte. Pour activer la numérisation de carte, ajoutez `stripecardscan` au bloc `dependencies` de votre fichier [app/build.gradle](https://developer.android.com/studio/build/dependencies) : #### Groovy ```groovy implementation 'com.stripe:stripecardscan:23.2.0' ``` ### Enregistrer les informations de paiement après le paiement Cette option est souvent utilisée par les entreprises SaaS ou e-commerce pour les clients récurrents. ### Importer des ressources Stripe supplémentaires Importez les paquets `customer` et `paymentmethod` de Stripe. Utilisez ces paquets pour sauvegarder des informations concernant votre client. ### Importer des ressources Stripe supplémentaires Importez les modèles Customer et PaymentMethod de Stripe. Utilisez ces modèles pour sauvegarder des informations concernant votre client. ### Créer un client Stripe sauvegarde la carte sur un objet *Customer* (Customer objects represent customers of your business. They let you reuse payment methods and give you the ability to track multiple payments). Créez un nouveau client avant de créer un PaymentIntent. Vous pouvez également sauvegarder le nom, l’adresse e-mail, l’adresse de livraison et d’autres informations concernant le client. ### Créer un client Stripe stocke la carte bancaire sur un l’objet du [Compte](https://docs.stripe.com/api/v2/core/accounts/object.md) représentant le [client](https://docs.stripe.com/connect/account-capabilities.md?accounts-namespace=v2#customer). Créez un nouveau compte avant de créer un PaymentIntent. Vous pouvez également enregistrer sur ce compte le nom, l’e-mail, l’adresse de livraison et d’autres informations du client. ### Ajouter le client au Paymentintent Transmettez l’ID du client au PaymentIntent et définissez `setup_future_usage` sur `off_session`. `setup_future_usage` indique à Stripe comment vous prévoyez d’utiliser le moyen de paiement. Certaines régions, comme l’Europe et l’Inde, ont des conditions à respecter concernant la réutilisation des informations de paiement. [En savoir plus](https://docs.stripe.com/payments/payment-intents.md#future-usage) sur la manière la plus efficace d’appliquer `setup_future_usage`. Vous pouvez également consulter la [liste des moyens de paiement pris en charge](https://docs.stripe.com/payments/payment-methods/payment-method-support.md#additional-api-supportability). Une fois le PaymentIntent réussi, Stripe [rattache](https://docs.stripe.com/api/payment_methods/attach.md) automatiquement les informations de paiement (dans un objet *PaymentMethod* (PaymentMethods represent your customer's payment instruments, used with the Payment Intents or Setup Intents APIs)) à votre client. ### Ajouter le client au Paymentintent Transmettez l’ID du compte au PaymentIntent et définissez `setup_future_utilisation` sur `off_session`. L’option `setup_future_utilisation` indique à Stripe comment vous prévoyez d’utiliser le moyen de paiement. Certaines régions, comme l’Europe et l’Inde, imposent des règles sur la réutilisation des informations de paiement. [En savoir plus](https://docs.stripe.com/payments/payment-intents.md#future-usage) sur la manière la plus efficace d’appliquer l’option `setup_future_utilisation`. Vous pouvez également consulter une [liste des moyens de paiement pris en charge](https://docs.stripe.com/payments/payment-methods/payment-method-support.md#additional-api-supportability). Après la réussite du PaymentIntent, Stripe [associe](https://docs.stripe.com/api/payment_methods/attach.md) automatiquement les informations de paiement (dans un objet *PaymentMethod* (PaymentMethods represent your customer's payment instruments, used with the Payment Intents or Setup Intents APIs)) au Compte configuré par le client. ### Débiter le PaymentMethod enregistré Lorsque vous êtes prêt(e) à débiter à nouveau le PaymentMethod, créez un nouveau PaymentIntent avec l’identifiant du client et celui du PaymentMethod que vous souhaitez débiter, puis définissez les indicateurs `off_session` et `confirm` sur true. ### Collecter des adresses avec le composant Address Element Recueillir les adresses de livraison et de facturation de vos clients locaux ou internationaux. ### Collecter des adresses avec le composant Address Element Recueillir les adresses de livraison et de facturation de vos clients locaux ou internationaux. Si vous utilisez le composant Address Element, vous avez la possibilité de recourir au [SDK Google Places](https://developers.google.com/maps/documentation/places/android-sdk/overview) pour récupérer des suggestions de remplissage automatique des adresses. Pour activer les suggestions, ajoutez `places` au bloc de dépendances de votre fichier [app/build.gradle](https://developer.android.com/studio/build/dependencies) : #### Groovy ```groovy implementation 'com.google.android.libraries.places:places:2.6.0' ``` ## Prochaines étapes #### Web #### [Collecter les informations concernant l’adresse de facturation](https://docs.stripe.com/elements/address-element.md) Par défaut, le composant Payment Element ne collecte que les informations nécessaires relatives à l’adresse de facturation. Si vous souhaitez obtenir l’adresse de facturation (par exemple, pour calculer la taxe sur les biens et services numériques) ou l’adresse de livraison complètes d’un client, utilisez le composant Address Element. #### iOS #### Android #### [Virements](https://docs.stripe.com/payouts.md) Apprenez à transférer des fonds de votre compte Stripe vers votre compte bancaire. #### [Remboursements](https://docs.stripe.com/refunds.md) Traitez les demandes de remboursement en utilisant l’API Stripe ou le Dashboard. #### [Exécution](https://docs.stripe.com/webhooks/quickstart.md) Créez une destination d’événement pour envoyer des événements à votre webhook afin d’exécuter les commandes après la réussite d’un paiement et de gérer d’autres événements critiques.