Zum Hauptinhalt springen
Tutorial

Stripe-Zahlungen in Capacitor: Neue Apple-Richtlinien

Lernen Sie, wie Sie Stripe-Zahlungslinks in Ihrer Capacitor-App implementieren können, um digitale Güterzahlungen zu verarbeiten, die den neuen Apple-Richtlinien vom 1. Mai 2025 entsprechen.

Martin Donadieu

Martin Donadieu

Content Marketer

Zahlungsabwicklungen bei Stripe in Capacitor: Neue Richtlinien von Apple

Implementierung von Zahlungslinks bei Capacitor: Apps unter Einhaltung der neuen Richtlinien von Apple

Ab dem 1. Mai 2025 hat Apple erhebliche Änderungen an seinen Richtlinien für die App Store-Bewertung vorgenommen, die sich auf den Gerichtsbeschluss im Fall Epic v. Apple beziehen. Diese Änderungen erlauben es Entwicklern in den Vereinigten Staaten, Links zu externen Zahlungsmethoden für digitale Güter und Dienstleistungen zu erstellen, was alternative Optionen zum in-App-Kaufsystem von Apple eröffnet.

Das epische Duell, das die Mobilzahlungen für immer veränderte

Der Weg zu diesem Moment war lang und umstritten. Es begann im August 2020, als Epic Games, der Schöpfer des beliebten Spiels Fortnite, bewusst Apple's Richtlinien für die App Store-Bewertung verletzte, indem er eine direkte Zahlungsoption implementierte, die Apple's 30-Prozent-Kommission umging. Apple entfernte Fortnite sofort aus dem App Store, und Epic reagierte mit einer Klage, mit der Apple's Kontrolle über die iOS-App-Verteilung und die in-App-Zahlungen in Frage gestellt wurde.

Nach Jahren von Rechtsstreitigkeiten, Berufungen und Gegenberufungen entschieden die Gerichte schließlich, dass Apple Entwicklern erlauben muss, Benutzern alternative Zahlungsmethoden außerhalb ihrer Apps zu leiten. Diese Entscheidung ändert grundlegend die Wirtschaft des App Store-Ökosystems, das seit seiner Gründung im Jahr 2008 unter demselben grundlegenden finanziellen Modell operiert hat.

Die endgültige Entscheidung - keine weiteren Berufungen mehr

What macht diese Entscheidung besonders bedeutend ist, ist, dass sie endgültig und nicht mehr angefochten werden kann. Das Supreme Court hat Anfang 2025 den Rechtsmittelzug von Apple abgelehnt, was die Entscheidung des unteren Gerichts als Gesetz des Landes festigte. Dies bedeutet, dass Entwickler externe Zahlungsmethoden mit Vertrauen in die Umsetzung implementieren können, dass Apple diese Entscheidung nicht durch weitere rechtliche Angriffe rückgängig machen kann.

Gesetzliche Garantie für Gleichbehandlung

Am wichtigsten ist, dass die Entscheidung explizit festhält, dass Apple keine Diskriminierung gegen Apps durchführen darf, die externe Zahlungsmethoden verwenden. Das Gericht hat Apple explizit daran gehindert:

  1. Zusätzliche Gebühren zu erheben oder zusätzliche Anforderungen an Apps zu stellen, die externe Zahlungsmethoden verwenden
  2. Apps, die ausschließlich Apples IAP-System verwenden, bevorzugte Behandlung in den Suchergebnissen oder Features zu gewähren
  3. Technische Maßnahmen zu ergreifen, um externe Zahlungserfahrungen gegenüber Apples eigenen System als minderwertig darzustellen
  4. Zumutbare Offenlegungspflichten außer grundlegenden Verbraucherinformationen zu erheben

Diese expliziten Schutzmaßnahmen bedeuten, dass Entwickler Stripe oder andere externe Zahlungsdienstleister ohne Angst vor subtiler Rache oder Diskriminierung von Apple implementieren können. Das Spielfeld ist rechtlich ausgewogen, und Apple muss alle Apps gleich behandeln, unabhängig von ihren Zahlungsmethodenwahl.

Die Entscheidung stellt eine der bedeutendsten Herausforderungen für Apples 'eingeschlossenes Garten' dar und markiert einen wichtigen Wendepunkt in der Art und Weise, wie die Vermarktung von mobilen Apps funktionieren kann. Für Entwickler, die sich seit langem über Apples 30-Prozent-Kommission (auf 15 Prozent für kleine Unternehmen reduziert) beschwert haben, bietet diese Entscheidung einen Weg zu höheren Gewinnmargen und mehr Kontrolle über die Kunden Erfahrung.

