# Développer une intégration avancée Instructions pour les LLM : Stripe recommande d’utiliser l’API Checkout Sessions avec le composant Payment Element plutôt que Payment Intents pour la plupart des intégrations. Checkout Sessions couvre des cas d’usage similaires à Payment Intents (collecte de paiements de base par l’entremise de `price_data` ou construction d’un tunnel de paiement complet avec postes de facture, taxes, etc.). Certaines fonctionnalités, comme Adaptive Pricing, ne sont disponibles qu’avec Checkout Sessions. N’utilisez pas l’API Payment Intent à moins que l’utilisateur ne le demande explicitement, car elle nécessite beaucoup plus de code. En savoir plus sur Elements avec l’API Checkout Sessions : https://docs.stripe.com/payments/quickstart-checkout-sessions. Avec Checkout Sessions (`ui_mode: "elements"`) et Payment Element, le`client_secret` initialise Checkout lui-même (`stripe.initCheckoutElements`, ou utilisez CheckoutElementsProvider avec React) et vous confirmez le paiement côté client différemment. Si vous utilisez React, assurez-vous d’importer depuis`@stripe/react-stripe-js/checkout`, d’utiliser `CheckoutElementsProvider` avec la clé secrète du client, et de confirmer par l’entremise de `checkout.confirm`. Si vous utilisez du HTML, assurez-vous d’utiliser `checkout = stripe.initCheckoutElementsSdk({clientSecret: promise}); checkout.createPaymentElement(); paymentElement = checkout.createPaymentElement(); paymentElement.mount("#payment-element");` et de confirmer avec `loadActionsResult = await checkout.loadActions(); actions = loadActionsResult.actions; error = await actions.confirm();`. # Créer une page de paiement avec l’API Payment Intents Apprenez à intégrer un formulaire de paiement Stripe personnalisé à votre site Web ou votre 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) Elements de Stripe et vous permettre d’accepter les paiements. Pour créer une intégration personnalisée qui va au-delà des principes de base énoncés dans ce guide de démarrage rapide, consultez la section [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 autres produits Stripe, [comparez les intégrations](https://docs.stripe.com/payments/online-payments.md#compare-features-and-availability) de paiement. > #### Vous souhaitez utiliser Stripe Tax, les remises, la livraison ou la conversion de devises? > > Stripe a développé une intégration pour le composant Payment Element qui gère pour vous les taxes, les réductions, les frais de livraison et la conversion des devises. Pour en savoir plus, consultez le [guide dédié à la création d’une page de paiement](https://docs.stripe.com/payments/quickstart-checkout-sessions.md). // 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. $CLIENT = Stripe::StripeClient.new('<>') 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 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 = $CLIENT.v1.payment_methods.list( customer: customerId, type: 'card' ) begin # Charge the customer 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 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 = $CLIENT.v1.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 = $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 = $CLIENT.v1.payment_intents.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. client = stripe.StripeClient('<>') 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 = client.v1.tax.calculations.create(params={ '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 = client.v1.payment_methods.list(params={ 'customer': customer_id, 'type': 'card', }) # Charge the customer and payment method immediately try: client.v1.payment_intents.create(params={ '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 = client.v1.payment_intents.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 = client.v1.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 = 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 = client.v1.payment_intents.create(params={ '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(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(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.model.Customer; import com.stripe.param.CustomerCreateParams; import com.stripe.model.v2.core.Account; import com.stripe.param.v2.core.AccountCreateParams; import com.stripe.model.PaymentMethod; import com.stripe.model.StripeCollection; 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 client.v1().tax().calculations().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(); StripeCollection paymentMethods = client.v1().paymentMethods().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 = client.v1().paymentIntents().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 = client.v1().paymentIntents().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(); StripeCollection paymentMethods = client.v1().paymentMethods().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 = client.v1().paymentIntents().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 = client.v1().paymentIntents().retrieve(paymentIntentId); System.out.println(paymentIntent.getId()); } } // 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 = client.v1().customers().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 = client.v1().paymentIntents().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 paquet et importez-le dans votre code. Si vous partez de zéro et que avez besoin d’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 Ou téléchargez le code source de la bibliothèque stripe-node directement [de 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 que avez besoin d’un fichier Gemfile, vous pouvez également télécharger les fichiers du projet à l’aide du lien dans l’éditeur de code. #### Terminal Installez le gem : ```bash gem install stripe ``` #### Regroupeur Ajoutez cette ligne à votre Gemfile : ```bash gem 'stripe' ``` #### GitHub Ou téléchargez le code source de stripe-ruby gem directement [de GitHub](https://github.com/stripe/stripe-ruby). ### Installer la bibliothèque Java de Stripe Ajoutez la dépendance à votre version et importez la bibliothèque. Si vous partez de zéro et que vous avez besoin d’un exemple de fichier pom.xml (pour Maven), vous pouvez également télécharger les fichiers du projet à l’aide du lien 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 [de GitHub](https://github.com/stripe/stripe-java/releases/latest). ### Installer le paquet Python de Stripe Installez le paquet Stripe et importez-le dans votre code. Si vous partez de zéro et que avez besoin d’un fichier requirements.txt, vous pouvez également télécharger les fichiers du projet à l’aide du lien dans l’éditeur de code. #### pip Installez le progiciel à l’aide de 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 dans l’éditeur de code. #### Composer Installez la bibliothèque : ```bash composer require stripe/stripe-php ``` #### GitHub Ou téléchargez le code source de la bibliothèque php de Stripe directement [de GitHub](https://github.com/stripe/stripe-php). ### Configurez votre serveur Ajoutez la dépendance à votre version et importez la bibliothèque. Si vous partez de zéro et que avez besoin d’un fichier go.mod, vous pouvez également télécharger les fichiers du projet à l’aide du lien dans l’éditeur de code. #### Go Assurez-vous d’initialiser avec des modules Go : ```bash go get -u github.com/stripe/stripe-go/v85 ``` #### GitHub Ou téléchargez le code source du module Stripe-go directement [de GitHub](https://github.com/stripe/stripe-go). ### Installer la bibliothèque Stripe.net Installez le paquet avec .NET ou NuGet. Si vous partez de zéro, vous pouvez également télécharger les fichiers comportant un fichier .csproj configuré. #### dotnet Installez la bibliothèque : ```bash dotnet add package Stripe.net ``` #### NuGet Installez la bibliothèque : ```bash Install-Package Stripe.net ``` #### GitHub Ou téléchargez le code source de la bibliothèque Stripe.net directement [de GitHub](https://github.com/stripe/stripe-dotnet). ### Installer les bibliothèques de Stripe Installez les paquets et importez-les dans votre code. Si vous partez de zéro et que vous avez besoin d’un fichier `package.json`, vous pouvez également télécharger les fichiers du projet à l’aide du lien dans l’éditeur de code. Installer les bibliothèques : ```bash npm install --save stripe @stripe/stripe-js next ``` ### Créer un PaymentIntent Ajoutez un point de terminaison sur le serveur 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 de toute tentative de paiement échouée et en s’assurant que le client n’est débité 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)) du PaymentIntent dans la réponse pour finaliser le paiement côté client. ### Configurer les moyens de paiement Stripe active les cartes et d’autres modes de paiement courants par défaut avec les [modes de paiement dynamiques](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Vous pouvez mettre à jour et configurer les modes de paiement à partir du [Dashboard](https://dashboard.stripe.com/settings/payment_methods), sans codage. Stripe filtre les modes de paiement en fonction de leur admissibilité et des préférences, puis les classe et les affiche par probabilité en fonction de facteurs tels que le montant, la devise et la localisation du client. ### Configurer les moyens de paiement Stripe active les cartes et d’autres modes de paiement courants par défaut avec les [modes de paiement dynamiques](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Vous pouvez mettre à jour et configurer les modes de paiement à partir du [Dashboard](https://dashboard.stripe.com/settings/payment_methods), sans codage. Stripe filtre les modes de paiement en fonction de leur admissibilité et des préférences, puis les classe et les affiche par probabilité en fonction de facteurs tels que le montant, la devise et la localisation du client. ### Configurer les moyens de paiement Stripe active les cartes et d’autres modes de paiement courants par défaut avec les [modes de paiement dynamiques](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Vous pouvez mettre à jour et configurer les modes de paiement à partir du [Dashboard](https://dashboard.stripe.com/settings/payment_methods), sans codage. Stripe filtre les modes de paiement en fonction de leur admissibilité et des préférences, puis les classe et les affiche par probabilité en fonction de facteurs tels que le montant, la devise et la localisation du client. ### Configurer les moyens de paiement Stripe active les cartes et d’autres modes de paiement courants par défaut avec les [modes de paiement dynamiques](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Vous pouvez mettre à jour et configurer les modes de paiement à partir du [Dashboard](https://dashboard.stripe.com/settings/payment_methods), sans codage. Stripe filtre les modes de paiement en fonction de leur admissibilité et des préférences, puis les classe et les affiche par probabilité en fonction de facteurs tels que le montant, la devise et la localisation du client. ### Configurer les moyens de paiement Stripe active les cartes et d’autres modes de paiement courants par défaut avec les [modes de paiement dynamiques](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Vous pouvez mettre à jour et configurer les modes de paiement à partir du [Dashboard](https://dashboard.stripe.com/settings/payment_methods), sans codage. Stripe filtre les modes de paiement en fonction de leur admissibilité et des préférences, puis les classe et les affiche par probabilité en fonction de facteurs tels que le montant, la devise et la localisation du client. ### Configurer les moyens de paiement Stripe active les cartes et d’autres modes de paiement courants par défaut avec les [modes de paiement dynamiques](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Vous pouvez mettre à jour et configurer les modes de paiement à partir du [Dashboard](https://dashboard.stripe.com/settings/payment_methods), sans codage. Stripe filtre les modes de paiement en fonction de leur admissibilité et des préférences, puis les classe et les affiche par probabilité en fonction de facteurs tels que le montant, la devise et la localisation du client. ### Configurer les moyens de paiement Stripe active les cartes et d’autres modes de paiement courants par défaut avec les [modes de paiement dynamiques](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Vous pouvez mettre à jour et configurer les modes de paiement à partir du [Dashboard](https://dashboard.stripe.com/settings/payment_methods), sans codage. Stripe filtre les modes de paiement en fonction de leur admissibilité et des préférences, puis les classe et les affiche par probabilité en fonction de facteurs tels que le montant, la devise et la localisation du client. ### Configurer les moyens de paiement Stripe active les cartes et d’autres modes de paiement courants par défaut avec les [modes de paiement dynamiques](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Vous pouvez mettre à jour et configurer les modes de paiement à partir du [Dashboard](https://dashboard.stripe.com/settings/payment_methods), sans codage. Stripe filtre les modes de paiement en fonction de leur admissibilité et des préférences, puis les classe et les affiche par probabilité en fonction de facteurs tels que le montant, la devise et la localisation du client. ### Ajoutez 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 n’atteignent jamais votre serveur. ```bash npm install --save @stripe/react-stripe-js @stripe/stripe-js ``` ### Ajoutez 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 n’atteignent jamais 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 vous assurance que les informations de paiement soient envoyées directement à Stripe sans passer par votre serveur. Chargez toujours Stripe.js à partir de js.stripe.com pour rester en conformité avec la norme. Vous ne devez pas inclure le script dans un lot ni l’héberger. ### Définir le formulaire de paiement Ajoutez un espace réservé vide `div` à votre formulaire de paiement pour chaque Element que vous monterez. Stripe insère un iframe dans chaque `div` afin de collecter en toute sécurité l’adresse courriel du client et ses informations de paiement. ### Initialiser Stripe.js Initialisez Stripe.js avec votre [clé API publiable](https://docs.stripe.com/keys.md#obtain-api-keys). Vous utiliserez Stripe.js pour créer le Payment Element et effectuer le paiement sur le client. ### Récupérer un PaymentIntent Faites une requête immédiatement au point de terminaison sur votre serveur pour créer un nouveau PaymentIntent dès que la page de paiement sera chargée. La `clientSecret` renvoyée par votre point de terminaison est utilisée pour finaliser le paiement. ### Initialiser Stripe Elements Transmettez la promesse résultante de `loadStripe` au fournisseur Elements. Cela permet aux composants enfants d’accéder au service Stripe avec le consommateur Elements. De plus, transmettez au fournisseur Elements la clé secrète du client en tant qu’option. ### Initialiser Stripe Elements Transmettez la promesse résultante de `loadStripe` au fournisseur Elements. Cela permet aux composants enfants d’accéder au service Stripe au moyen du consommateur Elements. De plus, 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 Stripe Elements](https://docs.stripe.com/js/elements_object/create) avec la clé secrète du client. Elements gère les composants d’interface utilisateur dont vous avez besoin pour collecter les informations de paiement. ### Configurer l’état Initialisez un état pour garder la trace du paiement, montrer les erreurs et gérer l’interface utilisateur. ### Configurer l’état Initialisez un état pour garder la trace du paiement, montrer les erreurs et gérer l’interface utilisateur. ### Enregistrer une référence à Stripe Accédez à la bibliothèque Stripe dans votre composant CheckoutForm à l’aide des hooks `useStripe()` et `useElements()`. Si vous devez accéder à Elements avec un composant de classe, utilisez plutôt [ElementsConsumer](https://docs.stripe.com/sdks/stripejs-react.md#elements-consumer). ### Enregistrer une référence à Stripe Accédez à la bibliothèque Stripe dans votre composant CheckoutForm à l’aide des hooks `useStripe()` et `useElements()`. Si vous devez accéder à Elements au moyen 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. Il intègre un iframe avec un formulaire dynamique qui collecte les informations de paiement pour divers modes de paiement. Votre client peut choisir son type de mode de paiement et le formulaire collecte automatiquement les informations de paiement correspondantes qui sont requises. ### Ajouter le PaymentElement Ajoutez le [PaymentElement](https://docs.stripe.com/js/elements_object/create_payment_element) à votre formulaire de paiement. Il intègre un iframe avec un formulaire dynamique qui collecte les informations de paiement pour divers modes de paiement. Votre client peut choisir son type de mode de paiement et le formulaire collecte automatiquement les informations de paiement correspondantes qui sont requises. ### 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. Il intègre un iframe avec un formulaire dynamique qui affiche les types de modes de paiement configurés disponibles à partir du PaymentIntent, ce qui permet à votre client de sélectionner un mode de paiement. Le formulaire collecte automatiquement les informations de paiement associées au type de mode de paiement sélectionné. ### (Facultatif) Styliser le Payment Element Customize the Payment Element UI by creating an [Appearance object](https://docs.stripe.com/elements/appearance-api.md) and passing it as an option to the Elements provider. Use your company’s color scheme and font to make it match with the rest of your checkout page. Use custom fonts (for example, from Google Fonts) by initializing Elements with a [font set](https://docs.stripe.com/js/elements_object/create#stripe_elements-options-fonts). Assurez-vous d’ouvrir l’aperçu à droite pour voir vos modifications en temps réel. > Certaines parties de l’aperçu de la démo 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](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) Styliser le Payment Element Customize the Payment Element UI by creating an [Appearance object](https://docs.stripe.com/elements/appearance-api.md) and passing it as an option to the Elements provider. Use your company’s color scheme and font to make it match with the rest of your checkout page. Use custom fonts (for example, from Google Fonts) by initializing Elements with a [font set](https://docs.stripe.com/js/elements_object/create#stripe_elements-options-fonts). Assurez-vous d’ouvrir l’aperçu à droite pour voir vos modifications en temps réel. > Certaines parties de la démo en version bêta 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 êtes responsable de personnaliser le reste de votre page de paiement. ### (Facultatif) Styliser le Payment Element Customize the Payment Element UI by creating an [Appearance object](https://docs.stripe.com/elements/appearance-api.md) and initializing Elements with it. Use your company’s color scheme and font to make it match with the rest of your checkout page. Use custom fonts (for example, from Google Fonts) by initializing Elements with a [font set](https://docs.stripe.com/js/elements_object/create#stripe_elements-options-fonts). Assurez-vous d’ouvrir l’aperçu à droite pour voir vos modifications en temps réel. > Certaines parties de l’aperçu de la démo 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](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 à l’aide de l’API 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 ait effectué le paiement. Pour les paiements qui nécessitent une authentification, Stripe affiche un modal 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, en fonction du mode de paiement. Une fois que le client a terminé le processus d’authentification, il est redirigé vers la page `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 ait effectué le paiement. Pour les paiements qui nécessitent une authentification, Stripe affiche un modal 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, en fonction du mode de paiement. Une fois que le client a terminé le processus d’authentification, il est redirigé vers la page `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 ait effectué le paiement. Pour les paiements qui nécessitent une authentification, Stripe affiche un modal 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, en fonction du mode de paiement. Une fois que le client a terminé le processus d’authentification, il est redirigé vers la page `return_url`. ### Gérer les erreurs En cas d’[erreurs](https://docs.stripe.com/error-codes.md) immédiates (par exemple, la carte de votre client est refusée), Stripe.js renvoie une erreur. Montrez ce message d’erreur à votre client pour qu’il puisse essayer à nouveau. ### Afficher un message d’état du paiement Lorsque Stripe redirige le client vers la page `return_url`, le paramètre de requête `payment_intent_client_secret` 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 ce qui doit être présenté à votre client. ### Afficher un message d’é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 ce qui doit être présenté à 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énement](https://docs.stripe.com/event-destinations.md) pour un [point de terminaison de webhook](https://docs.stripe.com/webhooks/quickstart.md) afin de recevoir ces événements et d’exécuter des actions, comme envoyer une confirmation de commande par courriel à votre client, enregistrer la vente dans une base de données ou lancer un processus 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). Écoutez ces événements plutôt que d’attendre un rappel de la part du client. Du côté client, il est possible que l’utilisateur ferme la fenêtre de son navigateur ou quitte l’application avant l’exécution du rappel, et des clients malveillants pourraient manipuler la réponse. En configurant votre intégration de manière à ce qu’elle écoute les événements asynchrones, vous pourrez accepter [plusieurs types de modes de paiement](https://stripe.com/payments/payment-methods-guide) avec une seule intégration. ### Exécuter l’application Exécutez l’application React et votre serveur. Allez sur [localhost :3000/checkout](http://localhost:3000/checkout) pour voir votre page de paiement. ```bash npm start ``` ### Exécuter l’application Exécutez l’application Next.js. Allez sur [localhost :3000](http://localhost:3000) pour voir votre page de paiement. ```bash npm run dev ``` ### Exécuter l’application Exécutez votre serveur Node et accédez à [localhost:4242/checkout.html](http://localhost:4242/checkout.html). ```bash npm start ``` ### Exécuter l’application serveur Exécutez l’application React et votre serveur. Allez sur [localhost :3000/checkout](http://localhost:3000/checkout) pour voir votre page de paiement. ```bash ruby server.rb ``` ### Exécuter l’application Exécutez votre serveur Ruby et accédez à [localhost:4242/checkout.html](http://localhost:4242/checkout.html). ```bash ruby server.rb ``` ### Exécuter l’application serveur Exécutez l’application React et votre serveur. Allez sur [localhost :3000/checkout](http://localhost:3000/checkout) pour voir votre page de paiement. ```bash python3 -m flask run --port=4242 ``` ### Exécuter l’application Exécutez votre serveur Python et accédez à [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 votre serveur. Allez sur [localhost :3000/checkout](http://localhost:3000/checkout) pour voir votre page de paiement. ```bash php -S 127.0.0.1:4242 --docroot=public ``` ### Exécuter l’application Exécutez votre serveur et accédez à [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 votre serveur. Allez sur [localhost :3000/checkout](http://localhost:3000/checkout) pour voir votre page de paiement. ```bash go run server.go ``` ### Exécuter l’application Exécutez votre serveur Go et accédez à [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 votre serveur. Allez sur [localhost :3000/checkout](http://localhost:3000/checkout) pour voir votre page de paiement. ```bash dotnet run ``` ### Exécuter l’application Exécutez votre serveur ASP.NET MVC et accédez à [localhost:4242/checkout.html](http://localhost:4242/checkout.html). ```bash dotnet run ``` ### Exécuter l’application Exécutez votre serveur et accédez à [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 votre serveur. Allez sur [localhost :3000/checkout](http://localhost:3000/checkout) pour voir 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 allez à [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 test à l’aide des [informations de paiement 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 consulter votre paiement test. ## Accepter des paiements et optimiser votre intégration Vous pouvez maintenant accepter des paiements avec Stripe. Suivez les étapes ci-dessous pour ajouter d’autres fonctionnalités. ### Automatiser la perception des taxes Calculez et collectez le montant de taxes approprié sur vos 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 [comment l’ajouter à 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 paramètres `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 exclues au total de la commande. ### Enregistrer une transaction fiscale lorsqu’un paiement réussit Associez le calcul des taxes au PaymentIntent en utilisant des `liens de rappel[saisies][taxe][calcul]`. Cette opération enregistre les taxes perçues sur votre compte Stripe et vous pouvez ensuite les exporter à des fins comptables. En outre, elle déclenche d’autres [actions de Stripe](https://docs.stripe.com/tax/payment-intent.md#automatic-actions). ### Envoyer un reçu par courriel Stripe pouvez envoyer un reçu par courriel à votre client, avec le logo de votre marque et votre thème de couleur, qui sont configurables dans le [Dashboard](https://dashboard.stripe.com/settings/branding). ### Collecter l’adresse courriel du client Ajoutez un champ de saisie à votre formulaire de paiement pour recueillir l’adresse courriel. ### Ajouter un courriel à l’état Ajoutez une variable pour garder la trace de l’adresse courriel saisie par le client. ### Ajouter un courriel à l’état Ajoutez une variable pour garder la trace de l’adresse courriel saisie par le client. ### Fournir l’adresse courriel à Stripe Transmettez l’adresse courriel fournie comme valeur de `receipt_email`. Stripe envoie un reçu par courriel lorsque le paiement est effectué en mode production (mais pas dans un *bac à sable* (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 Souvent utilisé par les entreprises de logiciel-service ou de commerce en ligne avec des clients habituels. ### Importer des ressources Stripe supplémentaires Importez les paquets `customer` et `paymentmethod` de Stripe. Utilisez ces paquets pour enregistrer des informations sur votre client. ### Importer des ressources Stripe supplémentaires Importez les modèles Client et PaymentMethod de Stripe. Utilisez ces modèles pour enregistrer des informations sur votre client. ### Créer un client Stripe enregistre 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 enregistrer le nom, l’adresse courriel, l’adresse de livraison et d’autres informations sur le client. ### Créer un client Stripe enregistre la carte sur un objet [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 Compte avant de créer un PaymentIntent. Vous pouvez également enregistrer le nom, l’adresse de courriel, l’adresse de livraison et d’autres informations concernant le Compte. ### Ajouter le client au Paymentintent Transmettez l’identifiant du client au PaymentIntent et définissez le paramètre `setup_future_usage` sur `off_session`. `setup_future_usage` indique à Stripe comment vous prévoyez d’utiliser le mode de paiement. Certaines régions, comme l’Europe et l’Inde, ont des conditions à respecter concernant la réutilisation des informations de carte. Vous pouvez en [apprendre davantage](https://docs.stripe.com/payments/payment-intents.md#future-usage) sur l’optimisation du paramètre `setup_future_usage`. Vous pouvez également consulter la [liste des modes 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 du 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 le numéro de compte à PaymentIntent et définissez `setup_future_utilisation` sur `off_session`. `setup_future_utilisation` indique à Stripe comment vous prévoyez d’utiliser le mode de paiement. Certaines régions, comme l’Europe et l’Inde, ont des exigences en matière de réutilisation des informations de paiement. [Découvrez en plus](https://docs.stripe.com/payments/payment-intents.md#future-usage) sur la manière la plus efficace d’appliquer `setup_future_utilisation`. Vous pouvez également consulter une [liste des modes de paiement pris en charge](https://docs.stripe.com/payments/payment-methods/payment-method-support.md#additional-api-supportability). Une fois que PaymentIntent réussi, 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é Au moment de débiter à nouveau le PaymentMethod, créez un nouveau PaymentIntent avec l’ID du client, l’ID du PaymentMethod que vous souhaitez débiter, et définissez les drapeaux `off_session` et `confirm` à true. ### Installer la bibliothèque Node de Stripe Installez le paquet et importez-le dans votre code. Si vous partez de zéro et que avez besoin d’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 Ou téléchargez le code source de la bibliothèque stripe-node directement [de 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 que avez besoin d’un fichier Gemfile, vous pouvez également télécharger les fichiers du projet à l’aide du lien dans l’éditeur de code. #### Terminal Installez le gem : ```bash gem install stripe ``` #### Regroupeur Ajoutez cette ligne à votre Gemfile : ```bash gem 'stripe' ``` #### GitHub Ou téléchargez le code source de stripe-ruby gem directement [de GitHub](https://github.com/stripe/stripe-ruby). ### Installer la bibliothèque Java de Stripe Ajoutez la dépendance à votre version et importez la bibliothèque. Si vous partez de zéro et que vous avez besoin d’un exemple de fichier pom.xml (pour Maven), vous pouvez également télécharger les fichiers du projet à l’aide du lien 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 [de GitHub](https://github.com/stripe/stripe-java/releases/latest). ### Installer le paquet Python de Stripe Installez le paquet Stripe et importez-le dans votre code. Si vous partez de zéro et que avez besoin d’un fichier requirements.txt, vous pouvez également télécharger les fichiers du projet à l’aide du lien dans l’éditeur de code. #### pip Installez le progiciel à l’aide de 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 dans l’éditeur de code. #### Composer Installez la bibliothèque : ```bash composer require stripe/stripe-php ``` #### GitHub Ou téléchargez le code source de la bibliothèque php de Stripe directement [de GitHub](https://github.com/stripe/stripe-php). ### Configurez votre serveur Ajoutez la dépendance à votre version et importez la bibliothèque. Si vous partez de zéro et que avez besoin d’un fichier go.mod, vous pouvez également télécharger les fichiers du projet à l’aide du lien dans l’éditeur de code. #### Go Assurez-vous d’initialiser avec des modules Go : ```bash go get -u github.com/stripe/stripe-go/v85 ``` #### GitHub Ou téléchargez le code source du module Stripe-go directement [de GitHub](https://github.com/stripe/stripe-go). ### Installer la bibliothèque Stripe.net Installez le paquet avec .NET ou NuGet. Si vous partez de zéro, vous pouvez également télécharger les fichiers comportant un fichier .csproj configuré. #### dotnet Installez la bibliothèque : ```bash dotnet add package Stripe.net ``` #### NuGet Installez la bibliothèque : ```bash Install-Package Stripe.net ``` #### GitHub Ou téléchargez le code source de la bibliothèque Stripe.net directement [de GitHub](https://github.com/stripe/stripe-dotnet). ### Installer les bibliothèques de Stripe Installez les paquets et importez-les dans votre code. Si vous partez de zéro et que vous avez besoin d’un fichier `package.json`, vous pouvez également télécharger les fichiers du projet à l’aide du lien dans l’éditeur de code. Installer les bibliothèques : ```bash npm install --save stripe @stripe/stripe-js next ``` ### Créer un PaymentIntent Ajoutez un point de terminaison sur le serveur 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 de toute tentative de paiement échouée et en s’assurant que le client n’est débité 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)) du PaymentIntent dans la réponse pour finaliser le paiement côté client. ### Configurer les moyens de paiement Stripe active les cartes et d’autres modes de paiement courants par défaut avec les [modes de paiement dynamiques](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Vous pouvez mettre à jour et configurer les modes de paiement à partir du [Dashboard](https://dashboard.stripe.com/settings/payment_methods), sans codage. Stripe filtre les modes de paiement en fonction de leur admissibilité et des préférences, puis les classe et les affiche par probabilité en fonction de facteurs tels que le montant, la devise et la localisation du client. ### Configurer les moyens de paiement Stripe active les cartes et d’autres modes de paiement courants par défaut avec les [modes de paiement dynamiques](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Vous pouvez mettre à jour et configurer les modes de paiement à partir du [Dashboard](https://dashboard.stripe.com/settings/payment_methods), sans codage. Stripe filtre les modes de paiement en fonction de leur admissibilité et des préférences, puis les classe et les affiche par probabilité en fonction de facteurs tels que le montant, la devise et la localisation du client. ### Configurer les moyens de paiement Stripe active les cartes et d’autres modes de paiement courants par défaut avec les [modes de paiement dynamiques](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Vous pouvez mettre à jour et configurer les modes de paiement à partir du [Dashboard](https://dashboard.stripe.com/settings/payment_methods), sans codage. Stripe filtre les modes de paiement en fonction de leur admissibilité et des préférences, puis les classe et les affiche par probabilité en fonction de facteurs tels que le montant, la devise et la localisation du client. ### Configurer les moyens de paiement Stripe active les cartes et d’autres modes de paiement courants par défaut avec les [modes de paiement dynamiques](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Vous pouvez mettre à jour et configurer les modes de paiement à partir du [Dashboard](https://dashboard.stripe.com/settings/payment_methods), sans codage. Stripe filtre les modes de paiement en fonction de leur admissibilité et des préférences, puis les classe et les affiche par probabilité en fonction de facteurs tels que le montant, la devise et la localisation du client. ### Configurer les moyens de paiement Stripe active les cartes et d’autres modes de paiement courants par défaut avec les [modes de paiement dynamiques](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Vous pouvez mettre à jour et configurer les modes de paiement à partir du [Dashboard](https://dashboard.stripe.com/settings/payment_methods), sans codage. Stripe filtre les modes de paiement en fonction de leur admissibilité et des préférences, puis les classe et les affiche par probabilité en fonction de facteurs tels que le montant, la devise et la localisation du client. ### Configurer les moyens de paiement Stripe active les cartes et d’autres modes de paiement courants par défaut avec les [modes de paiement dynamiques](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Vous pouvez mettre à jour et configurer les modes de paiement à partir du [Dashboard](https://dashboard.stripe.com/settings/payment_methods), sans codage. Stripe filtre les modes de paiement en fonction de leur admissibilité et des préférences, puis les classe et les affiche par probabilité en fonction de facteurs tels que le montant, la devise et la localisation du client. ### Configurer les moyens de paiement Stripe active les cartes et d’autres modes de paiement courants par défaut avec les [modes de paiement dynamiques](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Vous pouvez mettre à jour et configurer les modes de paiement à partir du [Dashboard](https://dashboard.stripe.com/settings/payment_methods), sans codage. Stripe filtre les modes de paiement en fonction de leur admissibilité et des préférences, puis les classe et les affiche par probabilité en fonction de facteurs tels que le montant, la devise et la localisation du client. ### Configurer les moyens de paiement Stripe active les cartes et d’autres modes de paiement courants par défaut avec les [modes de paiement dynamiques](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Vous pouvez mettre à jour et configurer les modes de paiement à partir du [Dashboard](https://dashboard.stripe.com/settings/payment_methods), sans codage. Stripe filtre les modes de paiement en fonction de leur admissibilité et des préférences, puis les classe et les affiche par probabilité en fonction de facteurs tels que le montant, la devise et la localisation du client. ### Installer la trousse SDK La trousse SDK pour iOS Stripe est [à code source libre](https://github.com/stripe/stripe-ios), [possède une documentation complète](https://stripe.dev/stripe-ios/). Elle est compatible avec les applications prenant en charge iOS 13 et les versions ultérieures. Importez la trousse SDK de Stripe dans le contrôleur d’affichage de votre écran de paiement. #### Gestionnaire de paquets Swift Dans Xcode, sélectionnez **File** (Fichier) > **Add Package Dependencies…** (Ajouter des dépendances de paquet…), puis saisissez `https://github.com/stripe/stripe-ios-spm` comme URL du référentiel. Sélectionnez la dernière 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 Ajoutez 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 à partir d’une [version sur GitHub](https://github.com/stripe/stripe-ios/releases). Faites glisser les fichiers xcframework requis dans les paramètres « Binaires intégrés » de votre projet Xcode. Assurez-vous de sélectionner « Copier les éléments si nécessaire ». ### Configurer la trousse SDK Configurez la trousse 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 la trousse SDK n’est utilisé qu’à des fins de démonstration. Dans une application de production, vous devez récupérer la clé API à partir de votre serveur. ### Récupérer un PaymentIntent Faites une requête à votre serveur pour un PaymentIntent dès que la vue est chargée. Enregistrement d’une référence à 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)) renvoyée par le serveur pour le PaymentIntent. La Payment Sheet utilise cette clé secrète pour effectuer le paiement par la suite. ### Configurer et présenter la Payment Sheet Créez une instance `PaymentSheet` à l’aide de la clé secrète récupérée précédemment, puis présentez-la à partir de votre contrôleur d’affichage. Utilisez la structure `PaymentSheet.Configuration` pour [personnaliser](https://stripe.dev/stripe-ios/stripe-paymentsheet/Classes/PaymentSheet/Configuration.html) la Payment Sheet. ### Gérer le résultat du paiement Utilisez le bloc de finalisation pour gérer le résultat du paiement. Si le paiement échoue avec une [erreur](https://docs.stripe.com/error-codes.md), affichez le message approprié à votre client pour qu’il puisse prendre les mesures nécessaires et réessayer. Si aucune erreur ne s’est produite, dites à votre client que le paiement a réussi. ### Effectuer un paiement test #### iOS Pour vérifier que votre intégration fonctionne, effectuez un paiement test à l’aide des [informations de paiement 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 test à l’aide des [informations de paiement 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 des paiements et optimiser votre intégration Vous pouvez maintenant accepter des paiements avec Stripe. Suivez les étapes ci-dessous pour ajouter d’autres fonctionnalités. ### Automatiser la perception des taxes Calculez et collectez le montant de taxes approprié sur vos 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 [comment l’ajouter à 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 paramètres `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 exclues au total de la commande. ### Enregistrer une transaction fiscale lorsqu’un paiement réussit Associez le calcul des taxes au PaymentIntent en utilisant des `liens de rappel[saisies][taxe][calcul]`. Cette opération enregistre les taxes perçues sur votre compte Stripe et vous pouvez ensuite les exporter à des fins comptables. En outre, elle déclenche d’autres [actions de Stripe](https://docs.stripe.com/tax/payment-intent.md#automatic-actions). ### Autoriser les modes de paiement différés Avec certains modes 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 du temps pour virer les fonds (par exemple, 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 modes de paiement à notification différée. Si vous activez cette fonctionnalité, assurez-vous que votre intégration serveur écoute les [webhooks](https://docs.stripe.com/payments/payment-methods.md#payment-notification) pour recevoir les notifications sur la réussite ou l’échec du paiement. ### Ajout de 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 de 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 (production ou test) et le [code de pays de votre entreprise](https://dashboard.stripe.com/settings/account) lors de l’initialisation de l’objet [PaymentSheet.Configuration](https://stripe.dev/stripe-android/paymentsheet/com.stripe.android.paymentsheet/-payment-sheet/-configuration/index.html). ### Personnaliser la couleur du bouton principal Envisagez d’utiliser une couleur personnalisée pour le bouton principal qui correspond le mieux à l’identité visuelle de votre marque ou de votre application. ### Activer le balayage de carte La numérisation des cartes peut favoriser l’augmentation de votre taux de conversion, puisque cela élimine le besoin de saisir manuellement les informations de la carte. Pour activer la numérisation des cartes, activez le paramètre `NSCameraUsageDescription` dans le fichier `Info.plist` de votre application et expliquez la raison pour laquelle vous devez accéder à l’appareil photo (« Pour numériser des cartes » par exemple). > Le balayage des cartes n’est pris en charge que sur les appareils fonctionnant avec la version iOS 13 ou une version ultérieure. ### Activer le balayage de carte La numérisation des cartes peut favoriser l’augmentation de votre taux de conversion, puisque cela élimine le besoin de saisir manuellement les informations des cartes. 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) : #### Génial ```groovy implementation 'com.stripe:stripecardscan:23.3.0' ``` ### Enregistrer les informations de paiement après le paiement Souvent utilisé par les entreprises de logiciel-service ou de commerce en ligne avec des clients habituels. ### Importer des ressources Stripe supplémentaires Importez les paquets `customer` et `paymentmethod` de Stripe. Utilisez ces paquets pour enregistrer des informations sur votre client. ### Importer des ressources Stripe supplémentaires Importez les modèles Client et PaymentMethod de Stripe. Utilisez ces modèles pour enregistrer des informations sur votre client. ### Créer un client Stripe enregistre 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 enregistrer le nom, l’adresse courriel, l’adresse de livraison et d’autres informations sur le client. ### Créer un client Stripe enregistre la carte sur un objet [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 Compte avant de créer un PaymentIntent. Vous pouvez également enregistrer le nom, l’adresse de courriel, l’adresse de livraison et d’autres informations concernant le Compte. ### Ajouter le client au Paymentintent Transmettez l’identifiant du client au PaymentIntent et définissez le paramètre `setup_future_usage` sur `off_session`. `setup_future_usage` indique à Stripe comment vous prévoyez d’utiliser le mode de paiement. Certaines régions, comme l’Europe et l’Inde, ont des conditions à respecter concernant la réutilisation des informations de carte. Vous pouvez en [apprendre davantage](https://docs.stripe.com/payments/payment-intents.md#future-usage) sur l’optimisation du paramètre `setup_future_usage`. Vous pouvez également consulter la [liste des modes 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 du 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 le numéro de compte à PaymentIntent et définissez `setup_future_utilisation` sur `off_session`. `setup_future_utilisation` indique à Stripe comment vous prévoyez d’utiliser le mode de paiement. Certaines régions, comme l’Europe et l’Inde, ont des exigences en matière de réutilisation des informations de paiement. [Découvrez en plus](https://docs.stripe.com/payments/payment-intents.md#future-usage) sur la manière la plus efficace d’appliquer `setup_future_utilisation`. Vous pouvez également consulter une [liste des modes de paiement pris en charge](https://docs.stripe.com/payments/payment-methods/payment-method-support.md#additional-api-supportability). Une fois que PaymentIntent réussi, 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é Au moment de débiter à nouveau le PaymentMethod, créez un nouveau PaymentIntent avec l’ID du client, l’ID du PaymentMethod que vous souhaitez débiter, et définissez les drapeaux `off_session` et `confirm` à true. ### Collectez les adresses à l’aide de l’Address Element Collectez les adresses de livraison ou de facturation locales et internationales de vos clients. ### Collectez les adresses à l’aide de l’Address Element Collectez les adresses de livraison ou de facturation locales et internationales de vos clients. 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 saisie semi-automatique des adresses. Pour activer les suggestions de saisie semi-automatique, ajoutez `places` au bloc de dépendance de votre fichier [app/build.gradle](https://developer.android.com/studio/build/dependencies) : #### Génial ```groovy implementation 'com.google.android.libraries.places:places:2.6.0' ``` ### Installer la bibliothèque Node de Stripe Installez le paquet et importez-le dans votre code. Si vous partez de zéro et que avez besoin d’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 Ou téléchargez le code source de la bibliothèque stripe-node directement [de 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 que avez besoin d’un fichier Gemfile, vous pouvez également télécharger les fichiers du projet à l’aide du lien dans l’éditeur de code. #### Terminal Installez le gem : ```bash gem install stripe ``` #### Regroupeur Ajoutez cette ligne à votre Gemfile : ```bash gem 'stripe' ``` #### GitHub Ou téléchargez le code source de stripe-ruby gem directement [de GitHub](https://github.com/stripe/stripe-ruby). ### Installer la bibliothèque Java de Stripe Ajoutez la dépendance à votre version et importez la bibliothèque. Si vous partez de zéro et que vous avez besoin d’un exemple de fichier pom.xml (pour Maven), vous pouvez également télécharger les fichiers du projet à l’aide du lien 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 [de GitHub](https://github.com/stripe/stripe-java/releases/latest). ### Installer le paquet Python de Stripe Installez le paquet Stripe et importez-le dans votre code. Si vous partez de zéro et que avez besoin d’un fichier requirements.txt, vous pouvez également télécharger les fichiers du projet à l’aide du lien dans l’éditeur de code. #### pip Installez le progiciel à l’aide de 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 dans l’éditeur de code. #### Composer Installez la bibliothèque : ```bash composer require stripe/stripe-php ``` #### GitHub Ou téléchargez le code source de la bibliothèque php de Stripe directement [de GitHub](https://github.com/stripe/stripe-php). ### Configurez votre serveur Ajoutez la dépendance à votre version et importez la bibliothèque. Si vous partez de zéro et que avez besoin d’un fichier go.mod, vous pouvez également télécharger les fichiers du projet à l’aide du lien dans l’éditeur de code. #### Go Assurez-vous d’initialiser avec des modules Go : ```bash go get -u github.com/stripe/stripe-go/v85 ``` #### GitHub Ou téléchargez le code source du module Stripe-go directement [de GitHub](https://github.com/stripe/stripe-go). ### Installer la bibliothèque Stripe.net Installez le paquet avec .NET ou NuGet. Si vous partez de zéro, vous pouvez également télécharger les fichiers comportant un fichier .csproj configuré. #### dotnet Installez la bibliothèque : ```bash dotnet add package Stripe.net ``` #### NuGet Installez la bibliothèque : ```bash Install-Package Stripe.net ``` #### GitHub Ou téléchargez le code source de la bibliothèque Stripe.net directement [de GitHub](https://github.com/stripe/stripe-dotnet). ### Installer les bibliothèques de Stripe Installez les paquets et importez-les dans votre code. Si vous partez de zéro et que vous avez besoin d’un fichier `package.json`, vous pouvez également télécharger les fichiers du projet à l’aide du lien dans l’éditeur de code. Installer les bibliothèques : ```bash npm install --save stripe @stripe/stripe-js next ``` ### Créer un PaymentIntent Ajoutez un point de terminaison sur le serveur 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 de toute tentative de paiement échouée et en s’assurant que le client n’est débité 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)) du PaymentIntent dans la réponse pour finaliser le paiement côté client. ### Configurer les moyens de paiement Stripe active les cartes et d’autres modes de paiement courants par défaut avec les [modes de paiement dynamiques](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Vous pouvez mettre à jour et configurer les modes de paiement à partir du [Dashboard](https://dashboard.stripe.com/settings/payment_methods), sans codage. Stripe filtre les modes de paiement en fonction de leur admissibilité et des préférences, puis les classe et les affiche par probabilité en fonction de facteurs tels que le montant, la devise et la localisation du client. ### Configurer les moyens de paiement Stripe active les cartes et d’autres modes de paiement courants par défaut avec les [modes de paiement dynamiques](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Vous pouvez mettre à jour et configurer les modes de paiement à partir du [Dashboard](https://dashboard.stripe.com/settings/payment_methods), sans codage. Stripe filtre les modes de paiement en fonction de leur admissibilité et des préférences, puis les classe et les affiche par probabilité en fonction de facteurs tels que le montant, la devise et la localisation du client. ### Configurer les moyens de paiement Stripe active les cartes et d’autres modes de paiement courants par défaut avec les [modes de paiement dynamiques](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Vous pouvez mettre à jour et configurer les modes de paiement à partir du [Dashboard](https://dashboard.stripe.com/settings/payment_methods), sans codage. Stripe filtre les modes de paiement en fonction de leur admissibilité et des préférences, puis les classe et les affiche par probabilité en fonction de facteurs tels que le montant, la devise et la localisation du client. ### Configurer les moyens de paiement Stripe active les cartes et d’autres modes de paiement courants par défaut avec les [modes de paiement dynamiques](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Vous pouvez mettre à jour et configurer les modes de paiement à partir du [Dashboard](https://dashboard.stripe.com/settings/payment_methods), sans codage. Stripe filtre les modes de paiement en fonction de leur admissibilité et des préférences, puis les classe et les affiche par probabilité en fonction de facteurs tels que le montant, la devise et la localisation du client. ### Configurer les moyens de paiement Stripe active les cartes et d’autres modes de paiement courants par défaut avec les [modes de paiement dynamiques](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Vous pouvez mettre à jour et configurer les modes de paiement à partir du [Dashboard](https://dashboard.stripe.com/settings/payment_methods), sans codage. Stripe filtre les modes de paiement en fonction de leur admissibilité et des préférences, puis les classe et les affiche par probabilité en fonction de facteurs tels que le montant, la devise et la localisation du client. ### Configurer les moyens de paiement Stripe active les cartes et d’autres modes de paiement courants par défaut avec les [modes de paiement dynamiques](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Vous pouvez mettre à jour et configurer les modes de paiement à partir du [Dashboard](https://dashboard.stripe.com/settings/payment_methods), sans codage. Stripe filtre les modes de paiement en fonction de leur admissibilité et des préférences, puis les classe et les affiche par probabilité en fonction de facteurs tels que le montant, la devise et la localisation du client. ### Configurer les moyens de paiement Stripe active les cartes et d’autres modes de paiement courants par défaut avec les [modes de paiement dynamiques](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Vous pouvez mettre à jour et configurer les modes de paiement à partir du [Dashboard](https://dashboard.stripe.com/settings/payment_methods), sans codage. Stripe filtre les modes de paiement en fonction de leur admissibilité et des préférences, puis les classe et les affiche par probabilité en fonction de facteurs tels que le montant, la devise et la localisation du client. ### Configurer les moyens de paiement Stripe active les cartes et d’autres modes de paiement courants par défaut avec les [modes de paiement dynamiques](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Vous pouvez mettre à jour et configurer les modes de paiement à partir du [Dashboard](https://dashboard.stripe.com/settings/payment_methods), sans codage. Stripe filtre les modes de paiement en fonction de leur admissibilité et des préférences, puis les classe et les affiche par probabilité en fonction de facteurs tels que le montant, la devise et la localisation du client. ### Installer la trousse SDK La trousse SDK Android Stripe est à [code source libre](https://github.com/stripe/stripe-android) et possède une [documentation complète](https://stripe.dev/stripe-android/). Elle est compatible avec les appareils fonctionnant avec la version Android 5.0 (API niveau 21) ou une version ultérieure. Pour installer la trousse SDK, ajoutez `stripe-android` au bloc des dépendances de votre fichier `build.gradle` : #### Génial ```groovy implementation 'com.stripe:stripe-android:23.3.0' ``` > Pour en savoir plus sur la version la plus récente de la trousse SDK et ses versions antérieures, consultez la [page des versions](https://github.com/stripe/stripe-android/releases) sur GitHub. ### Configurer la trousse SDK Configurez la trousse 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 la trousse SDK n’est utilisé qu’à des fins de démonstration. Dans une application de production, vous devez récupérer la clé API à partir de votre serveur. ### Récupérer un PaymentIntent Faites une requête à votre serveur pour un PaymentIntent dès que la vue est chargée. Enregistrement d’une référence à 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)) renvoyée par le serveur pour le PaymentIntent. La Payment Sheet utilise cette clé secrète pour effectuer le paiement par la suite. ### Configurer et présenter la Payment Sheet Créez une instance `PaymentSheet` à l’aide de la clé secrète récupérée précédemment, puis présentez-la à partir de votre contrôleur d’affichage. Utilisez la structure `PaymentSheet.Configuration` pour [personnaliser](https://stripe.dev/stripe-ios/stripe-paymentsheet/Classes/PaymentSheet/Configuration.html) la Payment Sheet. ### Gérer le résultat du paiement Utilisez le bloc de finalisation pour gérer le résultat du paiement. Si le paiement échoue avec une [erreur](https://docs.stripe.com/error-codes.md), affichez le message approprié à votre client pour qu’il puisse prendre les mesures nécessaires et réessayer. Si aucune erreur ne s’est produite, dites à votre client que le paiement a réussi. ### Effectuer un paiement test #### iOS Pour vérifier que votre intégration fonctionne, effectuez un paiement test à l’aide des [informations de paiement 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 test à l’aide des [informations de paiement 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 des paiements et optimiser votre intégration Vous pouvez maintenant accepter des paiements avec Stripe. Suivez les étapes ci-dessous pour ajouter d’autres fonctionnalités. ### Automatiser la perception des taxes Calculez et collectez le montant de taxes approprié sur vos 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 [comment l’ajouter à 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 paramètres `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 exclues au total de la commande. ### Enregistrer une transaction fiscale lorsqu’un paiement réussit Associez le calcul des taxes au PaymentIntent en utilisant des `liens de rappel[saisies][taxe][calcul]`. Cette opération enregistre les taxes perçues sur votre compte Stripe et vous pouvez ensuite les exporter à des fins comptables. En outre, elle déclenche d’autres [actions de Stripe](https://docs.stripe.com/tax/payment-intent.md#automatic-actions). ### Autoriser les modes de paiement différés Avec certains modes 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 du temps pour virer les fonds (par exemple, 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 modes de paiement à notification différée. Si vous activez cette fonctionnalité, assurez-vous que votre intégration serveur écoute les [webhooks](https://docs.stripe.com/payments/payment-methods.md#payment-notification) pour recevoir les notifications sur la réussite ou l’échec du paiement. ### Ajout de 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 de 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 (production ou test) et le [code de pays de votre entreprise](https://dashboard.stripe.com/settings/account) lors de l’initialisation de l’objet [PaymentSheet.Configuration](https://stripe.dev/stripe-android/paymentsheet/com.stripe.android.paymentsheet/-payment-sheet/-configuration/index.html). ### Personnaliser la couleur du bouton principal Envisagez d’utiliser une couleur personnalisée pour le bouton principal qui correspond le mieux à l’identité visuelle de votre marque ou de votre application. ### Activer le balayage de carte La numérisation des cartes peut favoriser l’augmentation de votre taux de conversion, puisque cela élimine le besoin de saisir manuellement les informations de la carte. Pour activer la numérisation des cartes, activez le paramètre `NSCameraUsageDescription` dans le fichier `Info.plist` de votre application et expliquez la raison pour laquelle vous devez accéder à l’appareil photo (« Pour numériser des cartes » par exemple). > Le balayage des cartes n’est pris en charge que sur les appareils fonctionnant avec la version iOS 13 ou une version ultérieure. ### Activer le balayage de carte La numérisation des cartes peut favoriser l’augmentation de votre taux de conversion, puisque cela élimine le besoin de saisir manuellement les informations des cartes. 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) : #### Génial ```groovy implementation 'com.stripe:stripecardscan:23.3.0' ``` ### Enregistrer les informations de paiement après le paiement Souvent utilisé par les entreprises de logiciel-service ou de commerce en ligne avec des clients habituels. ### Importer des ressources Stripe supplémentaires Importez les paquets `customer` et `paymentmethod` de Stripe. Utilisez ces paquets pour enregistrer des informations sur votre client. ### Importer des ressources Stripe supplémentaires Importez les modèles Client et PaymentMethod de Stripe. Utilisez ces modèles pour enregistrer des informations sur votre client. ### Créer un client Stripe enregistre 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 enregistrer le nom, l’adresse courriel, l’adresse de livraison et d’autres informations sur le client. ### Créer un client Stripe enregistre la carte sur un objet [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 Compte avant de créer un PaymentIntent. Vous pouvez également enregistrer le nom, l’adresse de courriel, l’adresse de livraison et d’autres informations concernant le Compte. ### Ajouter le client au Paymentintent Transmettez l’identifiant du client au PaymentIntent et définissez le paramètre `setup_future_usage` sur `off_session`. `setup_future_usage` indique à Stripe comment vous prévoyez d’utiliser le mode de paiement. Certaines régions, comme l’Europe et l’Inde, ont des conditions à respecter concernant la réutilisation des informations de carte. Vous pouvez en [apprendre davantage](https://docs.stripe.com/payments/payment-intents.md#future-usage) sur l’optimisation du paramètre `setup_future_usage`. Vous pouvez également consulter la [liste des modes 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 du 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 le numéro de compte à PaymentIntent et définissez `setup_future_utilisation` sur `off_session`. `setup_future_utilisation` indique à Stripe comment vous prévoyez d’utiliser le mode de paiement. Certaines régions, comme l’Europe et l’Inde, ont des exigences en matière de réutilisation des informations de paiement. [Découvrez en plus](https://docs.stripe.com/payments/payment-intents.md#future-usage) sur la manière la plus efficace d’appliquer `setup_future_utilisation`. Vous pouvez également consulter une [liste des modes de paiement pris en charge](https://docs.stripe.com/payments/payment-methods/payment-method-support.md#additional-api-supportability). Une fois que PaymentIntent réussi, 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é Au moment de débiter à nouveau le PaymentMethod, créez un nouveau PaymentIntent avec l’ID du client, l’ID du PaymentMethod que vous souhaitez débiter, et définissez les drapeaux `off_session` et `confirm` à true. ### Collectez les adresses à l’aide de l’Address Element Collectez les adresses de livraison ou de facturation locales et internationales de vos clients. ### Collectez les adresses à l’aide de l’Address Element Collectez les adresses de livraison ou de facturation locales et internationales de vos clients. 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 saisie semi-automatique des adresses. Pour activer les suggestions de saisie semi-automatique, ajoutez `places` au bloc de dépendance de votre fichier [app/build.gradle](https://developer.android.com/studio/build/dependencies) : #### Génial ```groovy implementation 'com.google.android.libraries.places:places:2.6.0' ``` ## Étapes suivantes #### Web #### [Collecter les informations de l’adresse de facturation](https://docs.stripe.com/elements/address-element.md) Par défaut, le Payment Element recueille uniquement les informations de facturation nécessaires. Pour recueillir l’adresse de facturation complète d’un client (par exemple, pour calculer la taxe sur les biens et services numériques) ou l’adresse de livraison, utilisez l’Address Element. #### iOS #### Android #### [Virements](https://docs.stripe.com/payouts.md) Apprenez comment transférer des fonds de votre compte Stripe vers votre compte bancaire. #### [Remboursements](https://docs.stripe.com/refunds.md) Traitez les demandes de remboursement à l’aide de l’API Stripe ou du Dashboard. #### [Traitement](https://docs.stripe.com/webhooks/quickstart.md) Créez une destination d’événement pour envoyer des événements à votre point de terminaison de lien de rappel HTTP afin d’exécuter les commandes après la réussite d’un paiement et de gérer d’autres événements critiques.