Implementierung von Stripe-Zahlungslinks in Capacitor-Apps unter Einhaltung der neuen Apple-Richtlinien
Ab dem 1. Mai 2025 hat Apple erhebliche Änderungen an seinen Richtlinien für die App Store-Bewertung vorgenommen, die sich aus dem Urteil im Epic v. Apple-Verfahrenergeben haben. Diese Änderungen ermöglichen es Entwicklern von Apps in den Vereinigten Staaten, Links zu externen Zahlungsmethoden für digitale Güter und Dienstleistungen zu erstellen, was alternative Möglichkeiten zur Apple-App-Bezahlsystematik eröffnet.
The ewige Schlacht, die die Mobilzahlungen für immer veränderte
Der Weg zu diesem Moment war lang und umstritten. Alles begann im August 2020, als Epic Games, der Schöpfer des wild beliebten Spiels Fortnite, bewusst Apples Richtlinien für den App Store verletzte, indem er eine direkte Zahlungsoption implementierte, die Apples 30-prozentigen Provision umging. Apple entfernte Fortnite sofort aus dem App Store, und Epic reagierte mit einer Klage, mit der Apple seine Kontrolle über die iOS-App-Verteilung und die In-App-Zahlungen anfocht.
Nach Jahren der Rechtsstreitigkeiten, Berufungen und Gegenberufungen, haben die Gerichte schließlich entschieden, dass Apple Entwicklern erlauben muss, Benutzern alternative Zahlungsmethoden außerhalb ihrer Apps anzubieten. Diese Entscheidung ändert grundlegend die Wirtschaft des App Store Ökosystems, das seit seiner Gründung 2008 unter demselben grundlegenden finanziellen Modell operiert.
Das Endgültige Urteil - Keine weiteren Berufungen
Was diese Entscheidung besonders bedeutend macht, ist, dass sie endgültig und nicht weiter angefochten werden kann. Das Supreme Court lehnte Anfang 2025 Apples Berufung ab, was das Urteil des unteren Gerichts als Gesetz des Landes festigte. Dies bedeutet, dass Entwickler externe Zahlungsmethoden mit Vertrauen implementieren können, dass Apple diese Entscheidung nicht durch weitere rechtliche Anfechtungen rückgängig machen kann.
Gleichbehandlung durch Gesetz garantiert
Am wichtigsten ist, dass das Urteil explizit festhält, dass Apple gegen Apps, die externe Zahlungsmethoden verwenden, diskriminieren darf. Das Gericht verbot Apple ausdrücklich, dass: __CAPGO_KEEP_0__
- Charging zusätzliche Gebühren oder die Auflegung zusätzlicher Anforderungen an Apps, die externe Zahlungsmethoden verwenden
- Vorzugliche Behandlung in den Suchergebnissen oder Features für Apps, die ausschließlich Apples IAP-System verwenden
- Verwendung technischer Maßnahmen, um externe Zahlungserfahrungen gegenüber Apples eigenen System zu unterlegen
- Erlegung von aufwändigen Offenlegungserfordernissen über grundlegende Verbraucherinformationen hinaus
Diese expliziten Schutzmaßnahmen bedeuten, dass Entwickler Stripe oder andere externe Zahlungsdienstleister ohne Angst vor subtiler Vergeltung oder Diskriminierung von Apple implementieren können. Das Spielfeld wurde rechtlich ausgewogen, und Apple muss alle Apps gleich behandeln, unabhängig von ihren Zahlungsmethodenwahl.
Diese Entscheidung stellt einen der bedeutendsten Herausforderungen für Apples walled Garden-Ansatz dar und markiert einen wichtigen Wendepunkt in der Art und Weise, wie die mobile App-Monetarisierung funktionieren kann. Für Entwickler, die sich lange ü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 Kundenexperience.
Finanzielle Vorteile der Verwendung von Stripe gegenüber Apples In-App-Käufen
Die finanziellen Auswirkungen dieser Änderung sind erheblich für Entwickler:
-
Reduzierte 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 Euro pro Transaktion beträgt. Diese Differenz kann Ihre Gewinnmargen erheblich erhöhen.
-
Rapide Auszahlungen: Bei Apple warten Sie typischerweise 45-90 Tage, um Ihre Gelder zu erhalten. Stripe hingegen leitet Zahlungen innerhalb von 2-3 Geschäftstagen auf Ihr Bankkonto ein.
-
Simplifizierter Rückerstattungsprozess: Verwenden Sie Rückerstattungen direkt über Stripe’s Dashboard anstatt durch Apples komplexes Rückerstattungssystem zu gehen.
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 sich diese neuen Regeln zunutze zu machen, während Sie gleichzeitig die Vorgaben von Apples aktualisierten Richtlinien.
erfüllen. Diese Implementierung basiert auf, adapted specifically for Capacitor apps.
, die speziell für __CAPGO_KEEP_0__-Apps angepasst wurde.
Verständnis der Neuen Richtlinien
Die aktualisierten Richtlinien für die App Store Review nun erlauben Entwicklern, Benutzern direkt auf externe Websites zu leiten, um Zahlungen zu verarbeiten, insbesondere für digitale Güter und Abonnements. Diese Änderung ist derzeit nur auf Apps in den USA App Store anwendbar.
- Sie können jetzt auf externe Zahlungsoptionen für digitale Güter innerhalb Ihrer App verlinken
- Dies gilt nur für Apps im US-App-Store
- Sie müssen weiterhin die Offenlegungspflichten von Apple einhalten
- Sie bleiben für alle Kundensupport und Rückgabehandlungen verantwortlich
Einrichten von Stripe-Zahlungslinien in Ihrer Capacitor-App
Lassen Sie uns in die technische Umsetzung eintauchen:
Schritt 1: Erstellen Sie eine Zahlungslinie in Stripe-Dashboard
Erstellen Sie zunächst eine Zahlungslinie in Ihrem Stripe-Dashboard:
- Navigieren Sie zur Zahlungslinien-Sektion in Ihrem Stripe-Dashboard
- Klicken Sie auf „+ Neues“ um eine neue Zahlungslinie zu erstellen
- Definieren Sie Ihre Produkt- oder Abonnement-Daten
- Unter den „Nach Zahlung“-Einstellungen wählen Sie „Keine Bestätigungsseite anzeigen“
- Setzen Sie eine universelle Verknüpfung als Ihre Erfolg-URL (wir konfigurieren dies später)
- Klicken Sie auf „Link erstellen“ um Ihre Zahlungsverknüpfung zu generieren
Schritt 2: Konfigurieren Sie Universelle Links in Ihrer Capacitor-App
Um Benutzer nach Abschluss der Zahlung wieder in Ihre App zurückzuleiten, konfigurieren Sie universelle Links:
- Erstellen Sie ein
apple-app-site-associationDatei auf Ihrem Domain:
{
"applinks": {
"apps": [],
"details": [
{
"appIDs": ["YOURTEAMID.com.yourdomain.yourapp"],
"components": [
{
"/": "/checkout_redirect*",
"comment": "Matches any URL whose path starts with /checkout_redirect"
}
]
}
]
}
}
-
Hosten Sie diese Datei unter
https://yourdomain.com/.well-known/apple-app-site-association -
Stellen Sie sicher, dass sie mit dem richtigen MIME-Typ gesendet wird
application/json -
Konfigurieren Sie Ihre Capacitor-App, 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;
- Fügen Sie der Xcode-Projekt die Berechtigung „Associated Domains“ hinzu:
- Öffnen Sie Ihr Xcode-Projekt
- Wählen Sie Ihr App-Target
- Gehe zu ‘Zugriff und Berechtigungen’
- Klicke auf ‘+ Fähigkeit’ und wähle ‘Zugeordnete Domains’
- Hinzufügen
applinks:yourdomain.com
Schritt 3: Erstelle eine Fallback-Seite
Erstelle eine Fallback-Seite an der Redirect-URL, um Fälle zu behandeln, in denen die App 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: Implementiere die Zahlungsanwendung in deiner Capacitor App
Füge nun die Zahlungsanwendung zu deiner 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');
}
Wer ist Safari?: Öffne die Zahlungsanbindung in Safari (via
window.open) anstatt in einem in-app-Browser, da Nutzer, die ihre Zahlungsdaten zuvor bei Stripe Link gespeichert haben, ihre Zugangsdaten automatisch zur Verfügung haben. Dies schafft eine glattere Checkout-Erfahrung, bei der Nutzer ihre Kreditkarteninformationen nicht erneut eingeben müssen, was die Abbruchraten erheblich senkt.
Schritt 5: Behandle Universal Links in deiner App
Konfiguriere deine App, um die Universal Links zu behandeln, wenn Nutzer zurückgeleitet werden:
- Installieren Sie zunächst das App-Plugin:
npm install @capacitor/app
- 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 eines Webhooks für die Bestellabwicklung:
Zum Schluss müssen Sie auf Ihrem Server einen Webhook einrichten, 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 Entscheidung im Fall Epic v. Apple hat das mobile Zahlungsumfeld grundlegend verändert. Sie wirkt nicht nur direkt auf iOS-Apps aus, sondern stärkt auch die Position von Android-Entwicklern, die seit langem externe Zahlungsmethoden verwenden.
Android-Entwickler können jetzt externe Zahlungslösungen mit voller Sicherheit implementieren. Das von der Apple-Entscheidung gesetzte Präzedenzfall schützt Entwickler auf allen Plattformen vor potenziellen zukünftigen Einschränkungen. Diese Gerichtsentscheidung hat die Tatsache bestätigt, was viele Android-Entwickler seit Jahren tun - alternative Zahlungsoptionen mit niedrigeren Gebühren anbieten.
Googles Play Store hat sich immer weniger restriktiv gegenüber externen Zahlungsmethoden gezeigt als Apple, und jetzt, mit dem gesetzlichen Präzedenzfall etabliert, besteht praktisch kein Risiko mehr, Stripe oder andere externe Zahlungsanbieter in Ihren Android-Apps zu implementieren. Sie können diese Implementierungen mit der Gewissheit vorantreiben, dass Sie auf solidem rechtlichem Boden stehen.
Die Implementierung, die wir für iOS behandelt haben, funktioniert nahezu identisch auf Android-Geräten. Da Googles Play Store keine gleichen Einschränkungen auf externe Zahlungsmethoden hat, können Sie den gleichen Ansatz für Stripe-Zahlungslinks ohne besondere Disclosure-Dialoge verwenden.
Um die tiefen Verlinkungen (entsprechend Universal Links auf iOS) zu bearbeiten, müssen Sie Folgendes tun:
- Einrichten Sie App Links in Ihrem
AndroidManifest.xmlum die Redirect-URL zu verarbeiten - Erstellen Sie ein
.well-known/assetlinks.jsonDatei auf Ihrem Domain mit Ihren Anwendungsdetails - Verwenden Sie die gleiche
appUrlOpenZuhörerlogik, 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.
Erstellen Sie eine Zahlungsbenutzeroberfläche
Hier ist ein Beispiel für eine Zahlungsbuttonkomponente in Vue, die Sie in Ihrem Capacitor-Anwendungs hinzufü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>
Behandeln Sie verschiedene Regionen
Da die neuen Apple-Richtlinien nur auf Apps in der US-App-Store anwendbar sind, benötigen Sie eine Strategie, um die Benutzerregion zu erkennen und die entsprechende Zahlungsmethode anzuwenden. Hier ist eine zuverlässigere Ansatz mit 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);
}
}
Diese Ansätze verwenden die kostenlose ipapi.co Dienst zur Bestimmung der Landesgruppe eines Benutzers auf Basis seiner IP-Adresse. Sie könnten auch andere Geolokalisierungsdienste wie MaxMind verwenden oder diese Überprüfung serverseitig durchführen, um die Sicherheit zu erhöhen.
Hinweis:
More Accurate Location Detection with Capacitor Plugins
For more accurate location detection, you can use the Capacitor Geolocation plugin along with @capgo/capacitor-nativegeocoder to determine the user’s country with higher precision:
- Für eine genauere Standortdetection können Sie den __CAPGO_KEEP_0__-Geolokalisierungsdienst zusammen mit @__CAPGO_KEEP_1__/__CAPGO_KEEP_2__-nativegeocoder verwenden, um die Landesgruppe des Benutzers mit höherer Genauigkeit zu bestimmen:
npm install @capacitor/geolocation @capgo/capacitor-nativegeocoder
- Configure the plugins in your Capacitor project. Add the following to your
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;
- Konfigurieren Sie die Plugins in Ihrem __CAPGO_KEEP_0__-Projekt. Fügen Sie die folgenden Zeilen zu Ihrem
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);
}
}
Implementieren Sie die regionenbasierte Standortdetection:
Diese Implementierung bietet eine genauere Möglichkeit, zu bestimmen, ob ein Benutzer physisch in den Vereinigten Staaten ansässig ist. Zunächst versucht sie, die GPS-Funktion des Geräts und den native Geocoder zu verwenden, um die Landesgruppe zu bestimmen. Wenn dies fehlschlägt (wegen Berechtigungsproblemen oder anderen Fehlern), fällt sie auf die IP-basierte Erkennung zurück. info.plist Denken Sie daran, die notwendigen Berechtigungen in Ihren AndroidManifest.xml (iOS) und</code> (Android) Dateien hinzuzufü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, festzustellen, ob ein Benutzer für externe Zahlungsoptionen unter den neuen Apple-Richtlinien berechtigt ist.
Abonnementsverwaltung
Ein wichtiger Vorteil der Verwendung von Stripe für Zahlungen ist die Möglichkeit, Angebote und die Verwaltung von Abonnements anzubieten. Hier erfahren Sie, wie Sie die Abonnementsverwaltung in Ihrer Capacitor-App durchführen:
1. Erstellen einer Abonnementsverwaltungsoberfläche
Fügen Sie eine Abonnementsverwaltungsoberfläche in Ihrer App hinzu, 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 Abonnementsverwaltung
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;
}
Zur Gewährleistung der Einhaltung der Richtlinien des App Stores:
Fügen Sie angemessene Offenlegungen über externe Kaufvorgänge hinzu
- Zur Gewährleistung der Einhaltung der Richtlinien des App Stores:
- Implementieren Sie ein Modalsheet, das Benutzern mitteilt, dass sie die App verlassen (wie von Apple gefordert)
- Versuchen Sie nicht, Apples Provision auf innerhalb der App getätigten Kaufleistungen zu umgehen
- 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 Disclosure-Modals:
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
Um Ihre Implementierung zu testen:
- Klicken Sie auf Ihren Zahlungsbutton in Ihrer App, der das Disclosure-Modalsheet anzeigen und dann die Stripe-Zahlungsseite öffnen sollte
- Führen Sie einen Testkauf mit der Stripe-Testkarte aus
4242 4242 4242 4242 - Nach Zahlung sollten Sie über die universelle Link-Adresse wieder in Ihre App zurückgeleitet werden
- Überprüfen Sie, ob Ihr Webhook das
checkout.session.completed__CAPGO_KEEP_0__
Zusammenfassung
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 in der US-App Store anwendbar ist, bietet er eine wichtige Alternative zum Kaufsystem von Apple.
Mit Stripe Payment Links und Capacitor können Sie schnell eine gestreamte Zahlungsabwicklung implementieren, während Sie die Einhaltung der Richtlinien von Apple aufrechterhalten. Für Benutzer außerhalb der USA, bei denen das Kaufsystem von Apple noch anwendbar ist, @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 Kaufsystem von Apple.
Denken Sie daran, dass Sie alle Kundenunterstützung und Rückgabeanfragen direkt bearbeiten müssen, da diese Transaktionen außerhalb des Ökosystems von Apple stattfinden.
Haben Sie Stripe Payment Links in Ihrer Capacitor-Anwendung implementiert? Teilen Sie Ihre Erfahrungen in den Kommentaren unten!
Häufig gestellte Fragen
Q: Ist diese Vorgehensweise mit den Richtlinien von Apple im Einklang?
A: Ja, ab dem 1. Mai 2025 erlaubt Apple die Verlinkung auf externe Zahlungsmethoden für digitale Güter und Dienstleistungen in Apps, die in der US-App Store verteilt werden, vorausgesetzt, Sie enthalten die erforderlichen Offenlegungen.
Q: Muss ich bei der Verwendung von externen Zahlungsmethoden Apples Provision zahlen?
A: Nein, eines der Hauptvorteile der neuen Regeln ist, dass Zahlungen, die außerhalb des Apple-Systems verarbeitet werden, nicht der Provision unterliegen.
Q: Muss mein Unternehmen in den Vereinigten Staaten ansässig sein, um sich dieser neuen Regeln zu bedienen?
A: Nein, jede Firma aus der ganzen Welt kann externe Zahlungsmethoden implementieren, solange die App im US-App-Store verfügbar ist und die Nutzer, 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 Nutzer, nicht für den Standort des Unternehmens. Das bedeutet, dass Entwickler aus Europa, Asien, Südamerika oder überall anders Stripe Payment Links für ihre US-basierten Kunden implementieren können.
Q: Was passiert, wenn ein Nutzer außerhalb der USA versucht, die externe Zahlungsoption zu nutzen?
A: Sie sollten eine Regionserkennung (wie im Artikel gezeigt) implementieren, um nur Nutzern in den USA externe Zahlungsoptionen anzubieten. Für andere Regionen sollten Sie weiterhin das in-App-Kaufsystem von Apple 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 externe Zahlungsmethoden für physische Güter und Dienstleistungen erlaubt, die außerhalb der App konsumiert werden (wie Fahrdienstleistungen oder Essenlieferungen).
Keep going from Stripe Payments in Capacitor:
Wenn Sie Stripe Payments in __CAPGO_KEEP_0__: New Apple Guidelines verwenden Stripe Payments in Capacitor: New Apple Guidelines Verschlüsselung Wenn Sie Stripe Payments in __CAPGO_KEEP_0__: New Apple Guidelines verwenden für die Implementierungsdetails in der Verschlüsselung Kongruenz für die Implementierungsdetails in der Kongruenz Capgo Sicherheits-Scanner für den Produktworkflow in Capgo Sicherheits-Scanner Capgo Sicherheit für den Produktworkflow in Capgo Sicherheit und Capgo Trust Center für den Produktworkflow in Capgo Trust Center