Finanzielle Vorteile der Verwendung von Stripe gegenüber Apples In-App-Käufen

Die finanziellen Auswirkungen dieser Änderung sind erheblich für Entwickler:

  • Geringere Zahlungsverarbeitungskosten: Apple verlangt typischerweise eine 30-Prozent-Kommission für In-App-Käufe (15 Prozent für kleine Unternehmen), während Stripes Gebühr nur etwa 2,9 Prozent + 0,30 US-Dollar pro Transaktion beträgt. Diese Differenz kann Ihre Gewinnmargen erheblich erhöhen.

  • Schnellere Auszahlungen: Bei Apple wartet man typischerweise 45-90 Tage, um die eigenen Gelder zu erhalten. Stripe hingegen überweist Zahlungen in die Bankkonten innerhalb von 2-3 Geschäftstagen.

  • Einfacherer Rückerstattungsprozess: Verwenden Sie Rückerstattungen direkt über Stripes Dashboard anstatt durch Apples komplexere Rückerstattungssystem.

Diese Kosteneinsparungen und verbesserte Liquidität können game-changing sein, insbesondere für kleinere Entwickler und Unternehmen.

In diesem Artikel werden wir untersuchen, wie Sie Stripe Payment Links in Ihrem Capacitor-App implementieren können, um von diesen neuen Regeln zu profitieren, während Sie gleichzeitig die Anforderungen von Apples aktualisierten Richtlinien.

This implementation is based on Stripe’s offizielle Dokumentation für Payment Linksangepasst speziell für Capacitor-Apps.

Verständnis der neuen Richtlinien

Die aktualisierten Richtlinien für die App Store-Bewertung erlauben Entwicklern nun, Benutzern externe Websites für die Zahlungsverarbeitung zuzuführen, insbesondere für digitale Güter und Abonnements. Diese Änderung ist derzeit nur auf Apps im App Store der Vereinigten Staaten anwendbar.

Hauptsächliche Punkte zum Verständnis:

  1. Sie können jetzt externe Zahlungsoptionen für digitale Güter innerhalb Ihrer App verknüpfen
  2. Dies gilt nur für Apps im US-App Store
  3. Sie müssen weiterhin die Anforderungen von Apples zur Offenlegung einhalten
  4. Sie bleiben für alle Kundenunterstützung und Rückgabehandling verantwortlich

Lasst uns in die technische Umsetzung eintauchen:

Erstellen Sie zunächst einen Zahlungslink in Ihrem Stripe-Dashboard:

  1. Navigieren Sie zur Zahlungslinks-Sektion in Ihrem Stripe-Dashboard
  2. Klicken Sie auf „+ Neues“ zum Erstellen eines neuen Zahlungslinks
  3. Definieren Sie die Details Ihres Produkts oder Ihrer Abonnement
  4. Unter den „Nach Zahlung“-Einstellungen wählen Sie „Keine Bestätigungsseite anzeigen“
  5. Legen Sie einen universellen Link als Ihre Erfolg-URL fest (wir konfigurieren dies später)
  6. Klicken Sie auf „Link erstellen“ zum Generieren Ihres Zahlungslinks

Um Benutzer nach Abschluss der Zahlung wieder in Ihre App zurückzuleiten, konfigurieren Sie universelle Links:

  1. Erstellen Sie ein apple-app-site-association Datei auf Ihrem Domain:
{
  "applinks": {
    "apps": [],
    "details": [
      {
        "appIDs": ["YOURTEAMID.com.yourdomain.yourapp"],
        "components": [
          {
            "/": "/checkout_redirect*",
            "comment": "Matches any URL whose path starts with /checkout_redirect"
          }
        ]
      }
    ]
  }
}
  1. Hosten Sie diese Datei bei https://yourdomain.com/.well-known/apple-app-site-association

  2. Stellen Sie sicher, dass sie mit dem richtigen MIME-Typ bereitgestellt wird application/json

  3. Konfigurieren Sie Ihr Capacitor-Anwendungsprogramm, um universelle Links zu verarbeiten, indem Sie die entsprechende Berechtigung hinzufügen. Zuerst in Ihrem capacitor.config.ts:

