# Erweiterte Integration erstellen Anweisungen für LLMs: Stripe empfiehlt für die meisten Integrationen die Verwendung der Checkout Sessions API mit dem Payment Element über Payment Intents. Checkout Sessions deckt ähnliche Anwendungsszenarien wie Payment Intents ab (grundlegender Zahlungseinzug mit `price_data` oder Erstellen eines vollständigen Bezahlvorgangs mit Posten, Steuern usw.). Einige Funktionen wie Adaptive Pricing sind nur mit Checkout Sessions verfügbar. Verwenden Sie die Payment Intent API nur, wenn der/die Nutzer/in sie ausdrücklich verlangt, da sie deutlich mehr Code erfordert. Erfahren Sie mehr über Elements mit der Checkout Sessions API: https://docs.stripe.com/payments/quickstart-checkout-sessions. Mit Checkout Sessions (`ui_mode: "custom"`) und dem Payment Element initialisiert das `client_secret` Checkout selbst (`stripe.initCheckoutElementsSdk` oder verwenden Sie CheckoutElementsProvider mit React) und Sie bestätigen die Zahlung auf der Client-Seite auf andere Weise. Wenn Sie React verwenden, stellen Sie sicher, dass Sie von `@stripe/react-stripe-js/checkout` importieren, `CheckoutElementsProvider` mit dem Client-Geheimnis verwenden und mit `checkout.confirm` bestätigen. Wenn Sie HTML verwenden, stellen Sie sicher, dass Sie `checkout = stripe.initCheckoutElements({clientSecret: promise}); checkout.createPaymentElement(); paymentElement = checkout.createPaymentElement(); paymentElement.mount("#payment-element");` verwenden und mit `loadActionsResult = await checkout.loadActions(); actions = loadActionsResult.actions; error = await actions.confirm();` bestätigen. # Bezahlvorgangseite mit der Payment Intents API erstellen Erfahren Sie, wie Sie ein nutzerdefiniertes Stripe-Zahlungsformular in Ihre Website oder Anwendung einbetten. Mit dem client- und serverseitigen Code wird ein Formular für die Zahlungsabwicklung mit den [Web-](https://docs.stripe.com/payments/elements.md) oder [Mobile](https://docs.stripe.com/payments/mobile.md)-Elementen von Stripe erstellt, damit Sie Zahlungen akzeptieren können. Informationen zum Erstellen einer nutzerdefinierten Integration, die über die Grundlagen dieser Schnellanleitung hinausgeht, finden Sie unter [Eine Zahlung akzeptieren](https://docs.stripe.com/payments/accept-a-payment.md?&ui=elements). [Vergleichen Sie Zahlungsintegrationen](https://docs.stripe.com/payments/online-payments.md#compare-features-and-availability), um mehr über verschiedene Zahlungsszenarien wie [Abos](https://docs.stripe.com/billing/subscriptions/build-subscriptions.md?payment-ui=elements) und andere Stripe-Produkte zu erfahren. > #### Möchten Sie Stripe Tax, Rabatte, Versand oder Währungsumrechnung nutzen? > > Stripe verfügt über eine Integration für das Payment Element, die Steuern, Rabatte, Versand und Währungsumrechnung für Sie verwaltet. Weitere Informationen finden Sie unter [Bezahlvorgangseite erstellen](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 ~~~ ### Stripe Node-Bibliothek installieren Installieren Sie das Paket und importieren Sie es in Ihren Code. Wenn Sie dagegen von Grund auf neu beginnen möchten und eine package.json-Datei benötigen, laden Sie die Projektdateien über den Download-Link im Code-Editor herunter. #### npm Bibliothek installieren: ```bash npm install --save stripe ``` #### GitHub Oder laden Sie den Quellcode der Stripe-Node-Bibliothek direkt von [GitHub](https://github.com/stripe/stripe-node) herunter. ### Stripe-Ruby-Bibliothek installieren Installieren Sie Stripe Ruby Gem und fordern Sie es in Ihrem Code an. Wenn Sie dagegen von Grund auf neu beginnen möchten und eine Gemfile benötigen, laden Sie die Projektdateien über den Download-Link im Code-Editor herunter. #### Terminal Gem installieren: ```bash gem install stripe ``` #### Bundler Fügen Sie diese Zeile in Ihre Gemfile ein: ```bash gem 'stripe' ``` #### GitHub Oder laden Sie den Quellcode von Stripe Ruby Gem direkt von [GitHub](https://github.com/stripe/stripe-ruby) herunter. ### Stripe Java-Bibliothek installieren Fügen Sie Ihrem Build die Abhängigkeit hinzu und importieren Sie die Bibliothek. Wenn Sie dagegen von Grund auf neu beginnen möchten und eine pom.xml-Beispieldatei (für Maven) benötigen, laden Sie die Projektdateien über den Download-Link im Code-Editor herunter. #### Maven Fügen Sie folgende Abhängigkeit zu Ihrer POM-Datei hinzu und ersetzen Sie {VERSION} durch die Versionsnummer, die Sie verwenden möchten. ```bash \ncom.stripe\nstripe-java\n{VERSION}\n ``` #### Gradle Fügen Sie die Abhängigkeit zu Ihrer build.gradle-Datei hinzu und ersetzen Sie {VERSION} durch die Versionsnummer, die Sie verwenden möchten. ```bash implementation "com.stripe:stripe-java:{VERSION}" ``` #### GitHub Laden Sie die JAR-Datei direkt von [GitHub](https://github.com/stripe/stripe-java/releases/latest) herunter. ### Stripe-Python-Paket installieren Installieren Sie das Stripe-Paket und importieren Sie es in Ihren Code. Wenn Sie dagegen von Grund auf neu beginnen möchten und eine requirements.txt-Datei benötigen, laden Sie die Projektdateien über den Download-Link im Code-Editor herunter. #### pip Installieren Sie das Paket über pip: ```bash pip3 install stripe ``` #### GitHub Laden Sie den Quellcode der Stripe-Python-Bibliothek direkt [von GitHub](https://github.com/stripe/stripe-python) herunter. ### Stripe PHP-Bibliothek installieren Installieren Sie die Bibliothek mit Composer und initialisieren Sie sie mit Ihrem geheimen API-Schlüssel. Wenn Sie dagegen von Grund auf neu beginnen möchten und eine composer.csproj-Datei benötigen, laden Sie die Dateien über den Download-Link im Code-Editor herunter. #### Composer Bibliothek installieren: ```bash composer require stripe/stripe-php ``` #### GitHub Oder laden Sie den Quellcode der Stripe-PHP-Bibliothek direkt von [GitHub](https://github.com/stripe/stripe-php) herunter. ### Server einrichten Fügen Sie Ihrem Build die Abhängigkeit hinzu und importieren Sie die Bibliothek. Wenn Sie dagegen von Grund auf neu beginnen möchten und eine go.mod-Datei benötigen, laden Sie die Projektdateien über den Download-Link im Code-Editor herunter. #### Go Nutzen Sie für die Initialisierung Go-Module: ```bash go get -u github.com/stripe/stripe-go/v85 ``` #### GitHub Oder laden Sie den Quellcode des Stripe-Go-Moduls direkt von [GitHub](https://github.com/stripe/stripe-go) herunter. ### Stripe.net-Bibliothek installieren Installieren Sie das Paket mit .NET oder NuGet. Wenn Sie aber von Grund auf neu beginnen möchten, laden Sie die Dateien herunter, die eine konfigurierte .csproj-Datei enthalten. #### dotnet Bibliothek installieren: ```bash dotnet add package Stripe.net ``` #### NuGet Bibliothek installieren: ```bash Install-Package Stripe.net ``` #### GitHub Oder laden Sie den Quellcode der Stripe.net-Bibliothek direkt von [GitHub](https://github.com/stripe/stripe-dotnet) herunter. ### Stripe-Bibliotheken installieren Installieren Sie die Pakete und importieren Sie sie in Ihren Code. Wenn Sie dagegen von Grund auf neu beginnen möchten und eine `package.json`-Datei benötigen, laden Sie die Projektdateien über den Download-Link im Code-Editor herunter. Bibliotheken installieren: ```bash npm install --save stripe @stripe/stripe-js next ``` ### PaymentIntent erstellen Fügen Sie auf Ihrem Server einen Endpoint hinzu, der einen [PaymentIntent](https://docs.stripe.com/api/payment_intents.md) erstellt. Ein PaymentIntent erfasst den Lebenzyklus der Zahlung eines Kunden/einer Kundin, verfolgt alle fehlerhaften Zahlungsversuche und stellt sicher, dass das Kundenkonto nur einmal belastet wird. Geben Sie das *Client-Geheimnis* (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)) des PaymentIntent in der Antwort zurück, um die Zahlung auf dem Client abzuschließen. ### Zahlungsmethoden konfigurieren Stripe aktiviert Karten und andere gängige Zahlungsmethoden standardmäßig mit [dynamischen Zahlungsmethoden](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Sie können Zahlungsmethoden über das [Dashboard](https://dashboard.stripe.com/settings/payment_methods) aktualisieren und konfigurieren, ohne dass Code erforderlich ist. Stripe filtert Zahlungsmethoden nach Eignung und bevorzugten Zahlungsmethoden, sortiert sie dann und zeigt sie nach Wahrscheinlichkeit basierend auf Faktoren wie Betrag, Währung und Käuferstandort an. ### Zahlungsmethoden konfigurieren Stripe aktiviert Karten und andere gängige Zahlungsmethoden standardmäßig mit [dynamischen Zahlungsmethoden](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Sie können Zahlungsmethoden über das [Dashboard](https://dashboard.stripe.com/settings/payment_methods) aktualisieren und konfigurieren, ohne dass Code erforderlich ist. Stripe filtert Zahlungsmethoden nach Eignung und bevorzugten Zahlungsmethoden, sortiert sie dann und zeigt sie nach Wahrscheinlichkeit basierend auf Faktoren wie Betrag, Währung und Käuferstandort an. ### Zahlungsmethoden konfigurieren Stripe aktiviert Karten und andere gängige Zahlungsmethoden standardmäßig mit [dynamischen Zahlungsmethoden](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Sie können Zahlungsmethoden über das [Dashboard](https://dashboard.stripe.com/settings/payment_methods) aktualisieren und konfigurieren, ohne dass Code erforderlich ist. Stripe filtert Zahlungsmethoden nach Eignung und bevorzugten Zahlungsmethoden, sortiert sie dann und zeigt sie nach Wahrscheinlichkeit basierend auf Faktoren wie Betrag, Währung und Käuferstandort an. ### Zahlungsmethoden konfigurieren Stripe aktiviert Karten und andere gängige Zahlungsmethoden standardmäßig mit [dynamischen Zahlungsmethoden](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Sie können Zahlungsmethoden über das [Dashboard](https://dashboard.stripe.com/settings/payment_methods) aktualisieren und konfigurieren, ohne dass Code erforderlich ist. Stripe filtert Zahlungsmethoden nach Eignung und bevorzugten Zahlungsmethoden, sortiert sie dann und zeigt sie nach Wahrscheinlichkeit basierend auf Faktoren wie Betrag, Währung und Käuferstandort an. ### Zahlungsmethoden konfigurieren Stripe aktiviert Karten und andere gängige Zahlungsmethoden standardmäßig mit [dynamischen Zahlungsmethoden](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Sie können Zahlungsmethoden über das [Dashboard](https://dashboard.stripe.com/settings/payment_methods) aktualisieren und konfigurieren, ohne dass Code erforderlich ist. Stripe filtert Zahlungsmethoden nach Eignung und bevorzugten Zahlungsmethoden, sortiert sie dann und zeigt sie nach Wahrscheinlichkeit basierend auf Faktoren wie Betrag, Währung und Käuferstandort an. ### Zahlungsmethoden konfigurieren Stripe aktiviert Karten und andere gängige Zahlungsmethoden standardmäßig mit [dynamischen Zahlungsmethoden](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Sie können Zahlungsmethoden über das [Dashboard](https://dashboard.stripe.com/settings/payment_methods) aktualisieren und konfigurieren, ohne dass Code erforderlich ist. Stripe filtert Zahlungsmethoden nach Eignung und bevorzugten Zahlungsmethoden, sortiert sie dann und zeigt sie nach Wahrscheinlichkeit basierend auf Faktoren wie Betrag, Währung und Käuferstandort an. ### Zahlungsmethoden konfigurieren Stripe aktiviert Karten und andere gängige Zahlungsmethoden standardmäßig mit [dynamischen Zahlungsmethoden](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Sie können Zahlungsmethoden über das [Dashboard](https://dashboard.stripe.com/settings/payment_methods) aktualisieren und konfigurieren, ohne dass Code erforderlich ist. Stripe filtert Zahlungsmethoden nach Eignung und bevorzugten Zahlungsmethoden, sortiert sie dann und zeigt sie nach Wahrscheinlichkeit basierend auf Faktoren wie Betrag, Währung und Käuferstandort an. ### Zahlungsmethoden konfigurieren Stripe aktiviert Karten und andere gängige Zahlungsmethoden standardmäßig mit [dynamischen Zahlungsmethoden](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Sie können Zahlungsmethoden über das [Dashboard](https://dashboard.stripe.com/settings/payment_methods) aktualisieren und konfigurieren, ohne dass Code erforderlich ist. Stripe filtert Zahlungsmethoden nach Eignung und bevorzugten Zahlungsmethoden, sortiert sie dann und zeigt sie nach Wahrscheinlichkeit basierend auf Faktoren wie Betrag, Währung und Käuferstandort an. ### Stripe zur React-App hinzufügen Verwenden Sie *Stripe.js* (Use Stripe.js’ APIs to tokenize customer information, collect sensitive card data, and accept payments with browser payment APIs) und die [Nutzeroberflächen-Bibliothek von Stripe Elements](https://docs.stripe.com/sdks/stripejs-react.md), um die *PCI-Konformität* (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) zu gewährleisten, indem Zahlungsdetails ohne Umweg über Ihren Server direkt an Stripe übermittelt werden. ```bash npm install --save @stripe/react-stripe-js @stripe/stripe-js ``` ### Stripe zur React-App hinzufügen Verwenden Sie *Stripe.js* (Use Stripe.js’ APIs to tokenize customer information, collect sensitive card data, and accept payments with browser payment APIs) und die [Nutzeroberflächen-Bibliothek von Stripe Elements](https://docs.stripe.com/sdks/stripejs-react.md), um die *PCI-Konformität* (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) zu gewährleisten, indem Zahlungsdetails ohne Umweg über Ihren Server direkt an Stripe übermittelt werden. ```bash npm install --save @stripe/react-stripe-js @stripe/stripe-js ``` ### Stripe.js laden Rufen Sie `loadStripe()` mit Ihrem [veröffentlichbaren](https://docs.stripe.com/keys.md#obtain-api-keys) Stripe-API-Schlüssel auf, um die Stripe-Bibliothek zu konfigurieren. ### Stripe.js laden Rufen Sie `loadStripe()` mit Ihrem [veröffentlichbaren](https://docs.stripe.com/keys.md#obtain-api-keys) Stripe-API-Schlüssel auf, um die Stripe-Bibliothek zu konfigurieren. ### Stripe.js laden Verwenden Sie *Stripe.js* (Use Stripe.js’ APIs to tokenize customer information, collect sensitive card data, and accept payments with browser payment APIs), um *PCI-konform* (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) zu bleiben, indem Sie sicherstellen, dass die Zahlungsdaten ohne Umweg über Ihren Server direkt an Stripe gesendet werden. Laden Sie Stripe.js immer von js.stripe.com, um die Konformität zu gewährleisten. Fügen Sie das Skript nicht in ein Paket ein und hosten Sie es nicht selbst. ### Zahlungsformular definieren Fügen Sie für jedes Element, das Sie einfügen möchten, einen leeren Platzhalter `div` in das Bezahlvorgangsformular ein. Stripe fügt einen iFrame in jedes `div` ein, um die E-Mail-Adresse und die Zahlungsinformationen der Kund/innen sicher zu erfassen. ### Stripe.js initialisieren Initialisieren Sie Stripe.js mit Ihren [veröffentlichbaren API-Schlüsseln](https://docs.stripe.com/keys.md#obtain-api-keys). Sie verwenden Stripe.js zum Erstellen Payment Element und das Abschließen der Zahlung auf dem Client. ### PaymentIntent abrufen Weisen Sie den Endpoint auf Ihrem Server an, einen neuen PaymentIntent zu erstellen, sobald die Zahlungsseite geladen wird. Das vom Endpoint zurückgegebene `clientSecret` wird zum Abschließen der Zahlung verwendet. ### Stripe Elements initialisieren Übergeben Sie das „Promise“ von `loadStripe` an den Elements-Provider. Dadurch können die untergeordneten Komponenten über „ElementsConsumer“ auf den Stripe-Dienst zugreifen. Übergeben Sie zusätzlich das Client-Geheimnis an den Elements-Anbieter. ### Stripe Elements initialisieren Übergeben Sie das „Promise“ von `loadStripe` an den Elements-Provider. Dadurch können die untergeordneten Komponenten über „ElementsConsumer“ auf den Stripe-Dienst zugreifen. Übergeben Sie zusätzlich das Client-Geheimnis an den Elements-Anbieter. ### Stripe Elements initialisieren Initialisieren Sie die [Nutzeroberflächenbibliothek von Stripe Elements](https://docs.stripe.com/js/elements_object/create). Elements verwaltet die Nutzeroberflächenkomponenten, die Sie zur Erfassung von Zahlungsdetails benötigen. ### Status einrichten Initialisieren Sie einige Status, um die Zahlung zu verfolgen, Fehler anzuzeigen und die Nutzeroberfläche zu verwalten. ### Status einrichten Initialisieren Sie einige Status, um die Zahlung zu verfolgen, Fehler anzuzeigen und die Nutzeroberfläche zu verwalten. ### Verweis auf Stripe speichern Greifen Sie auf die Stripe-Bibliothek in Ihrer CheckoutForm-Komponente zu, indem Sie die Hooks `useStripe()` und `useElements()` verwenden. Wenn Sie über eine Klassenkomponente auf Elements zugreifen müssen, verwenden Sie stattdessen [ElementsConsumer](https://docs.stripe.com/sdks/stripejs-react.md#elements-consumer). ### Verweis auf Stripe speichern Greifen Sie auf die Stripe-Bibliothek in Ihrer CheckoutForm-Komponente zu, indem Sie die Hooks `useStripe()` und `useElements()` verwenden. Wenn Sie über eine Klassenkomponente auf Elements zugreifen müssen, verwenden Sie stattdessen [ElementsConsumer](https://docs.stripe.com/sdks/stripejs-react.md#elements-consumer). ### PaymentElement hinzufügen Fügen Sie [PaymentElement](https://docs.stripe.com/js/elements_object/create_payment_element) zu Ihrem Zahlungsformular hinzu. Damit wird ein iFrame mit einem dynamischen Formular eingebettet, das die Zahlungsdaten für eine Vielzahl von Zahlungsmethoden sammelt. Ihre Kundinnen/Kunden wählen einfach die gewünschte Zahlungsart aus und das Formular erfasst automatisch alle notwendigen Zahlungsdetails. ### PaymentElement hinzufügen Fügen Sie das [PaymentElement](https://docs.stripe.com/js/elements_object/create_payment_element) zu Ihrem Zahlungsformular hinzu. Damit wird ein iframe mit einem dynamischen Formular eingebettet und die Zahlungsdaten für eine Vielzahl von Zahlungsmethoden werden gesammelt. Ihre Kundinnen/Kunden wählen einfach die gewünschte Zahlungsart aus und das Formular erfasst automatisch alle notwendigen Zahlungsdetails. ### Das PaymentElement erstellen Erstellen Sie ein [PaymentElement](https://docs.stripe.com/js/elements_object/create_payment_element) und verbinden es mit dem Platzhalter `
` in Ihrem Zahlungsformular. Dadurch wird ein iFrame mit einem dynamischen Formular integriert, das konfigurierte Zahlungsmethodentypen anzeigt, die vom PaymentIntent verfügbar sind. Kundinnen/Kunden wählen dann die gewünschte Zahlungsmethode aus und das Formular erfasst automatisch die zugehörigen Zahlungsdetails. ### (Optional) Payment Element anpassen Passen Sie die Nutzeroberfläche der Zahlungselemente an, indem Sie ein [Erscheinungsbild-Objekt](https://docs.stripe.com/elements/appearance-api.md) erstellen und es als Option an den Elements-Provider übergeben. Verwenden Sie das Farbschema und die Schriftart Ihres Unternehmens, um es an den Rest Ihrer Checkout-Seite anzupassen. Verwenden Sie nutzerdefinierte Schriftarten (zum Beispiel von Google Fonts), indem Sie die Elemente mit einem [Schriftarten-Set](https://docs.stripe.com/js/elements_object/create#stripe_elements-options-fonts) initialisieren. Vergessen Sie nicht, rechts eine Vorschau anzuzeigen, um Ihre Änderungen live zu sehen. > Teile der Vorschau-Demo stimmen möglicherweise nicht mit Ihrer tatsächlichen Checkout-Seite überein. Die obigen Einstellungen stellen nur eine Teilmenge der Variablen des [Erscheinungsbild-Objekts](https://docs.stripe.com/elements/appearance-api.md) dar und das [Erscheinungsbild-Objekt](https://docs.stripe.com/elements/appearance-api.md) steuert nur bestimmte Attribute der Stripe-Elemente. Sie sind für die Gestaltung der restlichen Checkout-Seite verantwortlich. ### (Optional) Payment Element anpassen Passen Sie die Nutzeroberfläche der Zahlungselemente an, indem Sie ein [Erscheinungsbild-Objekt](https://docs.stripe.com/elements/appearance-api.md) erstellen und es als Option an den Elements-Provider übergeben. Verwenden Sie das Farbschema und die Schriftart Ihres Unternehmens, um es an den Rest Ihrer Checkout-Seite anzupassen. Verwenden Sie nutzerdefinierte Schriftarten (zum Beispiel von Google Fonts), indem Sie die Elemente mit einem [Schriftarten-Set](https://docs.stripe.com/js/elements_object/create#stripe_elements-options-fonts) initialisieren. Vergessen Sie nicht, rechts eine Vorschau anzuzeigen, um Ihre Änderungen live zu sehen. > Teile der Vorschau-Demo stimmen möglicherweise nicht mit Ihrer tatsächlichen Bezahlseite überein. Die obigen Einstellungen stellen nur eine Teilmenge der Variablen des Appearance-Objekts dar, und das Appearance-Objekt steuert nur bestimmte Attribute von Stripe Elements. Für die Gestaltung der restlichen Bezahlseite sind Sie verantwortlich. ### (Optional) Payment Element anpassen Passen Sie die Nutzeroberfläche der Zahlungselemente an, indem Sie ein [Erscheinungsbild-Objekt](https://docs.stripe.com/elements/appearance-api.md) erstellen und die Elemente damit initialisieren. Verwenden Sie das Farbschema und die Schriftart Ihres Unternehmens, um es an den Rest Ihrer Checkout-Seite anzupassen. Verwenden Sie nutzerdefinierte Schriftarten (zum Beispiel von Google Fonts), indem Sie die Elemente mit einem [Schriftarten-Set](https://docs.stripe.com/js/elements_object/create#stripe_elements-options-fonts) initialisieren. Vergessen Sie nicht, rechts eine Vorschau anzuzeigen, um Ihre Änderungen live zu sehen. > Teile der Vorschau-Demo stimmen möglicherweise nicht mit Ihrer tatsächlichen Checkout-Seite überein. Die obigen Einstellungen stellen nur eine Teilmenge der Variablen des [Erscheinungsbild-Objekts](https://docs.stripe.com/elements/appearance-api.md) dar und das [Erscheinungsbild-Objekt](https://docs.stripe.com/elements/appearance-api.md) steuert nur bestimmte Attribute der Stripe-Elemente. Sie sind für die Gestaltung der restlichen Checkout-Seite verantwortlich. ### Übermittlungsereignis verarbeiten Auf die Übermittlung des Formulars warten, um zu wissen, wann die Zahlung über die Stripe-API bestätigt werden kann. ### Zahlung abschließen Wenn Ihre Kundin/Ihr Kunde auf die Bezahlen-Schaltfläche klickt, rufen Sie [confirmPayment](https://docs.stripe.com/js/payment_intents/confirm_payment) mit dem PaymentElement auf und übergeben eine [return_url](https://docs.stripe.com/api/payment_intents/create.md#create_payment_intent-return_url), um anzugeben, wohin Stripe die Kundin/den Kunden nach Abschluss der Zahlung weiterleitet. Bei Zahlungen, die eine Authentifizierung erfordern, zeigt Stripe ein Modal für die *3D Secure* (3D Secure (3DS) provides an additional layer of authentication for credit card transactions that protects businesses from liability for fraudulent card payments)-Authentifizierung an oder leitet die Kundin/den Kunden je nach Zahlungsmethode auf eine Authentifizierungsseite weiter. Nach Abschluss des Authentifizierungsprozesses wird die Kundin/der Kunde zur `return_url` weitergeleitet. ### Zahlung abschließen Wenn Ihre Kundin/Ihr Kunde auf die Bezahlen-Schaltfläche klickt, rufen Sie [confirmPayment](https://docs.stripe.com/js/payment_intents/confirm_payment) mit dem PaymentElement auf und übergeben eine [return_url](https://docs.stripe.com/api/payment_intents/create.md#create_payment_intent-return_url), um anzugeben, wohin Stripe die Kundin/den Kunden nach Abschluss der Zahlung weiterleitet. Bei Zahlungen, die eine Authentifizierung erfordern, zeigt Stripe ein Modal für die *3D Secure* (3D Secure (3DS) provides an additional layer of authentication for credit card transactions that protects businesses from liability for fraudulent card payments)-Authentifizierung an oder leitet die Kundin/den Kunden je nach Zahlungsmethode auf eine Authentifizierungsseite weiter. Nach Abschluss des Authentifizierungsprozesses wird die Kundin/der Kunde zur `return_url` weitergeleitet. ### Zahlung abschließen Rufen Sie [confirmPayment](https://docs.stripe.com/js/payment_intents/confirm_payment) mit der Element-Instanz und einer [return_url](https://docs.stripe.com/api/payment_intents/create.md#create_payment_intent-return_url) auf, um anzugeben, wohin Stripe die Kundin/den Kunden nach Abschluss der Zahlung weiterleitet. Bei Zahlungen, die eine Authentifizierung erfordern, zeigt Stripe ein Modal für die *3D Secure* (3D Secure (3DS) provides an additional layer of authentication for credit card transactions that protects businesses from liability for fraudulent card payments)-Authentifizierung an oder leitet die Kundin/den Kunden je nach Zahlungsmethode auf eine Authentifizierungsseite weiter. Nach Abschluss des Authentifizierungsprozesses wird die Kundin/der Kunde zur `return_url` weitergeleitet. ### Umgang mit Fehlern Wenn unmittelbar [Fehler](https://docs.stripe.com/error-codes.md) auftreten (z. B. die Karte einer Kundin/eines Kunden wird abgelehnt), gibt Stripe.js einen Fehler zurück. Lassen Sie diese Fehlermeldung Ihrer Kundin/Ihrem Kunden anzeigen, damit ein neuer Versuch unternommen werden kann. ### Zahlungsstatusmeldung anzeigen Wenn Stripe den Kunden/die Kundin zur `return_url` umleitet, hängt Stripe.js den Abfrageparameter `payment_intent_client_secret` an. Verwenden Sie diesen, um das [PaymentIntent-Statusupdate](https://docs.stripe.com/payments/payment-intents/verifying-status.md) abzurufen und festzulegen, was Ihren Kunden/Kundinnen angezeigt werden soll. ### Zahlungsstatusmeldung anzeigen Wenn Stripe Kundinnen/Kunden an die `return_url` weiterleitet, fügt Stripe.js den Abfrageparameter `payment_intent`hinzu. Verwenden Sie dies, um das [PaymentIntent-Statusupdate](https://docs.stripe.com/payments/payment-intents/verifying-status.md) abzurufen und festzulegen, was Ihren Kunden/Kundinnen angezeigt werden soll. ### Webhook verwenden Stripe sendet beim Zahlungsvorgang und nach erfolgter Zahlung mehrere Ereignisse. Erstellen Sie ein [Ereignisziel](https://docs.stripe.com/event-destinations.md) für einen [Webhook-Endpoint](https://docs.stripe.com/webhooks/quickstart.md), um diese Ereignisse zu empfangen und Aktionen auszuführen. Dazu zählen beispielsweise das Senden einer Bestellbestätigung per E-Mail, das Protokollieren des Verkaufs in der Datenbank oder das Starten eines Versand-Workflows. Stripe empfiehlt die Verarbeitung der Ereignisse [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) und [payment_intent.payment_failed](https://docs.stripe.com/api/events/types.md?lang=php#event_types-payment_intent.payment_failed). Überwachen Sie diese Ereignisse, statt auf einen Callback vom Client zu warten. Auf dem Client könnte der/die Kund/in das Browserfenster schließen oder die App beenden, bevor der Callback erfolgt ist und böswillige Clients könnten die Antwort manipulieren. Wenn Sie Ihre Integration so einrichten, dass sie auf asynchrone Ereignisse wartet, können Sie [verschiedene Arten von Zahlungsmethoden](https://stripe.com/payments/payment-methods-guide) mit einer einzelnen Integration akzeptieren. ### Anwendung ausführen Führen Sie die React-App und den Server aus. Gehen Sie zu [localhost:3000/checkout](http://localhost:3000/checkout), um Ihre Zahlungsseite zu sehen. ```bash npm start ``` ### Anwendung ausführen Führen Sie die Next.js-App aus. Gehen Sie zu [localhost:3000](http://localhost:3000), um Ihre Zahlungsseite zu sehen. ```bash npm run dev ``` ### Anwendung ausführen Führen Sie Ihren Node-Server aus und gehen Sie zu [localhost:4242/checkout.html](http://localhost:4242/checkout.html). ```bash npm start ``` ### Serveranwendung ausführen Führen Sie die React-App und den Server aus. Gehen Sie zu [localhost:3000/checkout](http://localhost:3000/checkout), um Ihre Zahlungsseite zu sehen. ```bash ruby server.rb ``` ### Anwendung ausführen Führen Sie Ihren Ruby-Server aus und gehen Sie zu [localhost:4242/checkout.html](http://localhost:4242/checkout.html). ```bash ruby server.rb ``` ### Serveranwendung ausführen Führen Sie die React-App und den Server aus. Gehen Sie zu [localhost:3000/checkout](http://localhost:3000/checkout), um Ihre Zahlungsseite zu sehen. ```bash python3 -m flask run --port=4242 ``` ### Anwendung ausführen Führen Sie Ihren Python-Server aus und gehen Sie zu [localhost:4242/checkout.html](http://localhost:4242/checkout.html). ```bash python3 -m flask run --port=4242 ``` ### Serveranwendung ausführen Führen Sie die React-App und den Server aus. Gehen Sie zu [localhost:3000/checkout](http://localhost:3000/checkout), um Ihre Zahlungsseite zu sehen. ```bash php -S 127.0.0.1:4242 --docroot=public ``` ### Anwendung ausführen Führen Sie Ihren Server aus und gehen Sie zu [localhost:4242/checkout.html](http://localhost:4242/checkout.html). ```bash php -S 127.0.0.1:4242 --docroot=public ``` ### Serveranwendung ausführen Führen Sie die React-App und den Server aus. Gehen Sie zu [localhost:3000/checkout](http://localhost:3000/checkout), um Ihre Zahlungsseite zu sehen. ```bash go run server.go ``` ### Anwendung ausführen Führen Sie Ihren Go-Server aus und gehen Sie zu [localhost:4242/checkout.html](http://localhost:4242/checkout.html). ```bash go run server.go ``` ### Serveranwendung ausführen Führen Sie die React-App und den Server aus. Gehen Sie zu [localhost:3000/checkout](http://localhost:3000/checkout), um Ihre Zahlungsseite zu sehen. ```bash dotnet run ``` ### Anwendung ausführen Führen Sie Ihren ASP.NET MVC-Server aus und gehen Sie zu [localhost:4242/checkout.html](http://localhost:4242/checkout.html). ```bash dotnet run ``` ### Anwendung ausführen Führen Sie Ihren Server aus und gehen Sie zu [localhost:4242/checkout.html](http://localhost:4242/checkout.html). ```bash java -cp target/sample-jar-with-dependencies.jar com.stripe.sample.Server ``` ### Serveranwendung ausführen Führen Sie die React-App und den Server aus. Gehen Sie zu [localhost:3000/checkout](http://localhost:3000/checkout), um Ihre Zahlungsseite zu sehen. ```bash java -cp target/sample-jar-with-dependencies.jar com.stripe.sample.Server ``` ### Anwendung ausführen Führen Sie die React-App aus und gehen Sie zu [localhost:3000/checkout](http://localhost:3000/checkout). ```bash npm start ``` ### Testzahlung durchführen Um zu überprüfen, ob Ihre Integration funktioniert, führen Sie eine Testzahlung mit [Testzahlungsdetails](https://docs.stripe.com/payments/accept-a-payment.md?payment-ui=elements&api-integration=paymentintents#web-test-the-integration) durch. ### Ihre Zahlung im Dashboard anzeigen Rufen Sie das [Stripe Dashboard](https://dashboard.stripe.com/test/payments) auf, um Ihre Testzahlung anzuzeigen. ## Akzeptieren Sie Zahlungen und optimieren Sie Ihre Integration Sie können jetzt Zahlungen mit Stripe akzeptieren. Fahren Sie mit den folgenden Schritten fort, um weitere Funktionen hinzuzufügen. ### Steuereinzug automatisieren Berechnen und erheben Sie den richtigen Steuerbetrag für Ihre Stripe-Transaktionen. Bevor Sie Stripe Tax verwenden können, müssen Sie die Funktion im [Dashboard](https://dashboard.stripe.com/tax) aktivieren. Erfahren Sie mehr über [Stripe Tax](https://docs.stripe.com/tax.md) und [wie die Funktion zu Ihrer Payments-Integration hinzugefügt werden kann](https://docs.stripe.com/tax/custom.md). ### Mit der Stripe Tax API Steuern berechnen Mit der [Stripe Tax API](https://docs.stripe.com/api/tax/calculations/create.md) können Sie die Steuer für die Transaktion berechnen. Geben Sie `currency`, `customer_details` und `line_items` der Bestellung im Anfragetext an. Verwenden Sie das Attribut `tax_amount_exclusive` der resultierenden Steuerberechnung, um den Steuerbetrag zum Gesamtbetrag der Bestellung hinzuzufügen. ### Steuertransaktion bei erfolgreicher Zahlung aufzeichnen Verbinden Sie die Steuerberechnung über `hooks[inputs][tax][calculation]` mit dem PaymentIntent. Hier werden die in Ihrem Stripe-Konto gesammelten Steuern erfasst, die Sie später für Buchhaltungszwecke exportieren können und andere [Stripe-Aktionen](https://docs.stripe.com/tax/payment-intent.md#automatic-actions) ausgelöst. ### E-Mail-Bestätigung senden Stripe kann eine E-Mail-Bestätigung mit Ihrem Markenlogo und Farbdesign an Ihre Kund/innen senden. Diese können im [Dashboard](https://dashboard.stripe.com/settings/branding) konfiguriert werden. ### E-Mail-Adresse der Kund/innen erfassen Fügen Sie Ihrem Zahlungsformular ein Eingabefeld zur Erfassung der E-Mail-Adresse hinzu. ### E-Mail-Adresse zum Status hinzufügen Fügen Sie eine Variable hinzu, um die von den Kund/innen eingegebene E-Mail-Adresse zu verfolgen. ### E-Mail-Adresse zum Status hinzufügen Fügen Sie eine Variable hinzu, um die von den Kund/innen eingegebene E-Mail-Adresse zu verfolgen. ### Stripe die E-Mail-Adresse bereitstellen Übergeben Sie die angegebene E-Mail-Adresse als `receipt_email`-Wert. Stripe sendet eine E-Mail-Bestätigung im Live-Modus, wenn die Zahlung erfolgreich war (in einer *Sandbox* (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) wird jedoch keine Bestätigung gesendet). ### Zahlungsdetails nach Zahlung speichern Wird oft von SaaS- oder E-Commerce-Unternehmen mit wiederkehrenden Kund/innen verwendet. ### Zusätzliche Stripe-Ressourcen importieren Importieren Sie die Stripe-Pakete `customer` und `paymentmethod`. Mithilfe dieser Pakete können Sie Informationen über Ihre Kund/innen speichern. ### Zusätzliche Stripe-Ressourcen importieren Importieren Sie die Stripe-Modelle „PaymentMethod“ und „Customer“. Mithilfe dieser Modelle können Sie Informationen über Ihre Kund/innen speichern. ### Kund/innen erstellen Stripe speichert die Karte in einem *Customer* (Customer objects represent customers of your business. They let you reuse payment methods and give you the ability to track multiple payments)-Objekt. Erstellen Sie eine neue Kundin/einen neuen Kunden, bevor Sie einen PaymentIntent erstellen. Sie können auch Name, E-Mail-Adresse, Versandadresse und andere Angaben zu Kund/innen speichern. ### Kund/innen erstellen Stripe speichert die Karte in einem [Konto](https://docs.stripe.com/api/v2/core/accounts/object.md)-Objekt, das die [Kundin/den Kunden](https://docs.stripe.com/connect/account-capabilities.md?accounts-namespace=v2#customer) darstellt. Erstellen Sie ein neues Konto, bevor Sie einen PaymentIntent erstellen. Sie können auch Name, E-Mail-Adresse, Versandadresse und andere Angaben zu Kundinnen/Kunden speichern. ### Kundin/Kunde zum PaymentIntent hinzufügen Übergeben Sie die Customer-ID an den PaymentIntent und setzen Sie `setup_future_usage` auf `off_session`. `setup_future_usage` teilt Stripe mit, wie Sie vorhaben, die Zahlungsmethode zu verwenden – in bestimmten Regionen wie Europa und Indien gelten spezielle Vorgaben für die Wiederverwendung von Zahlungsdetails. [Erfahren Sie mehr](https://docs.stripe.com/payments/payment-intents.md#future-usage) über die effektivste Methode zur Anwendung von `setup_future_usage`. Sie können auch eine [Liste der unterstützten Zahlungsmethoden](https://docs.stripe.com/payments/payment-methods/payment-method-support.md#additional-api-supportability) anzeigen. Nach einem erfolgreichen PaymentIntent [hängt](https://docs.stripe.com/api/payment_methods/attach.md) Stripe die Zahlungsdetails (in einem *PaymentMethod* (PaymentMethods represent your customer's payment instruments, used with the Payment Intents or Setup Intents APIs)-Objekt) automatisch an Ihre Kundin/Ihren Kunden an. ### Kundin/Kunde zum PaymentIntent hinzufügen Übergeben Sie die Konto-ID an das PaymentIntent und setzen Sie `setup_future_usage` auf `off_session`. `setup_future_usage` gibt Stripe an, wie Sie die Zahlungsmethode verwenden möchten – bestimmte Regionen, wie Europa und Indien, haben Anforderungen für die Wiederverwendung von Zahlungsdaten. [Erfahren Sie mehr](https://docs.stripe.com/payments/payment-intents.md#future-usage) über die effektivste Anwendung von `setup_future_usage`. Sie können auch eine [Liste der unterstützten Zahlungsmethoden](https://docs.stripe.com/payments/payment-methods/payment-method-support.md#additional-api-supportability) einsehen. Nachdem das PaymentIntent erfolgreich war, [hängt](https://docs.stripe.com/api/payment_methods/attach.md) Stripe die Zahlungsdaten automatisch (in einem *PaymentMethod* (PaymentMethods represent your customer's payment instruments, used with the Payment Intents or Setup Intents APIs)-Objekt) an das von der Kundin/vom Kunden konfigurierte Konto an. ### Gespeicherte PaymentMethod belasten Wenn die PaymentMethod erneut belastet werden soll, erstellen Sie einen neuen PaymentIntent mit der Customer-ID und der PaymentMethod-ID und setzen Sie die Flags `off_session` und `confirm` auf „true“. ### Stripe Node-Bibliothek installieren Installieren Sie das Paket und importieren Sie es in Ihren Code. Wenn Sie dagegen von Grund auf neu beginnen möchten und eine package.json-Datei benötigen, laden Sie die Projektdateien über den Download-Link im Code-Editor herunter. #### npm Bibliothek installieren: ```bash npm install --save stripe ``` #### GitHub Oder laden Sie den Quellcode der Stripe-Node-Bibliothek direkt von [GitHub](https://github.com/stripe/stripe-node) herunter. ### Stripe-Ruby-Bibliothek installieren Installieren Sie Stripe Ruby Gem und fordern Sie es in Ihrem Code an. Wenn Sie dagegen von Grund auf neu beginnen möchten und eine Gemfile benötigen, laden Sie die Projektdateien über den Download-Link im Code-Editor herunter. #### Terminal Gem installieren: ```bash gem install stripe ``` #### Bundler Fügen Sie diese Zeile in Ihre Gemfile ein: ```bash gem 'stripe' ``` #### GitHub Oder laden Sie den Quellcode von Stripe Ruby Gem direkt von [GitHub](https://github.com/stripe/stripe-ruby) herunter. ### Stripe Java-Bibliothek installieren Fügen Sie Ihrem Build die Abhängigkeit hinzu und importieren Sie die Bibliothek. Wenn Sie dagegen von Grund auf neu beginnen möchten und eine pom.xml-Beispieldatei (für Maven) benötigen, laden Sie die Projektdateien über den Download-Link im Code-Editor herunter. #### Maven Fügen Sie folgende Abhängigkeit zu Ihrer POM-Datei hinzu und ersetzen Sie {VERSION} durch die Versionsnummer, die Sie verwenden möchten. ```bash \ncom.stripe\nstripe-java\n{VERSION}\n ``` #### Gradle Fügen Sie die Abhängigkeit zu Ihrer build.gradle-Datei hinzu und ersetzen Sie {VERSION} durch die Versionsnummer, die Sie verwenden möchten. ```bash implementation "com.stripe:stripe-java:{VERSION}" ``` #### GitHub Laden Sie die JAR-Datei direkt von [GitHub](https://github.com/stripe/stripe-java/releases/latest) herunter. ### Stripe-Python-Paket installieren Installieren Sie das Stripe-Paket und importieren Sie es in Ihren Code. Wenn Sie dagegen von Grund auf neu beginnen möchten und eine requirements.txt-Datei benötigen, laden Sie die Projektdateien über den Download-Link im Code-Editor herunter. #### pip Installieren Sie das Paket über pip: ```bash pip3 install stripe ``` #### GitHub Laden Sie den Quellcode der Stripe-Python-Bibliothek direkt [von GitHub](https://github.com/stripe/stripe-python) herunter. ### Stripe PHP-Bibliothek installieren Installieren Sie die Bibliothek mit Composer und initialisieren Sie sie mit Ihrem geheimen API-Schlüssel. Wenn Sie dagegen von Grund auf neu beginnen möchten und eine composer.csproj-Datei benötigen, laden Sie die Dateien über den Download-Link im Code-Editor herunter. #### Composer Bibliothek installieren: ```bash composer require stripe/stripe-php ``` #### GitHub Oder laden Sie den Quellcode der Stripe-PHP-Bibliothek direkt von [GitHub](https://github.com/stripe/stripe-php) herunter. ### Server einrichten Fügen Sie Ihrem Build die Abhängigkeit hinzu und importieren Sie die Bibliothek. Wenn Sie dagegen von Grund auf neu beginnen möchten und eine go.mod-Datei benötigen, laden Sie die Projektdateien über den Download-Link im Code-Editor herunter. #### Go Nutzen Sie für die Initialisierung Go-Module: ```bash go get -u github.com/stripe/stripe-go/v85 ``` #### GitHub Oder laden Sie den Quellcode des Stripe-Go-Moduls direkt von [GitHub](https://github.com/stripe/stripe-go) herunter. ### Stripe.net-Bibliothek installieren Installieren Sie das Paket mit .NET oder NuGet. Wenn Sie aber von Grund auf neu beginnen möchten, laden Sie die Dateien herunter, die eine konfigurierte .csproj-Datei enthalten. #### dotnet Bibliothek installieren: ```bash dotnet add package Stripe.net ``` #### NuGet Bibliothek installieren: ```bash Install-Package Stripe.net ``` #### GitHub Oder laden Sie den Quellcode der Stripe.net-Bibliothek direkt von [GitHub](https://github.com/stripe/stripe-dotnet) herunter. ### Stripe-Bibliotheken installieren Installieren Sie die Pakete und importieren Sie sie in Ihren Code. Wenn Sie dagegen von Grund auf neu beginnen möchten und eine `package.json`-Datei benötigen, laden Sie die Projektdateien über den Download-Link im Code-Editor herunter. Bibliotheken installieren: ```bash npm install --save stripe @stripe/stripe-js next ``` ### PaymentIntent erstellen Fügen Sie auf Ihrem Server einen Endpoint hinzu, der einen [PaymentIntent](https://docs.stripe.com/api/payment_intents.md) erstellt. Ein PaymentIntent erfasst den Lebenzyklus der Zahlung eines Kunden/einer Kundin, verfolgt alle fehlerhaften Zahlungsversuche und stellt sicher, dass das Kundenkonto nur einmal belastet wird. Geben Sie das *Client-Geheimnis* (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)) des PaymentIntent in der Antwort zurück, um die Zahlung auf dem Client abzuschließen. ### Zahlungsmethoden konfigurieren Stripe aktiviert Karten und andere gängige Zahlungsmethoden standardmäßig mit [dynamischen Zahlungsmethoden](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Sie können Zahlungsmethoden über das [Dashboard](https://dashboard.stripe.com/settings/payment_methods) aktualisieren und konfigurieren, ohne dass Code erforderlich ist. Stripe filtert Zahlungsmethoden nach Eignung und bevorzugten Zahlungsmethoden, sortiert sie dann und zeigt sie nach Wahrscheinlichkeit basierend auf Faktoren wie Betrag, Währung und Käuferstandort an. ### Zahlungsmethoden konfigurieren Stripe aktiviert Karten und andere gängige Zahlungsmethoden standardmäßig mit [dynamischen Zahlungsmethoden](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Sie können Zahlungsmethoden über das [Dashboard](https://dashboard.stripe.com/settings/payment_methods) aktualisieren und konfigurieren, ohne dass Code erforderlich ist. Stripe filtert Zahlungsmethoden nach Eignung und bevorzugten Zahlungsmethoden, sortiert sie dann und zeigt sie nach Wahrscheinlichkeit basierend auf Faktoren wie Betrag, Währung und Käuferstandort an. ### Zahlungsmethoden konfigurieren Stripe aktiviert Karten und andere gängige Zahlungsmethoden standardmäßig mit [dynamischen Zahlungsmethoden](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Sie können Zahlungsmethoden über das [Dashboard](https://dashboard.stripe.com/settings/payment_methods) aktualisieren und konfigurieren, ohne dass Code erforderlich ist. Stripe filtert Zahlungsmethoden nach Eignung und bevorzugten Zahlungsmethoden, sortiert sie dann und zeigt sie nach Wahrscheinlichkeit basierend auf Faktoren wie Betrag, Währung und Käuferstandort an. ### Zahlungsmethoden konfigurieren Stripe aktiviert Karten und andere gängige Zahlungsmethoden standardmäßig mit [dynamischen Zahlungsmethoden](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Sie können Zahlungsmethoden über das [Dashboard](https://dashboard.stripe.com/settings/payment_methods) aktualisieren und konfigurieren, ohne dass Code erforderlich ist. Stripe filtert Zahlungsmethoden nach Eignung und bevorzugten Zahlungsmethoden, sortiert sie dann und zeigt sie nach Wahrscheinlichkeit basierend auf Faktoren wie Betrag, Währung und Käuferstandort an. ### Zahlungsmethoden konfigurieren Stripe aktiviert Karten und andere gängige Zahlungsmethoden standardmäßig mit [dynamischen Zahlungsmethoden](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Sie können Zahlungsmethoden über das [Dashboard](https://dashboard.stripe.com/settings/payment_methods) aktualisieren und konfigurieren, ohne dass Code erforderlich ist. Stripe filtert Zahlungsmethoden nach Eignung und bevorzugten Zahlungsmethoden, sortiert sie dann und zeigt sie nach Wahrscheinlichkeit basierend auf Faktoren wie Betrag, Währung und Käuferstandort an. ### Zahlungsmethoden konfigurieren Stripe aktiviert Karten und andere gängige Zahlungsmethoden standardmäßig mit [dynamischen Zahlungsmethoden](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Sie können Zahlungsmethoden über das [Dashboard](https://dashboard.stripe.com/settings/payment_methods) aktualisieren und konfigurieren, ohne dass Code erforderlich ist. Stripe filtert Zahlungsmethoden nach Eignung und bevorzugten Zahlungsmethoden, sortiert sie dann und zeigt sie nach Wahrscheinlichkeit basierend auf Faktoren wie Betrag, Währung und Käuferstandort an. ### Zahlungsmethoden konfigurieren Stripe aktiviert Karten und andere gängige Zahlungsmethoden standardmäßig mit [dynamischen Zahlungsmethoden](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Sie können Zahlungsmethoden über das [Dashboard](https://dashboard.stripe.com/settings/payment_methods) aktualisieren und konfigurieren, ohne dass Code erforderlich ist. Stripe filtert Zahlungsmethoden nach Eignung und bevorzugten Zahlungsmethoden, sortiert sie dann und zeigt sie nach Wahrscheinlichkeit basierend auf Faktoren wie Betrag, Währung und Käuferstandort an. ### Zahlungsmethoden konfigurieren Stripe aktiviert Karten und andere gängige Zahlungsmethoden standardmäßig mit [dynamischen Zahlungsmethoden](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Sie können Zahlungsmethoden über das [Dashboard](https://dashboard.stripe.com/settings/payment_methods) aktualisieren und konfigurieren, ohne dass Code erforderlich ist. Stripe filtert Zahlungsmethoden nach Eignung und bevorzugten Zahlungsmethoden, sortiert sie dann und zeigt sie nach Wahrscheinlichkeit basierend auf Faktoren wie Betrag, Währung und Käuferstandort an. ### SDK installieren Das Stripe iOS SDK ist [Open Source](https://github.com/stripe/stripe-ios), [vollständig dokumentiert](https://stripe.dev/stripe-ios/) und mit allen Apps kompatibel, die iOS 13 oder höher unterstützen. Importieren Sie das Stripe-SDK in die Ansichtssteuerung Ihrer Bezahlseite. #### Swift Package Manager Wählen Sie in Xcode **Datei** > **Add Package Dependencies** (Paketabhängigkeiten hinzufügen) aus und geben Sie `https://github.com/stripe/stripe-ios-spm` als Repository-URL ein. Wählen Sie die neueste Versionsnummer auf unserer [Veröffentlichungsseite](https://github.com/stripe/stripe-ios/releases) aus und fügen Sie das Modul `StripePaymentSheet` zum Ziel Ihrer App hinzu. #### CocoaPods Fügen Sie diese Zeile in Ihre Podfile ein und verwenden Sie ab jetzt anstelle der Datei „.xcodeproj“ die Datei „.xcworkspace“ zum Öffnen Ihres Projekts in Xcode. ```bash pod 'StripePaymentSheet' ``` #### Carthage Fügen Sie diese Zeile in Ihre Cartfile ein. ```bash github "stripe/stripe-ios" ``` #### Manuelles Framework Um Stripe in Ihr Projekt einzubinden, laden Sie „Stripe.framework.zip“ aus einer [Veröffentlichung auf GitHub](https://github.com/stripe/stripe-ios/releases) herunter. Ziehen Sie die erforderlichen xcframwork-Dateien in den Abschnitt “Embedded Binaries” (Eingebettete Binärdateien) der Einstellungen Ihres Xcode-Projekts. Aktivieren Sie dabei die Option “Copy items if needed” (Elemente kopieren, falls nötig). ### SDK einrichten Konfigurieren Sie das Stripe SDK mit Ihrem [veröffentlichbaren API-Schlüssel](https://docs.stripe.com/keys.md#obtain-api-keys). Die Hardcodierung des veröffentlichbaren API-Schlüssels im SDK dient nur zur Veranschaulichung. In einer Produktions-App müssen Sie den API-Schlüssel von Ihrem Server abrufen. ### PaymentIntent abrufen Fordern Sie bei Ihrem Server einen PaymentIntent an, sobald die Ansicht geladen wird. Speichern Sie einen Verweis auf das vom Server zurückgegebene *Client-Geheimnis* (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)) des PaymentIntent. Im Zahlungsformular wird dieser geheime Schlüssel später zur Durchführung der Zahlung verwendet. ### Zahlungsformular konfigurieren und anzeigen Erstellen Sie eine Instanz von `PaymentSheet` unter Verwendung des zuvor abgerufenen Client-Geheimnisses, und zeigen Sie sie von Ihrer Ansichtssteuerung aus an. Verwenden Sie die Struktur `PaymentSheet.Configuration`, um das Zahlungsformular [anzupassen](https://stripe.dev/stripe-ios/stripe-paymentsheet/Classes/PaymentSheet/Configuration.html). ### Zahlungsergebnis verarbeiten Verwenden Sie den Abschlussblock zur Verarbeitung des Zahlungsergebnisses. Wenn die Zahlung mit einem [Fehler](https://docs.stripe.com/error-codes.md) fehlschlägt, zeigen Sie Ihren Kundinnen/Kunden die entsprechende Meldung an, sodass sie entsprechende Maßnahmen ergreifen und es erneut versuchen können. Wenn kein Fehler aufgetreten ist, teilen Sie Ihren Kundinnen/Kunden mit, dass die Zahlung erfolgreich war. ### Testzahlung durchführen #### iOS Um zu überprüfen, ob Ihre Integration funktioniert, führen Sie eine Testzahlung mit [Testzahlungsdetails](https://docs.stripe.com/payments/accept-a-payment.md?payment-ui=mobile&platform=ios#ios-test-the-integration) durch. #### Android Um zu überprüfen, ob Ihre Integration funktioniert, führen Sie eine Testzahlung mit [Testzahlungsdetails](https://docs.stripe.com/payments/accept-a-payment.md?payment-ui=mobile&platform=android#android-test-the-integration) durch. ### Ihre Zahlung im Dashboard anzeigen Navigieren Sie zum [Stripe Dashboard](https://dashboard.stripe.com/test/payments), um Ihre Testzahlung anzuzeigen. ## Akzeptieren Sie Zahlungen und optimieren Sie Ihre Integration Sie können jetzt Zahlungen mit Stripe akzeptieren. Fahren Sie mit den folgenden Schritten fort, um weitere Funktionen hinzuzufügen. ### Steuereinzug automatisieren Berechnen und erheben Sie den richtigen Steuerbetrag für Ihre Stripe-Transaktionen. Bevor Sie Stripe Tax verwenden können, müssen Sie die Funktion im [Dashboard](https://dashboard.stripe.com/tax) aktivieren. Erfahren Sie mehr über [Stripe Tax](https://docs.stripe.com/tax.md) und [wie die Funktion zu Ihrer Payments-Integration hinzugefügt werden kann](https://docs.stripe.com/tax/custom.md). ### Mit der Stripe Tax API Steuern berechnen Mit der [Stripe Tax API](https://docs.stripe.com/api/tax/calculations/create.md) können Sie die Steuer für die Transaktion berechnen. Geben Sie `currency`, `customer_details` und `line_items` der Bestellung im Anfragetext an. Verwenden Sie das Attribut `tax_amount_exclusive` der resultierenden Steuerberechnung, um den Steuerbetrag zum Gesamtbetrag der Bestellung hinzuzufügen. ### Steuertransaktion bei erfolgreicher Zahlung aufzeichnen Verbinden Sie die Steuerberechnung über `hooks[inputs][tax][calculation]` mit dem PaymentIntent. Hier werden die in Ihrem Stripe-Konto gesammelten Steuern erfasst, die Sie später für Buchhaltungszwecke exportieren können und andere [Stripe-Aktionen](https://docs.stripe.com/tax/payment-intent.md#automatic-actions) ausgelöst. ### Zahlungsmethoden mit Verzögerung zulassen Bei einigen Zahlungsmethoden kann nicht garantiert werden, dass Sie am Ende des Bezahlvorgangs Gelder von Ihren Kundinnen/Kunden erhalten, da die Abwicklung eine gewisse Zeit in Anspruch nimmt (z. B. bei den meisten Banklastschriften wie SEPA oder ACH) oder die Kundinnen/Kunden aktiv werden müssen, um den Vorgang abzuschließen (z. B. bei OXXO, Konbini, Boleto). Verwenden Sie dieses Kennzeichen, um Zahlungsmethoden mit Verzögerung zu aktivieren. Wenn Sie diese Funktion aktivieren, stellen Sie sicher, dass Ihre Server-Integration [Webhooks](https://docs.stripe.com/payments/payment-methods.md#payment-notification) auf Benachrichtigungen zum Erfolg bzw. Fehlschlagen einer Zahlung überwacht. ### Unterstützung für Apple Pay hinzufügen Um Apple Pay hinzuzufügen, geben Sie Ihre [Apple Pay-Händler-ID](https://support.stripe.com/questions/enable-apple-pay-on-your-stripe-account) und den [Ländercode](https://dashboard.stripe.com/settings/account) Ihres Stripe-Kontos an. ### Unterstützung für Google Pay hinzufügen Um Google Pay zu verwenden, aktivieren Sie zuerst die Google Pay API in Ihrer Datei AndroidManifest.xml. Aktivieren Sie Google Pay, indem Sie das Objekt [PaymentSheet.GooglePayConfiguration](https://stripe.dev/stripe-android/paymentsheet/com.stripe.android.paymentsheet/-payment-sheet/-google-pay-configuration/index.html) mit der Google Pay-Umgebung (Produktion oder Test) sowie den [Ländercode Ihres Unternehmens](https://dashboard.stripe.com/settings/account) übergeben, wenn Sie [PaymentSheet.Configuration](https://stripe.dev/stripe-android/paymentsheet/com.stripe.android.paymentsheet/-payment-sheet/-configuration/index.html) initialisieren. ### Farbe der primären Schaltfläche anpassen Sie können für die primäre Schaltfläche eine nutzerdefinierte Farbe verwenden, die besser zu Ihrer Marke oder dem Erscheinungsbild Ihrer App passt. ### Scannen von Karten aktivieren Durch das Scannen von Karten lässt sich Ihre Konversionsrate erhöhen, indem Sie Komplexität der manuellen Karteneingabe beseitigt wird. Um das Scannen von Karten zu aktivieren, legen Sie `NSCameraUsageDescription` in der `Info.plist` Ihrer Anwendung fest und geben Sie einen Grund für den Zugriff auf die Kamera an (z. .B. „Karten scannen“). > Das Scannen von Karten wird nur auf Geräten mit iOS 13 oder höher unterstützt. ### Scannen von Karten aktivieren Das Scannen von Karten kann dazu beitragen, Ihre Konversionsrate zu erhöhen, da die Komplexität der manuellen Karteneingabe entfällt. Um die Funktion zum Scannen von Karten zu aktivieren, fügen Sie `stripecardscan` dem Block `dependencies` Ihrer Datei [app/build.gradle](https://developer.android.com/studio/build/dependencies) hinzu: #### Groovy ```groovy implementation 'com.stripe:stripecardscan:23.3.0' ``` ### Zahlungsdetails nach Zahlung speichern Wird oft von SaaS- oder E-Commerce-Unternehmen mit wiederkehrenden Kund/innen verwendet. ### Zusätzliche Stripe-Ressourcen importieren Importieren Sie die Stripe-Pakete `customer` und `paymentmethod`. Mithilfe dieser Pakete können Sie Informationen über Ihre Kund/innen speichern. ### Zusätzliche Stripe-Ressourcen importieren Importieren Sie die Stripe-Modelle „PaymentMethod“ und „Customer“. Mithilfe dieser Modelle können Sie Informationen über Ihre Kund/innen speichern. ### Kund/innen erstellen Stripe speichert die Karte in einem *Customer* (Customer objects represent customers of your business. They let you reuse payment methods and give you the ability to track multiple payments)-Objekt. Erstellen Sie eine neue Kundin/einen neuen Kunden, bevor Sie einen PaymentIntent erstellen. Sie können auch Name, E-Mail-Adresse, Versandadresse und andere Angaben zu Kund/innen speichern. ### Kund/innen erstellen Stripe speichert die Karte in einem [Konto](https://docs.stripe.com/api/v2/core/accounts/object.md)-Objekt, das die [Kundin/den Kunden](https://docs.stripe.com/connect/account-capabilities.md?accounts-namespace=v2#customer) darstellt. Erstellen Sie ein neues Konto, bevor Sie einen PaymentIntent erstellen. Sie können auch Name, E-Mail-Adresse, Versandadresse und andere Angaben zu Kundinnen/Kunden speichern. ### Kundin/Kunde zum PaymentIntent hinzufügen Übergeben Sie die Customer-ID an den PaymentIntent und setzen Sie `setup_future_usage` auf `off_session`. `setup_future_usage` teilt Stripe mit, wie Sie vorhaben, die Zahlungsmethode zu verwenden – in bestimmten Regionen wie Europa und Indien gelten spezielle Vorgaben für die Wiederverwendung von Zahlungsdetails. [Erfahren Sie mehr](https://docs.stripe.com/payments/payment-intents.md#future-usage) über die effektivste Methode zur Anwendung von `setup_future_usage`. Sie können auch eine [Liste der unterstützten Zahlungsmethoden](https://docs.stripe.com/payments/payment-methods/payment-method-support.md#additional-api-supportability) anzeigen. Nach einem erfolgreichen PaymentIntent [hängt](https://docs.stripe.com/api/payment_methods/attach.md) Stripe die Zahlungsdetails (in einem *PaymentMethod* (PaymentMethods represent your customer's payment instruments, used with the Payment Intents or Setup Intents APIs)-Objekt) automatisch an Ihre Kundin/Ihren Kunden an. ### Kundin/Kunde zum PaymentIntent hinzufügen Übergeben Sie die Konto-ID an das PaymentIntent und setzen Sie `setup_future_usage` auf `off_session`. `setup_future_usage` gibt Stripe an, wie Sie die Zahlungsmethode verwenden möchten – bestimmte Regionen, wie Europa und Indien, haben Anforderungen für die Wiederverwendung von Zahlungsdaten. [Erfahren Sie mehr](https://docs.stripe.com/payments/payment-intents.md#future-usage) über die effektivste Anwendung von `setup_future_usage`. Sie können auch eine [Liste der unterstützten Zahlungsmethoden](https://docs.stripe.com/payments/payment-methods/payment-method-support.md#additional-api-supportability) einsehen. Nachdem das PaymentIntent erfolgreich war, [hängt](https://docs.stripe.com/api/payment_methods/attach.md) Stripe die Zahlungsdaten automatisch (in einem *PaymentMethod* (PaymentMethods represent your customer's payment instruments, used with the Payment Intents or Setup Intents APIs)-Objekt) an das von der Kundin/vom Kunden konfigurierte Konto an. ### Gespeicherte PaymentMethod belasten Wenn die PaymentMethod erneut belastet werden soll, erstellen Sie einen neuen PaymentIntent mit der Customer-ID und der PaymentMethod-ID und setzen Sie die Flags `off_session` und `confirm` auf „true“. ### Adressen mit dem Address Element erfassen Erfassen Sie lokale und internationale Versand- und Rechnungsadressen von Ihren Kund/innen. ### Adressen mit dem Address Element erfassen Erfassen Sie lokale und internationale Versand- und Rechnungsadressen von Ihren Kund/innen. Wenn Sie das Address Element nutzen, können Sie optional [Google Places SDK](https://developers.google.com/maps/documentation/places/android-sdk/overview) verwenden, um Vorschläge zur automatischen Vervollständigung von Adressen abzurufen. Um Vorschläge zur automatischen Vervollständigung zu aktivieren, fügen Sie `places` zum Abhängigkeitsblock Ihrer Datei [app/build.gradle](https://developer.android.com/studio/build/dependencies) hinzu: #### Groovy ```groovy implementation 'com.google.android.libraries.places:places:2.6.0' ``` ### Stripe Node-Bibliothek installieren Installieren Sie das Paket und importieren Sie es in Ihren Code. Wenn Sie dagegen von Grund auf neu beginnen möchten und eine package.json-Datei benötigen, laden Sie die Projektdateien über den Download-Link im Code-Editor herunter. #### npm Bibliothek installieren: ```bash npm install --save stripe ``` #### GitHub Oder laden Sie den Quellcode der Stripe-Node-Bibliothek direkt von [GitHub](https://github.com/stripe/stripe-node) herunter. ### Stripe-Ruby-Bibliothek installieren Installieren Sie Stripe Ruby Gem und fordern Sie es in Ihrem Code an. Wenn Sie dagegen von Grund auf neu beginnen möchten und eine Gemfile benötigen, laden Sie die Projektdateien über den Download-Link im Code-Editor herunter. #### Terminal Gem installieren: ```bash gem install stripe ``` #### Bundler Fügen Sie diese Zeile in Ihre Gemfile ein: ```bash gem 'stripe' ``` #### GitHub Oder laden Sie den Quellcode von Stripe Ruby Gem direkt von [GitHub](https://github.com/stripe/stripe-ruby) herunter. ### Stripe Java-Bibliothek installieren Fügen Sie Ihrem Build die Abhängigkeit hinzu und importieren Sie die Bibliothek. Wenn Sie dagegen von Grund auf neu beginnen möchten und eine pom.xml-Beispieldatei (für Maven) benötigen, laden Sie die Projektdateien über den Download-Link im Code-Editor herunter. #### Maven Fügen Sie folgende Abhängigkeit zu Ihrer POM-Datei hinzu und ersetzen Sie {VERSION} durch die Versionsnummer, die Sie verwenden möchten. ```bash \ncom.stripe\nstripe-java\n{VERSION}\n ``` #### Gradle Fügen Sie die Abhängigkeit zu Ihrer build.gradle-Datei hinzu und ersetzen Sie {VERSION} durch die Versionsnummer, die Sie verwenden möchten. ```bash implementation "com.stripe:stripe-java:{VERSION}" ``` #### GitHub Laden Sie die JAR-Datei direkt von [GitHub](https://github.com/stripe/stripe-java/releases/latest) herunter. ### Stripe-Python-Paket installieren Installieren Sie das Stripe-Paket und importieren Sie es in Ihren Code. Wenn Sie dagegen von Grund auf neu beginnen möchten und eine requirements.txt-Datei benötigen, laden Sie die Projektdateien über den Download-Link im Code-Editor herunter. #### pip Installieren Sie das Paket über pip: ```bash pip3 install stripe ``` #### GitHub Laden Sie den Quellcode der Stripe-Python-Bibliothek direkt [von GitHub](https://github.com/stripe/stripe-python) herunter. ### Stripe PHP-Bibliothek installieren Installieren Sie die Bibliothek mit Composer und initialisieren Sie sie mit Ihrem geheimen API-Schlüssel. Wenn Sie dagegen von Grund auf neu beginnen möchten und eine composer.csproj-Datei benötigen, laden Sie die Dateien über den Download-Link im Code-Editor herunter. #### Composer Bibliothek installieren: ```bash composer require stripe/stripe-php ``` #### GitHub Oder laden Sie den Quellcode der Stripe-PHP-Bibliothek direkt von [GitHub](https://github.com/stripe/stripe-php) herunter. ### Server einrichten Fügen Sie Ihrem Build die Abhängigkeit hinzu und importieren Sie die Bibliothek. Wenn Sie dagegen von Grund auf neu beginnen möchten und eine go.mod-Datei benötigen, laden Sie die Projektdateien über den Download-Link im Code-Editor herunter. #### Go Nutzen Sie für die Initialisierung Go-Module: ```bash go get -u github.com/stripe/stripe-go/v85 ``` #### GitHub Oder laden Sie den Quellcode des Stripe-Go-Moduls direkt von [GitHub](https://github.com/stripe/stripe-go) herunter. ### Stripe.net-Bibliothek installieren Installieren Sie das Paket mit .NET oder NuGet. Wenn Sie aber von Grund auf neu beginnen möchten, laden Sie die Dateien herunter, die eine konfigurierte .csproj-Datei enthalten. #### dotnet Bibliothek installieren: ```bash dotnet add package Stripe.net ``` #### NuGet Bibliothek installieren: ```bash Install-Package Stripe.net ``` #### GitHub Oder laden Sie den Quellcode der Stripe.net-Bibliothek direkt von [GitHub](https://github.com/stripe/stripe-dotnet) herunter. ### Stripe-Bibliotheken installieren Installieren Sie die Pakete und importieren Sie sie in Ihren Code. Wenn Sie dagegen von Grund auf neu beginnen möchten und eine `package.json`-Datei benötigen, laden Sie die Projektdateien über den Download-Link im Code-Editor herunter. Bibliotheken installieren: ```bash npm install --save stripe @stripe/stripe-js next ``` ### PaymentIntent erstellen Fügen Sie auf Ihrem Server einen Endpoint hinzu, der einen [PaymentIntent](https://docs.stripe.com/api/payment_intents.md) erstellt. Ein PaymentIntent erfasst den Lebenzyklus der Zahlung eines Kunden/einer Kundin, verfolgt alle fehlerhaften Zahlungsversuche und stellt sicher, dass das Kundenkonto nur einmal belastet wird. Geben Sie das *Client-Geheimnis* (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)) des PaymentIntent in der Antwort zurück, um die Zahlung auf dem Client abzuschließen. ### Zahlungsmethoden konfigurieren Stripe aktiviert Karten und andere gängige Zahlungsmethoden standardmäßig mit [dynamischen Zahlungsmethoden](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Sie können Zahlungsmethoden über das [Dashboard](https://dashboard.stripe.com/settings/payment_methods) aktualisieren und konfigurieren, ohne dass Code erforderlich ist. Stripe filtert Zahlungsmethoden nach Eignung und bevorzugten Zahlungsmethoden, sortiert sie dann und zeigt sie nach Wahrscheinlichkeit basierend auf Faktoren wie Betrag, Währung und Käuferstandort an. ### Zahlungsmethoden konfigurieren Stripe aktiviert Karten und andere gängige Zahlungsmethoden standardmäßig mit [dynamischen Zahlungsmethoden](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Sie können Zahlungsmethoden über das [Dashboard](https://dashboard.stripe.com/settings/payment_methods) aktualisieren und konfigurieren, ohne dass Code erforderlich ist. Stripe filtert Zahlungsmethoden nach Eignung und bevorzugten Zahlungsmethoden, sortiert sie dann und zeigt sie nach Wahrscheinlichkeit basierend auf Faktoren wie Betrag, Währung und Käuferstandort an. ### Zahlungsmethoden konfigurieren Stripe aktiviert Karten und andere gängige Zahlungsmethoden standardmäßig mit [dynamischen Zahlungsmethoden](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Sie können Zahlungsmethoden über das [Dashboard](https://dashboard.stripe.com/settings/payment_methods) aktualisieren und konfigurieren, ohne dass Code erforderlich ist. Stripe filtert Zahlungsmethoden nach Eignung und bevorzugten Zahlungsmethoden, sortiert sie dann und zeigt sie nach Wahrscheinlichkeit basierend auf Faktoren wie Betrag, Währung und Käuferstandort an. ### Zahlungsmethoden konfigurieren Stripe aktiviert Karten und andere gängige Zahlungsmethoden standardmäßig mit [dynamischen Zahlungsmethoden](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Sie können Zahlungsmethoden über das [Dashboard](https://dashboard.stripe.com/settings/payment_methods) aktualisieren und konfigurieren, ohne dass Code erforderlich ist. Stripe filtert Zahlungsmethoden nach Eignung und bevorzugten Zahlungsmethoden, sortiert sie dann und zeigt sie nach Wahrscheinlichkeit basierend auf Faktoren wie Betrag, Währung und Käuferstandort an. ### Zahlungsmethoden konfigurieren Stripe aktiviert Karten und andere gängige Zahlungsmethoden standardmäßig mit [dynamischen Zahlungsmethoden](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Sie können Zahlungsmethoden über das [Dashboard](https://dashboard.stripe.com/settings/payment_methods) aktualisieren und konfigurieren, ohne dass Code erforderlich ist. Stripe filtert Zahlungsmethoden nach Eignung und bevorzugten Zahlungsmethoden, sortiert sie dann und zeigt sie nach Wahrscheinlichkeit basierend auf Faktoren wie Betrag, Währung und Käuferstandort an. ### Zahlungsmethoden konfigurieren Stripe aktiviert Karten und andere gängige Zahlungsmethoden standardmäßig mit [dynamischen Zahlungsmethoden](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Sie können Zahlungsmethoden über das [Dashboard](https://dashboard.stripe.com/settings/payment_methods) aktualisieren und konfigurieren, ohne dass Code erforderlich ist. Stripe filtert Zahlungsmethoden nach Eignung und bevorzugten Zahlungsmethoden, sortiert sie dann und zeigt sie nach Wahrscheinlichkeit basierend auf Faktoren wie Betrag, Währung und Käuferstandort an. ### Zahlungsmethoden konfigurieren Stripe aktiviert Karten und andere gängige Zahlungsmethoden standardmäßig mit [dynamischen Zahlungsmethoden](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Sie können Zahlungsmethoden über das [Dashboard](https://dashboard.stripe.com/settings/payment_methods) aktualisieren und konfigurieren, ohne dass Code erforderlich ist. Stripe filtert Zahlungsmethoden nach Eignung und bevorzugten Zahlungsmethoden, sortiert sie dann und zeigt sie nach Wahrscheinlichkeit basierend auf Faktoren wie Betrag, Währung und Käuferstandort an. ### Zahlungsmethoden konfigurieren Stripe aktiviert Karten und andere gängige Zahlungsmethoden standardmäßig mit [dynamischen Zahlungsmethoden](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md). Sie können Zahlungsmethoden über das [Dashboard](https://dashboard.stripe.com/settings/payment_methods) aktualisieren und konfigurieren, ohne dass Code erforderlich ist. Stripe filtert Zahlungsmethoden nach Eignung und bevorzugten Zahlungsmethoden, sortiert sie dann und zeigt sie nach Wahrscheinlichkeit basierend auf Faktoren wie Betrag, Währung und Käuferstandort an. ### SDK installieren Das Stripe Android SDK ist [Open Source](https://github.com/stripe/stripe-android), [vollständig dokumentiert](https://stripe.dev/stripe-android/) und mit allen Geräten kompatibel, die Android 5.0 (API-Level 21) oder höher verwenden. Um das SDK zu installieren, fügen Sie `stripe-android` in den Block „Abhängigkeiten“ Ihrer `build.gradle`-Datei ein. #### Groovy ```groovy implementation 'com.stripe:stripe-android:23.3.0' ``` > Details zur aktuellsten SDK-Version und vorigen Versionen finden Sie auf der Seite [Releases](https://github.com/stripe/stripe-android/releases) auf GitHub. ### SDK einrichten Konfigurieren Sie das Stripe SDK mit Ihrem [veröffentlichbaren API-Schlüssel](https://docs.stripe.com/keys.md#obtain-api-keys). Die Hardcodierung des veröffentlichbaren API-Schlüssels im SDK dient nur zur Veranschaulichung. In einer Produktions-App müssen Sie den API-Schlüssel von Ihrem Server abrufen. ### PaymentIntent abrufen Fordern Sie bei Ihrem Server einen PaymentIntent an, sobald die Ansicht geladen wird. Speichern Sie einen Verweis auf das vom Server zurückgegebene *Client-Geheimnis* (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)) des PaymentIntent. Im Zahlungsformular wird dieser geheime Schlüssel später zur Durchführung der Zahlung verwendet. ### Zahlungsformular konfigurieren und anzeigen Erstellen Sie eine Instanz von `PaymentSheet` unter Verwendung des zuvor abgerufenen Client-Geheimnisses, und zeigen Sie sie von Ihrer Ansichtssteuerung aus an. Verwenden Sie die Struktur `PaymentSheet.Configuration`, um das Zahlungsformular [anzupassen](https://stripe.dev/stripe-ios/stripe-paymentsheet/Classes/PaymentSheet/Configuration.html). ### Zahlungsergebnis verarbeiten Verwenden Sie den Abschlussblock zur Verarbeitung des Zahlungsergebnisses. Wenn die Zahlung mit einem [Fehler](https://docs.stripe.com/error-codes.md) fehlschlägt, zeigen Sie Ihren Kundinnen/Kunden die entsprechende Meldung an, sodass sie entsprechende Maßnahmen ergreifen und es erneut versuchen können. Wenn kein Fehler aufgetreten ist, teilen Sie Ihren Kundinnen/Kunden mit, dass die Zahlung erfolgreich war. ### Testzahlung durchführen #### iOS Um zu überprüfen, ob Ihre Integration funktioniert, führen Sie eine Testzahlung mit [Testzahlungsdetails](https://docs.stripe.com/payments/accept-a-payment.md?payment-ui=mobile&platform=ios#ios-test-the-integration) durch. #### Android Um zu überprüfen, ob Ihre Integration funktioniert, führen Sie eine Testzahlung mit [Testzahlungsdetails](https://docs.stripe.com/payments/accept-a-payment.md?payment-ui=mobile&platform=android#android-test-the-integration) durch. ### Ihre Zahlung im Dashboard anzeigen Navigieren Sie zum [Stripe Dashboard](https://dashboard.stripe.com/test/payments), um Ihre Testzahlung anzuzeigen. ## Akzeptieren Sie Zahlungen und optimieren Sie Ihre Integration Sie können jetzt Zahlungen mit Stripe akzeptieren. Fahren Sie mit den folgenden Schritten fort, um weitere Funktionen hinzuzufügen. ### Steuereinzug automatisieren Berechnen und erheben Sie den richtigen Steuerbetrag für Ihre Stripe-Transaktionen. Bevor Sie Stripe Tax verwenden können, müssen Sie die Funktion im [Dashboard](https://dashboard.stripe.com/tax) aktivieren. Erfahren Sie mehr über [Stripe Tax](https://docs.stripe.com/tax.md) und [wie die Funktion zu Ihrer Payments-Integration hinzugefügt werden kann](https://docs.stripe.com/tax/custom.md). ### Mit der Stripe Tax API Steuern berechnen Mit der [Stripe Tax API](https://docs.stripe.com/api/tax/calculations/create.md) können Sie die Steuer für die Transaktion berechnen. Geben Sie `currency`, `customer_details` und `line_items` der Bestellung im Anfragetext an. Verwenden Sie das Attribut `tax_amount_exclusive` der resultierenden Steuerberechnung, um den Steuerbetrag zum Gesamtbetrag der Bestellung hinzuzufügen. ### Steuertransaktion bei erfolgreicher Zahlung aufzeichnen Verbinden Sie die Steuerberechnung über `hooks[inputs][tax][calculation]` mit dem PaymentIntent. Hier werden die in Ihrem Stripe-Konto gesammelten Steuern erfasst, die Sie später für Buchhaltungszwecke exportieren können und andere [Stripe-Aktionen](https://docs.stripe.com/tax/payment-intent.md#automatic-actions) ausgelöst. ### Zahlungsmethoden mit Verzögerung zulassen Bei einigen Zahlungsmethoden kann nicht garantiert werden, dass Sie am Ende des Bezahlvorgangs Gelder von Ihren Kundinnen/Kunden erhalten, da die Abwicklung eine gewisse Zeit in Anspruch nimmt (z. B. bei den meisten Banklastschriften wie SEPA oder ACH) oder die Kundinnen/Kunden aktiv werden müssen, um den Vorgang abzuschließen (z. B. bei OXXO, Konbini, Boleto). Verwenden Sie dieses Kennzeichen, um Zahlungsmethoden mit Verzögerung zu aktivieren. Wenn Sie diese Funktion aktivieren, stellen Sie sicher, dass Ihre Server-Integration [Webhooks](https://docs.stripe.com/payments/payment-methods.md#payment-notification) auf Benachrichtigungen zum Erfolg bzw. Fehlschlagen einer Zahlung überwacht. ### Unterstützung für Apple Pay hinzufügen Um Apple Pay hinzuzufügen, geben Sie Ihre [Apple Pay-Händler-ID](https://support.stripe.com/questions/enable-apple-pay-on-your-stripe-account) und den [Ländercode](https://dashboard.stripe.com/settings/account) Ihres Stripe-Kontos an. ### Unterstützung für Google Pay hinzufügen Um Google Pay zu verwenden, aktivieren Sie zuerst die Google Pay API in Ihrer Datei AndroidManifest.xml. Aktivieren Sie Google Pay, indem Sie das Objekt [PaymentSheet.GooglePayConfiguration](https://stripe.dev/stripe-android/paymentsheet/com.stripe.android.paymentsheet/-payment-sheet/-google-pay-configuration/index.html) mit der Google Pay-Umgebung (Produktion oder Test) sowie den [Ländercode Ihres Unternehmens](https://dashboard.stripe.com/settings/account) übergeben, wenn Sie [PaymentSheet.Configuration](https://stripe.dev/stripe-android/paymentsheet/com.stripe.android.paymentsheet/-payment-sheet/-configuration/index.html) initialisieren. ### Farbe der primären Schaltfläche anpassen Sie können für die primäre Schaltfläche eine nutzerdefinierte Farbe verwenden, die besser zu Ihrer Marke oder dem Erscheinungsbild Ihrer App passt. ### Scannen von Karten aktivieren Durch das Scannen von Karten lässt sich Ihre Konversionsrate erhöhen, indem Sie Komplexität der manuellen Karteneingabe beseitigt wird. Um das Scannen von Karten zu aktivieren, legen Sie `NSCameraUsageDescription` in der `Info.plist` Ihrer Anwendung fest und geben Sie einen Grund für den Zugriff auf die Kamera an (z. .B. „Karten scannen“). > Das Scannen von Karten wird nur auf Geräten mit iOS 13 oder höher unterstützt. ### Scannen von Karten aktivieren Das Scannen von Karten kann dazu beitragen, Ihre Konversionsrate zu erhöhen, da die Komplexität der manuellen Karteneingabe entfällt. Um die Funktion zum Scannen von Karten zu aktivieren, fügen Sie `stripecardscan` dem Block `dependencies` Ihrer Datei [app/build.gradle](https://developer.android.com/studio/build/dependencies) hinzu: #### Groovy ```groovy implementation 'com.stripe:stripecardscan:23.3.0' ``` ### Zahlungsdetails nach Zahlung speichern Wird oft von SaaS- oder E-Commerce-Unternehmen mit wiederkehrenden Kund/innen verwendet. ### Zusätzliche Stripe-Ressourcen importieren Importieren Sie die Stripe-Pakete `customer` und `paymentmethod`. Mithilfe dieser Pakete können Sie Informationen über Ihre Kund/innen speichern. ### Zusätzliche Stripe-Ressourcen importieren Importieren Sie die Stripe-Modelle „PaymentMethod“ und „Customer“. Mithilfe dieser Modelle können Sie Informationen über Ihre Kund/innen speichern. ### Kund/innen erstellen Stripe speichert die Karte in einem *Customer* (Customer objects represent customers of your business. They let you reuse payment methods and give you the ability to track multiple payments)-Objekt. Erstellen Sie eine neue Kundin/einen neuen Kunden, bevor Sie einen PaymentIntent erstellen. Sie können auch Name, E-Mail-Adresse, Versandadresse und andere Angaben zu Kund/innen speichern. ### Kund/innen erstellen Stripe speichert die Karte in einem [Konto](https://docs.stripe.com/api/v2/core/accounts/object.md)-Objekt, das die [Kundin/den Kunden](https://docs.stripe.com/connect/account-capabilities.md?accounts-namespace=v2#customer) darstellt. Erstellen Sie ein neues Konto, bevor Sie einen PaymentIntent erstellen. Sie können auch Name, E-Mail-Adresse, Versandadresse und andere Angaben zu Kundinnen/Kunden speichern. ### Kundin/Kunde zum PaymentIntent hinzufügen Übergeben Sie die Customer-ID an den PaymentIntent und setzen Sie `setup_future_usage` auf `off_session`. `setup_future_usage` teilt Stripe mit, wie Sie vorhaben, die Zahlungsmethode zu verwenden – in bestimmten Regionen wie Europa und Indien gelten spezielle Vorgaben für die Wiederverwendung von Zahlungsdetails. [Erfahren Sie mehr](https://docs.stripe.com/payments/payment-intents.md#future-usage) über die effektivste Methode zur Anwendung von `setup_future_usage`. Sie können auch eine [Liste der unterstützten Zahlungsmethoden](https://docs.stripe.com/payments/payment-methods/payment-method-support.md#additional-api-supportability) anzeigen. Nach einem erfolgreichen PaymentIntent [hängt](https://docs.stripe.com/api/payment_methods/attach.md) Stripe die Zahlungsdetails (in einem *PaymentMethod* (PaymentMethods represent your customer's payment instruments, used with the Payment Intents or Setup Intents APIs)-Objekt) automatisch an Ihre Kundin/Ihren Kunden an. ### Kundin/Kunde zum PaymentIntent hinzufügen Übergeben Sie die Konto-ID an das PaymentIntent und setzen Sie `setup_future_usage` auf `off_session`. `setup_future_usage` gibt Stripe an, wie Sie die Zahlungsmethode verwenden möchten – bestimmte Regionen, wie Europa und Indien, haben Anforderungen für die Wiederverwendung von Zahlungsdaten. [Erfahren Sie mehr](https://docs.stripe.com/payments/payment-intents.md#future-usage) über die effektivste Anwendung von `setup_future_usage`. Sie können auch eine [Liste der unterstützten Zahlungsmethoden](https://docs.stripe.com/payments/payment-methods/payment-method-support.md#additional-api-supportability) einsehen. Nachdem das PaymentIntent erfolgreich war, [hängt](https://docs.stripe.com/api/payment_methods/attach.md) Stripe die Zahlungsdaten automatisch (in einem *PaymentMethod* (PaymentMethods represent your customer's payment instruments, used with the Payment Intents or Setup Intents APIs)-Objekt) an das von der Kundin/vom Kunden konfigurierte Konto an. ### Gespeicherte PaymentMethod belasten Wenn die PaymentMethod erneut belastet werden soll, erstellen Sie einen neuen PaymentIntent mit der Customer-ID und der PaymentMethod-ID und setzen Sie die Flags `off_session` und `confirm` auf „true“. ### Adressen mit dem Address Element erfassen Erfassen Sie lokale und internationale Versand- und Rechnungsadressen von Ihren Kund/innen. ### Adressen mit dem Address Element erfassen Erfassen Sie lokale und internationale Versand- und Rechnungsadressen von Ihren Kund/innen. Wenn Sie das Address Element nutzen, können Sie optional [Google Places SDK](https://developers.google.com/maps/documentation/places/android-sdk/overview) verwenden, um Vorschläge zur automatischen Vervollständigung von Adressen abzurufen. Um Vorschläge zur automatischen Vervollständigung zu aktivieren, fügen Sie `places` zum Abhängigkeitsblock Ihrer Datei [app/build.gradle](https://developer.android.com/studio/build/dependencies) hinzu: #### Groovy ```groovy implementation 'com.google.android.libraries.places:places:2.6.0' ``` ## Nächste Schritte #### Web #### [Details zur Rechnungsadresse erfassen](https://docs.stripe.com/elements/address-element.md) Standardmäßig erfasst das Payment Element nur die erforderlichen Angaben zur Rechnungsadresse. Verwenden Sie das Address Element, um die vollständige Rechnungsadresse (zum Beispiel zur Berechnung der Steuer für digitale Waren und Dienstleistungen) oder die Versandadresse einer Kundin/eines Kunden zu erfassen. #### iOS #### Android #### [Auszahlungen](https://docs.stripe.com/payouts.md) Erfahren Sie, wie Sie Gelder von Ihrem Stripe-Konto auf Ihr Bankkonto übertragen können. #### [Rückerstattungen](https://docs.stripe.com/refunds.md) Bearbeiten Sie Rückerstattungsanforderungen über die Stripe-API oder das Dashboard. #### [Fulfillment](https://docs.stripe.com/webhooks/quickstart.md) Erstellen Sie ein Ereignisziel, um Ereignisse an Ihren Webhook-Endpoint zu senden, um Bestellungen nach erfolgreicher Zahlung abzuwickeln und andere kritische Ereignisse zu verarbeiten.