import { CapacitorConfig } from '@capacitor/cli';

const config: CapacitorConfig = {
  // Your existing app configuration (appId, appName, etc.)
  plugins: {
    Geolocation: {
      // Request precise location access on iOS
      iosLocationAccuracy: 'reduced'
    }
  }
};

export default config;
  1. Fügen Sie der Xcode-Projekt die zugehörige Domänenberechtigung hinzu:
    • Öffnen Sie Ihr Xcode-Projekt
    • Wählen Sie Ihr Anwendungsziel
    • Gehen Sie zu “Zertifikate und Berechtigungen”
    • Klicken Sie auf “+ Berechtigung” und wählen Sie “Zugehörige Domänen”
    • Hinzufügen applinks:yourdomain.com

Schritt 3: Erstellen Sie eine Fallback-Seite

Erstellen Sie eine Fallback-Seite an der Umleitungs-URL, um Fälle zu behandeln, in denen die Anwendung nicht installiert ist:

<!DOCTYPE html>
<html>
<head>
  <title>Redirecting...</title>
  <meta http-equiv="refresh" content="0;url=https://yourdomain.com/app-download">
</head>
<body>
  <p>Redirecting to download page...</p>
</body>
</html>

Schritt 4: Implementieren Sie die Zahlungs-Button in Ihrer Capacitor-Anwendung

Jetzt fügen Sie den Zahlungsbutton zu Ihrer App hinzu:

import { Capacitor } from '@capacitor/core';

export async function openPaymentLink(userEmail, userId) {
  // Use your actual Stripe payment link
  const baseUrl = 'https://buy.stripe.com/your_payment_link';
  
  // Add URL parameters to customize the experience
  const params = new URLSearchParams({
    prefilled_email: encodeURIComponent(userEmail),
    client_reference_id: userId
  });

  const fullUrl = `${baseUrl}?${params.toString()}`;
  
  // Simple window.open works in both web and Capacitor
  // Using _blank opens in Safari on iOS which is important for users with saved Stripe Link credentials
  window.open(fullUrl, '_blank');
}

Warum Safari wichtig ist: Durch das Öffnen der Zahlungslink in Safari (via window.open) anstatt in einem in-app-Browser ist es vorteilhaft, weil Nutzer, die ihre Zahlungsdaten mit Stripe Link gespeichert haben, ihre Zugangsdaten automatisch zur Verfügung haben. Dies schafft eine glattere Zahlungsabwicklung, bei der Nutzer ihre Kreditkarteninformationen nicht erneut eingeben müssen, was die Abbruchraten erheblich senkt.

Konfigurieren Sie Ihre App, um die universellen Links zu behandeln, wenn Nutzer zurückgeleitet werden:

  1. Zuerst installieren Sie das App-Plugin:
npm install @capacitor/app
  1. Registrieren Sie das App-Plugin in Ihrer App:
import { App } from '@capacitor/app';

// In your initialization code
App.addListener('appUrlOpen', (event) => {
  // Example URL: https://yourdomain.com/checkout_redirect?session_id=cs_test_...
  const url = new URL(event.url);
  
  if (url.pathname.startsWith('/checkout_redirect')) {
    // Extract any parameters you need
    const params = new URLSearchParams(url.search);
    const sessionId = params.get('session_id');
    
    // Handle successful payment
    if (sessionId) {
      // Verify the payment on your server if needed
      verifyPayment(sessionId);
      
      // Update UI to reflect successful purchase
      updatePurchaseStatus(true);
    }
  }
});

async function verifyPayment(sessionId) {
  // Call your backend to verify the payment
  // This is optional if you're relying on webhooks
}

function updatePurchaseStatus(success) {
  // Update your app UI to reflect purchase status
}

Schritt 6: Einrichten Sie einen Webhook für die Bestellabwicklung

Abschließend konfigurieren Sie einen Webhook auf Ihrem Server, um erfolgreiche Zahlungen zu bearbeiten:

// Using Express.js as an example
const express = require('express');
const stripe = require('stripe')('sk_test_your_stripe_secret_key');
const app = express();

// Use raw body parser for webhook signature verification
app.post('/webhook', express.raw({type: 'application/json'}), async (req, res) => {
  const sig = req.headers['stripe-signature'];
  const webhookSecret = 'whsec_your_webhook_secret';
  
  let event;
  
  try {
    event = stripe.webhooks.constructEvent(req.body, sig, webhookSecret);
  } catch (err) {
    console.log(`Webhook Error: ${err.message}`);
    return res.status(400).send(`Webhook Error: ${err.message}`);
  }
  
  // Handle the checkout.session.completed event
  if (event.type === 'checkout.session.completed') {
    const session = event.data.object;
    
    // Retrieve client_reference_id (your user ID)
    const userId = session.client_reference_id;
    
    // Grant access to the purchased content
    await grantAccess(userId, session.id);
  }
  
  res.status(200).send();
});

async function grantAccess(userId, sessionId) {
  // Your logic to grant access to the purchased content
  // This could be updating a database, sending a notification, etc.
}

app.listen(3000, () => console.log('Webhook server running on port 3000'));

Android-Kompatibilität

Lassen Sie uns klar sein: Die Epic v. Apple-Richtlinie hat den mobilen Zahlungslandschaft grundlegend verändert. Nicht nur direkt iOS-Apps, sondern auch die Position von Android-Entwicklern, die externe Zahlungsmethoden verwendet haben.

Android-Entwickler können jetzt externe Zahlungslösungen mit voller Zuversicht implementieren. Das von der Apple-Richtlinie gesetzte Vorbild schützt Entwickler auf allen Plattformen effektiv vor möglichen zukünftigen Einschränkungen. Diese Gerichtsentscheidung hat bestätigt, was viele Android-Entwickler bereits seit Jahren tun - alternative Zahlungsoptionen mit niedrigeren Gebühren anbieten.

Google’s Play Store hat immer weniger restriktiv gegenüber externen Zahlungsmethoden als Apple gewesen, und jetzt, mit dem gesetzlichen Vorbild etabliert, besteht bei der Implementierung von Stripe oder anderen externen Zahlungsanbietern in Ihren Android-Anwendungen praktisch kein Risiko. Sie können diese Implementierungen mit dem Wissen vorantreiben, dass Sie auf festem rechtlichem Boden stehen.

Die Implementierung, die wir für iOS abgedeckt haben, funktioniert nahezu identisch auf Android-Geräten. Da Google Play Store keine gleichen Einschränkungen auf externe Zahlungsmethoden hat, können Sie die gleiche Stripe-Zahlungslinks-Ansicht ohne besondere Disclosure-Dialoge verwenden.

Um die tiefen Verlinkungen (entsprechend Universal Links auf iOS) zu handhaben, müssen Sie:

  1. Einstellungen für App Links in Ihrem AndroidManifest.xml um die Redirect-URL zu handhaben
  2. Erstellen Sie ein .well-known/assetlinks.json Datei auf Ihrer Domain mit den Details Ihrer App
  3. Verwenden Sie die gleiche appUrlOpen Listener-Logik, um erfolgreiche Zahlungen zu verarbeiten

Die Schönheit von Capacitor ist, dass sich die tatsächliche Zahlungsablauf code nach der Implementierung der plattform-spezifischen Konfigurationen auf beiden Plattformen nicht ändert.

Ein Zahlungs-UI erstellen

Hier ist ein Beispiel für eine Zahlungsbutton-Komponente in Vue, die Sie in Ihr Capacitor-Anwendungsprojekt einfügen können:

<template>
  <div class="payment-container">
    <div class="pricing-card">
      <h2 class="mb-4 text-xl font-bold">{{ product.name }}</h2>
      <p class="mb-6 text-gray-600">{{ product.description }}</p>
      <div class="mb-6 price-tag">
        <span class="text-2xl font-bold">${{ product.price }}</span>
        <span v-if="product.isSubscription" class="text-sm text-gray-500">/month</span>
      </div>
      <button 
        @click="handlePayment" 
        class="py-3 w-full font-medium text-white bg-indigo-600 rounded-lg transition-colors hover:bg-indigo-700"
      >
        Purchase Now
      </button>
    </div>
  </div>
</template>

<script setup>
import { ref } from 'vue';
import { Dialog } from '@capacitor/dialog';

const props = defineProps({
  product: {
    type: Object,
    required: true
  },
  userEmail: {
    type: String,
    default: ''
  },
  userId: {
    type: String,
    required: true
  }
});

const isLoading = ref(false);

async function showExternalPaymentDisclosure() {
  const { value } = await Dialog.confirm({
    title: 'Leaving App for Payment',
    message: 'You are about to leave this app to make a payment. Apple is not responsible for the privacy or security of payments that are not made through the App Store. All payment-related issues, including refunds, must be handled by our support team.',
    okButtonTitle: 'Continue',
    cancelButtonTitle: 'Cancel'
  });
  
  return value;
}

async function openPaymentLink() {
  // Use your actual Stripe payment link
  const baseUrl = 'https://buy.stripe.com/your_payment_link';
  
  // Add URL parameters to customize the experience
  const params = new URLSearchParams({
    prefilled_email: encodeURIComponent(props.userEmail),
    client_reference_id: props.userId
  });

  const fullUrl = `${baseUrl}?${params.toString()}`;
  
  // Simple window.open works in both web and Capacitor
  // Using _blank opens in Safari on iOS which is important for users with saved Stripe Link credentials
  window.open(fullUrl, '_blank');
}

async function handlePayment() {
  isLoading.value = true;
  try {
    // Only show the disclosure on iOS
    if (window.Capacitor?.getPlatform() === 'ios') {
      const userConfirmed = await showExternalPaymentDisclosure();
      if (!userConfirmed) return;
    }
    
    await openPaymentLink();
  } catch (error) {
    console.error('Payment error:', error);
    await Dialog.alert({
      title: 'Payment Error',
      message: 'There was an error initiating the payment. Please try again.'
    });
  } finally {
    isLoading.value = false;
  }
}
</script>

Verschiedene Regionen behandeln

Da die neuen Apple-Richtlinien nur auf Apps in der U.S. App Store anwendbar sind, müssen Sie eine Strategie entwickeln, um die Benutzerregion zu erkennen und die entsprechende Zahlungsmethode anzuwenden. Hier ist eine zuverlässigere Vorgehensweise mit der IP-Geolokalisierung:

import { Capacitor } from '@capacitor/core';

async function determinePaymentMethod() {
  // Always use Stripe for Android
  if (Capacitor.getPlatform() !== 'ios') {
    return 'external';
  }
  
  try {
    // Use a geolocation service to determine user's country
    const response = await fetch('https://ipapi.co/json/');
    const locationData = await response.json();
    
    // Check if the user is in the United States
    if (locationData.country_code === 'US') {
      return 'external'; // Can use Stripe Payment Links
    } else {
      return 'iap'; // Must use In-App Purchases
    }
  } catch (error) {
    console.error('Error detecting region:', error);
    return 'iap'; // Default to IAP to be safe
  }
}

export async function processPayment(product, userEmail, userId) {
  const paymentMethod = await determinePaymentMethod();
  
  if (paymentMethod === 'external') {
    // Use Stripe Payment Links
    await initiateExternalPayment(userEmail, userId);
  } else {
    // Use Apple's In-App Purchase
    await initiateInAppPurchase(product.appleProductId);
  }
}

Dieser Ansatz verwendet die kostenlose ipapi.co Dienst, um die Benutzerland auf der Grundlage ihrer IP-Adresse zu bestimmen. Sie könnten auch andere Geolokalisierungsdienste wie MaxMind verwenden oder diese Überprüfung serverseitig durchführen, um die Sicherheit zu erhöhen.

HinweisWährend dieser Ansatz funktioniert, ist es wichtig zu beachten, dass die IP-Geolokalisierung nicht immer 100% genau ist. Für mission-kritische Anwendungen sollten Sie mehrere Überprüfungsverfahren verwenden oder den Benutzern die Möglichkeit geben, ihre Region manuell auszuwählen.

Genauere Standortdetektion mit Capacitor-Plugins

Für eine genauere Standortdetektion können Sie den Capacitor-Geolokalisierungs-Plugin zusammen mit @capgo/capacitor-nativegeocoder verwenden, um das Benutzerland mit höherer Präzision zu bestimmen:

  1. Zuerst müssen Sie die erforderlichen Plugins installieren:
npm install @capacitor/geolocation @capgo/capacitor-nativegeocoder
  1. Konfigurieren Sie die Plugins in Ihrem Capacitor-Projekt. Fügen Sie die folgenden Zeilen zu Ihrem capacitor.config.ts:
import { CapacitorConfig } from '@capacitor/cli';

const config: CapacitorConfig = {
  // Your existing app configuration (appId, appName, etc.)
  plugins: {
    Geolocation: {
      // Request precise location access on iOS
      iosLocationAccuracy: 'reduced'
    }
  }
};

export default config;
  1. Implementieren Sie die Standort-basierte Regionserkennung:
import { Capacitor } from '@capacitor/core';
import { Geolocation } from '@capacitor/geolocation';
import { NativeGeocoder } from '@capgo/capacitor-nativegeocoder';

async function isUserInUSA() {
  try {
    // Request permission first
    const permissionStatus = await Geolocation.requestPermissions();
    
    if (permissionStatus.location === 'granted') {
      // Get current position
      const position = await Geolocation.getCurrentPosition({
        timeout: 10000,
        enableHighAccuracy: false
      });
      
      // Use NativeGeocoder to reverse geocode the coordinates
      const results = await NativeGeocoder.reverseGeocode({
        latitude: position.coords.latitude,
        longitude: position.coords.longitude,
        useLocale: true,
        maxResults: 1
      });
      
      if (results.addresses.length > 0) {
        // Check if the user is in the USA
        return results.addresses[0].countryCode === 'US';
      }
    }
    
    // If we couldn't determine location or permission denied, fall back to IP detection
    return await isUserInUSAByIP();
  } catch (error) {
    console.error('Error detecting location:', error);
    // Fall back to IP detection on error
    return await isUserInUSAByIP();
  }
}

async function isUserInUSAByIP() {
  try {
    const response = await fetch('https://ipapi.co/json/');
    const data = await response.json();
    return data.country_code === 'US';
  } catch (error) {
    console.error('Error detecting IP location:', error);
    return false; // Default to false to be safe
  }
}

export async function determinePaymentMethod() {
  // Always use Stripe for Android
  if (Capacitor.getPlatform() !== 'ios') {
    return 'external';
  }
  
  // Check if user is in the USA
  const isUSA = await isUserInUSA();
  return isUSA ? 'external' : 'iap';
}

export async function processPayment(product, userEmail, userId) {
  const paymentMethod = await determinePaymentMethod();
  
  if (paymentMethod === 'external') {
    // Use Stripe Payment Links
    await initiateExternalPayment(userEmail, userId);
  } else {
    // Use Apple's In-App Purchase
    await initiateInAppPurchase(product.appleProductId);
  }
}

Diese Implementierung bietet eine genaue Methode, um zu bestimmen, ob ein Benutzer physisch in den Vereinigten Staaten ist. Zunächst versucht sie, die GPS des Geräts und die native Geocoder zu verwenden, um das Land zu bestimmen. Wenn das fehlschlägt (wegen Berechtigungsproblemen oder anderen Fehlern), fällt sie auf IP-basierte Erkennung zurück.

Den notwendigen Berechtigungen in Ihren info.plist (iOS) und AndroidManifest.xml (Android) Dateien hinzufügen:

Für iOS (ios/App/App/Info.plist):

<key>NSLocationWhenInUseUsageDescription</key>
<string>We need your location to determine which payment method to use based on regional availability.</string>

Für Android (android/app/src/main/AndroidManifest.xml):

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

Mit dieser Methode erhalten Sie die genaueste Möglichkeit, zu bestimmen, ob ein Benutzer für externe Zahlungsoptionen unter den neuen Apple-Richtlinien berechtigt ist.

Zahlungsabonnements verwalten

Eine der Hauptvorteile der Verwendung von Stripe für Zahlungen ist die Möglichkeit, Abonnements anzubieten und zu verwalten. Hier erfahren Sie, wie Sie die Abonnementverwaltung in Ihrer Capacitor-App durchführen:

1. Erstellen Sie eine Abonnementverwaltungsoberfläche

Hinzufügen Sie eine Abonnementverwaltungsoberfläche in Ihrer App, um die aktiven Abonnements des Benutzers anzuzeigen:

<template>
  <div class="subscription-manager">
    <div v-if="isLoading" class="loading-indicator">
      Loading subscription data...
    </div>
    
    <div v-else-if="subscription" class="subscription-info">
      <h2 class="mb-4 text-xl font-bold">Your Subscription</h2>
      
      <div class="mb-6 plan-details">
        <p><span class="font-medium">Plan:</span> {{ subscription.planName }}</p>
        <p><span class="font-medium">Status:</span> {{ subscription.status }}</p>
        <p><span class="font-medium">Renews:</span> {{ formatDate(subscription.currentPeriodEnd) }}</p>
      </div>
      
      <button 
        @click="manageSubscription" 
        class="py-3 w-full font-medium text-white bg-indigo-600 rounded-lg transition-colors hover:bg-indigo-700"
      >
        Manage Subscription
      </button>
    </div>
    
    <div v-else class="no-subscription">
      <p class="mb-4">You don't have an active subscription.</p>
      <button 
        @click="goToPricingPage" 
        class="py-3 w-full font-medium text-white bg-indigo-600 rounded-lg transition-colors hover:bg-indigo-700"
      >
        View Plans
      </button>
    </div>
  </div>
</template>

<script setup>
import { ref, onMounted } from 'vue';
import { getUserSubscription } from '../services/subscription';

const subscription = ref(null);
const isLoading = ref(true);

onMounted(async () => {
  try {
    const userData = await getUserSubscription();
    subscription.value = userData.subscription;
  } catch (error) {
    console.error('Failed to load subscription:', error);
  } finally {
    isLoading.value = false;
  }
});

function formatDate(timestamp) {
  return new Date(timestamp * 1000).toLocaleDateString();
}

function manageSubscription() {
  // Open Stripe Customer Portal
  window.open(subscription.value.portalUrl, '_blank');
}

function goToPricingPage() {
  // Navigate to pricing page
  // router.push('/pricing');
}
</script>

2. Kundenportal für die Abonnementverwaltung

Stripe bietet ein Kundenportal, mit dem Benutzer ihre Abonnements verwalten können. Sie können einen Link zu diesem Portal von Ihrem Server erstellen:

// Server-side code (Node.js)
const stripe = require('stripe')('sk_your_stripe_secret_key');

async function createPortalSession(customerId) {
  const session = await stripe.billingPortal.sessions.create({
    customer: customerId,
    return_url: 'https://yourdomain.com/account',
  });
  
  return session.url;
}

Sicherstellung der Einhaltung der App-Store-Richtlinien

Um sicherzustellen, dass Ihre Implementierung den Richtlinien von Apple entspricht:

  1. Einschließen Sie angemessene Offenlegungen über externe Kaufvorgänge
  2. Implementieren Sie ein Modalfenster, das Benutzern mitteilt, dass sie das App auslassen (wie von Apple gefordert)
  3. Versuchen Sie nicht, Apples Provision auf Kaufvorgänge innerhalb der App zu umgehen
  4. Kommunizieren Sie klar mit den Benutzern, dass Apple für die Transaktion nicht verantwortlich ist

Hier ist ein Beispiel für die Implementierung des erforderlichen Offenlegungsmodals:

import { Dialog } from '@capacitor/dialog';

async function showExternalPaymentDisclosure() {
  const { value } = await Dialog.confirm({
    title: 'Leaving App for Payment',
    message: 'You are about to leave this app to make a payment. Apple is not responsible for the privacy or security of payments that are not made through the App Store. All payment-related issues, including refunds, must be handled by our support team.',
    okButtonTitle: 'Continue',
    cancelButtonTitle: 'Cancel'
  });
  
  return value;
}

export async function initiateExternalPayment(userEmail, userId) {
  const userConfirmed = await showExternalPaymentDisclosure();
  
  if (userConfirmed) {
    await openPaymentLink(userEmail, userId);
  }
}

Testen Sie Ihre Implementierung:

Klicken Sie auf Ihren Zahlungsbutton in Ihrer App, der die Offenlegung anzeigen und dann die Stripe-Zahlungsseite öffnen sollte

  1. Klicken Sie auf Ihren Zahlungsbutton in Ihrer App, der die Offenlegung anzeigen und dann die Stripe-Zahlungsseite öffnen sollte
  2. Mit der Stripe-Testkarte eine Zahlung abwickeln 4242 4242 4242 4242
  3. Nach der Zahlung sollten Sie über den Universal-Link wieder in Ihre App zurückgeleitet werden
  4. Überprüfen Sie, ob Ihr Webhook das Ereignis erhalten hat checkout.session.completed Ereignis

Fazit

Die Möglichkeit, externe Zahlungsoptionen für digitale Güter in iOS-Anwendungen zu verwenden, ist ein bedeutender Wechsel, der Entwicklern mehr Flexibilität bietet. Während dieser Wechsel derzeit nur auf Apps im US-App-Store anwendbar ist, bietet er eine wichtige Alternative zum Zahlungssystem von Apple.

Indem Sie Stripe Payment Links mit Capacitor verwenden, können Sie eine strukturierte Zahlungsabwicklung schnell implementieren und gleichzeitig die Richtlinien von Apple einhalten. Für Benutzer außerhalb der USA, bei denen das Zahlungssystem von Apple weiterhin gilt, @capgo/native-purchases implementiert StoreKit und Google Play Billing direkt. Diese Vorgehensweise bietet Ihnen auch den Vorteil der robusten Zahlungsinfrastruktur von Stripe, niedrigerer Bearbeitungsgebühren (3% vs 30%) und viel schnelleren Auszahlungen (Tage statt Monate) im Vergleich zum Zahlungssystem von Apple.

Denken Sie daran, dass Sie alle Kundenunterstützung und Rückgaberegelungen direkt bearbeiten müssen, da diese Transaktionen außerhalb des Apple-Ökosystems stattfinden.

Haben Sie Stripe Payment Links in Ihrer Capacitor-App implementiert? Teilen Sie Ihre Erfahrungen in den Kommentaren!

Häufig gestellte Fragen

Q: Ist diese Vorgehensweise mit den Richtlinien von Apple vereinbar?
A: Ja, ab dem 1. Mai 2025, gestattet Apple das Linken auf externe Zahlungsmethoden für digitale Güter und Dienstleistungen in Apps, die im US-App-Store verteilt werden, vorausgesetzt, Sie enthalten die erforderlichen Offenlegungen.

Q: Muss ich bei Verwendung externer Zahlungsmethoden Apples Provision zahlen?
A: Nein, eines der Hauptvorteile der neuen Regeln ist, dass Zahlungen, die außerhalb von Apples System durchgeführt werden, nicht von ihrer Provision betroffen sind.

Q: Muss mein Unternehmen in den Vereinigten Staaten ansässig sein, um von diesen neuen Regeln profitieren zu können?
A: Nein, jede Firma aus der ganzen Welt kann externe Zahlungsmethoden implementieren, solange die App im US-App-Store verfügbar ist und die Benutzer, die die Kaufvorgänge durchführen, in den Vereinigten Staaten ansässig sind. Die Regel gilt für den Markt (US-App-Store) und die Standorte der Benutzer, nicht für den Standort des Unternehmens. Dies bedeutet, dass Entwickler aus Europa, Asien, Südamerika oder überall sonst Stripe Payment Links für ihre US-basierten Kunden implementieren können.

Q: Was passiert, wenn ein Benutzer außerhalb der Vereinigten Staaten versucht, die externe Zahlungsoption zu nutzen?
A: Sie sollten eine Regionserkennung (wie im Artikel gezeigt) implementieren, um nur Benutzern in den Vereinigten Staaten externe Zahlungsoptionen anzubieten. Für andere Regionen sollten Sie weiterhin Apples in-App-Kaufsystem verwenden.

Q: Kann ich dies für physische Güter oder Dienstleistungen verwenden, die außerhalb der App konsumiert werden?
A: Ja, Apple hat immer externen Zahlungsmethoden für physische Güter und Dienstleistungen erlaubt, die außerhalb der App konsumiert werden (wie Fahrdienstleistungen oder Lebensmittellieferungen).

Fortsetzen Sie von Stripe Payments in Capacitor: Neue Apple-Richtlinien

Wenn Sie Stripe Payments in __CAPGO_KEEP_0__: Neue Apple-Richtlinien Stripe Payments in Capacitor: New Apple Guidelines Verschlüsselung zur Implementierungsdetail in Verschlüsselung, Compliance zur Implementierungsdetail in Compliance, __CAPGO_KEEP_0__ Sicherheits-Scanner zur Produktworkflow in Capgo Sicherheits-Scanner, Capgo Sicherheit Capgo Sicherheit für den Produktworkflow in Capgo Sicherheit und Capgo Vertrauenszentrum für den Produktworkflow in Capgo Vertrauenszentrum.

Live-Updates für Capacitor-Apps

Wenn ein Web-Schicht-Bug live ist, liefern Sie die Reparatur über Capgo anstatt Tage auf die Warteschleife des App-Store zu warten. Die Benutzer erhalten die Aktualisierung im Hintergrund, während native Änderungen im normalen Review-Prozess bleiben.

Jetzt loslegen

Aktuelle Beiträge aus unserem Blog

Capgo bietet Ihnen die besten Einblicke, die Sie benötigen, um eine echte professionelle Mobil-App zu erstellen.