Stripe-Zahlungen in Capacitor: Implementierung von Zahlungslinks nach neuen Apple-Richtlinien
Ab dem 1. Mai 2025 hat Apple erhebliche Änderungen an seinen Richtlinien für die App Store-Bewertung vorgenommen, nachdem das Gericht im Fall Epic v. Apple Epic v. Apple Fall. These changes specifically allow app developers in the United States to link out to external payment methods for digital goods and services, opening up alternatives to Apple’s in-app purchase system.
Die epische Schlacht, die die Mobile Zahlungen für immer veränderte
The path to this moment has been long and contentious. It all began in August 2020 when Epic Games, the creator of the wildly popular game Fortnite, deliberately violated Apple’s App Store guidelines by implementing a direct payment option that bypassed Apple’s 30% commission. Apple promptly removed Fortnite from the App Store, and Epic responded by filing a lawsuit challenging Apple’s control over iOS app distribution and in-app payments.
After years of legal battles, appeals, and counter-appeals, the courts finally ruled that Apple must allow developers to direct users to alternative payment methods outside their apps. This decision fundamentally changes the economics of the App Store ecosystem, which has been operating under the same basic financial model since its inception in 2008.
Die Endentscheidung - Keine weiteren Beschwerden
Was macht diese Entscheidung besonders bedeutend ist, ist, dass sie endgültig ist und nicht weiter angefochten werden kann. Das Supreme Court hat Anfang 2025 Apples Berufung abgelehnt, was die Entscheidung 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 Angriffe rückgängig machen kann.
Gleichbehandlung durch Gesetz garantiert
Am wichtigsten ist, dass die Entscheidung explizit festhält, dass Apple keine Apps diskriminieren darf, die externe Zahlungsmethoden verwenden. Das Gericht hat Apple explizit davon abgeraten:
- Zusätzliche Gebühren zu erheben oder zusätzliche Anforderungen an Apps zu stellen, die externe Zahlungsmethoden verwenden
- Apps, die ausschließlich Apples IAP-System verwenden, bevorzugt in den Suchergebnissen oder im Vordergrund zu stellen
- Technische Maßnahmen zu ergreifen, um externe Zahlungserfahrungen gegenüber Apples eigenen System schlechter zu machen
- Bürdenvolle 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 geschlossene Gartenansatz dar und markiert einen wichtigen Wendepunkt in der Art und Weise, wie die Monetarisierung von mobilen Apps funktionieren kann. Für Entwickler, die sich seit langem über Apples 30-Prozent-Kommission (auf 15 Prozent reduziert für kleine Unternehmen) 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:
-
Kostenreduzierung bei Zahlungsverarbeitung: 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 $ pro Transaktion beträgt. Diese Differenz kann Ihre Gewinnmargen erheblich erhöhen.
-
Beschleunigte 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.
-
Einfachere Rückerstattungsprozesse: Verwenden Sie Rückerstattungen direkt über Stripes Dashboard anstatt durch Apples komplexere Rückerstattungssystem.
Diese Kosteneinsparungen und verbesserte Cash-Flow können game-changing sein, insbesondere für kleinere Entwickler und Unternehmen.
In diesem Artikel werden wir Ihnen zeigen, wie Sie Stripe Payment Links in Ihrem Capacitor-App implementieren können, um diese neuen Regeln zu nutzen, während Sie gleichzeitig die von Apple aktualisierten Richtlinien einhalten. aktualisierte Richtlinien.
Diese Implementierung basiert auf Stripe’s offiziellem Dokumentation für Zahlungslinks, angepasst speziell für Capacitor-Apps.
Verständnis der neuen Richtlinien
Die aktualisierten Richtlinien für die App Store-Bewertung erlauben Entwicklern nun, Benutzer auf externe Websites für Zahlungsverarbeitung zu leiten, insbesondere für digitale Güter und Abonnements. Diese Änderung ist derzeit nur auf Apps im US-App Store anwendbar.
Hauptsächliche Punkte zum Verstehen:
- Sie können jetzt auf externe Zahlungsoptionen für digitale Güter innerhalb Ihrer App verweisen
- Dies gilt nur für Apps im US-App Store
- Sie müssen weiterhin die Anforderungen von Apples Offenlegungspflichten erfüllen
- Sie bleiben für alle Kundensupport und Rückgabehandlungen verantwortlich
Einrichten von Stripe-Zahlungslinks in Ihrer Capacitor-App
Lassen Sie uns in die technische Implementierung eintauchen:
Schritt 1: Erstellen Sie einen Zahlungslink in der Stripe-Dashboard
Erstellen Sie zunächst einen Zahlungslink in Ihrem Stripe-Dashboard:
- Navigieren Sie zur Zahlungslinks-Sektion in Ihrem Stripe-Dashboard
- Click “+ New” to create a new payment link
- Definieren Sie Ihre Produkt- oder Abonnementdetails
- Unter den „Nach Zahlung“-Einstellungen wählen Sie „Keine Bestätigungsseite anzeigen“
- Setzen Sie einen universellen Link als Ihre Erfolg-URL (wir konfigurieren dies später)
- Klicken Sie auf „Link erstellen“ um Ihren Zahlungslink zu generieren.
Schritt 2: Konfigurieren Sie universelle Links in Ihrer Capacitor-App
Um Nutzer nach Zahlungserledigung wieder zu Ihrer 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 bei
https://yourdomain.com/.well-known/apple-app-site-association -
Stellen Sie sicher, dass sie mit der richtigen MIME-Typen dient
application/json -
Konfigurieren Sie Ihr Capacitor-App, um universelle Links zu verarbeiten, indem Sie die entsprechende Berechtigung hinzufügen. Zunächst 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;
- Die Berechtigung "Associated Domains" in Ihrem Xcode-Projekt hinzufügen:
- Öffnen Sie Ihr Xcode-Projekt
- Wählen Sie Ihr App-Ziel
- Gehen Sie zu "Signierung und Fähigkeiten"
- Klicken Sie auf "+ Fähigkeit" und wählen Sie "Associated Domains"
- 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 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: Implementieren Sie die Zahlungs-Schaltfläche in Ihrem Capacitor-App
Now, 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');
}
Weshalb Safari wichtig ist: Öffnen Sie die Zahlungslink in Safari (via
window.open) anstatt in einer in-app-Browser, ist vorteilhaft, weil Nutzer, die ihre Zahlungsdaten mit Stripe Link zuvor 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 erheblich die Abbruchraten senkt.
Schritt 5: Universal Links in Ihrer App verarbeiten
Konfigurieren Sie Ihre App, um die universellen Links zu verarbeiten, wenn Benutzer zurückgeleitet werden:
- Installieren Sie zunächst das App-Plugin.
npm install @capacitor/app
- Zuerst installieren Sie das App-Plugin:
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
}
Registrieren Sie das App-Plugin in Ihrer App:
Schließlich müssen Sie auf Ihrem Server eine Webhook-Konfiguration für erfolgreiche Zahlungen vornehmen.
// 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
Let’s be clear: the Epic v. Apple ruling has fundamentally changed the mobile payment landscape. Not only does it directly impact iOS apps, but it also strengthens the position of Android developers who have been using external payment methods.
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 vor potenziellen 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 war immer weniger restriktiv bei externen Zahlungsmethoden als Apple, und jetzt, mit dem gesetzlichen Vorbild etabliert, besteht bei der Implementierung von Stripe oder anderen externen Zahlungsdienstleistern in Ihren Android-Anwendungen praktisch kein Risiko. 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 Google Play Store keine gleichen Einschränkungen bei externen Zahlungsmethoden hat, können Sie die gleiche Stripe-Zahlungslinks-Ansicht ohne besondere Offenlegungsdialoge verwenden.
Um die tiefen Verlinkungen (entsprechend Universal-Links auf iOS) zu handhaben, müssen Sie:
- Die App-Links-Einstellungen in Ihrer
AndroidManifest.xmlum die Redirect-URL zu handhaben - Create a
.well-known/assetlinks.jsonDatei auf Ihrem Domain mit Ihren Anwendungsdetails - Verwenden Sie die gleiche
appUrlOpenZuhörer-Logik, um erfolgreiche Zahlungen zu verarbeiten
Die Schönheit von Capacitor besteht darin, dass sich die tatsächliche Zahlungsablauf code nach der Implementierung der plattform-spezifischen Konfigurationen auf beiden Plattformen nicht ändert.
Zahlungs-UI erstellen
Hier ist ein Beispiel für eine Zahlungsbutton-Komponente in Vue, die Sie in Ihr Capacitor-Projekt 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>
Behandlung unterschiedlicher Regionen
Da die neuen Apple-Richtlinien nur für Apps im US-App-Store gelten, müssen Sie eine Strategie entwickeln, um die Benutzerregion zu erkennen und die entsprechende Zahlungsmethode anzuwenden. Hier ist eine zuverlässigere Vorgehensweise 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);
}
}
Dieser Ansatz verwendet die kostenlose ipapi.co Dienstleistung, 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.
Hinweis: Während dieser Ansatz funktioniert, ist es wichtig zu beachten, dass 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.
Genauerer Standortdetection mit Capacitor-Plugins
Für eine genauere Standortdetection können Sie die Capacitor-Geolokalisierungs-Plugin zusammen mit @capgo/capacitor-nativegeocoder verwenden, um das Benutzerland mit höherer Genauigkeit zu bestimmen:
- Zuerst installieren Sie die erforderlichen Plugins:
npm install @capacitor/geolocation @capgo/capacitor-nativegeocoder
- Konfigurieren Sie die Plugins in Ihrem Capacitor-Projekt. Fügen Sie die folgenden Zeilen in Ihre
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;
- Implementieren Sie die Standortbasierte 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. Zuerst 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.
Denken Sie daran, die notwendigen Berechtigungen in Ihren info.plist (iOS) und AndroidManifest.xml (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, zu bestimmen, ob ein Benutzer für externe Zahlungsoptionen unter den neuen Apple-Richtlinien berechtigt ist.
Zahlungsabrechnungen verwalten
Ein wichtiger Vorteil 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 einer Abonnementverwaltungsoberfläche
Fügen Sie eine Abonnementverwaltungsoberflä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 Abonnementverwaltung
Stripe bietet ein Kundenportal, mit dem Nutzer 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 App-Store-Konformität
Einschließlich angemessener Offenlegungen über externe Kaufvorgänge
- Beachten Sie die erforderlichen Hinweise zu externen Kaufvorgängen
- Versuchen Sie nicht, Apple's Provision auf Kaufvorgänge innerhalb der App zu umgehen
- Kommunizieren Sie klar mit den Nutzern, dass Apple für die Transaktion nicht verantwortlich ist
- Hier ist ein Beispiel für die Implementierung des erforderlichen Offenlegungsmodals:
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);
}
}
Ihr Implementierung testen
Zur Überprüfung Ihrer Implementierung:
- Klicken Sie auf Ihren Zahlungsbutton in Ihrer App, der die Offenlegung und dann die Stripe-Zahlungseite öffnen sollte
- Ein Testzahlung mit Stripe-Testkarte abschließen
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.completedereignis
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 im US-App-Store anwendbar ist, bietet er eine wichtige Alternative zum Zahlungssystem von Apple.
Indem Sie Stripe-Zahlungslinks 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, implementiert @capgo/native-purchases 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. implements StoreKit and Google Play Billing directly. This approach also gives you the advantage of Stripe’s robust payment infrastructure, lower processing fees (3% vs 30%), and much faster payouts (days instead of months) compared to Apple’s in-app purchase system.
Denken Sie daran, dass Sie alle Kundenanliegen und Rückgabeanfragen direkt bearbeiten müssen, da diese Transaktionen außerhalb des Apple-Ökosystems stattfinden.
Haben Sie Stripe-Zahlungen in Ihrem Capacitor-App implementiert? Teilen Sie Ihre Erfahrungen in den Kommentaren mit!
FAQs
W: Ist diese Vorgehensweise mit den Richtlinien von Apple vereinbar?
A: Ja, ab dem 1. Mai 2025, gestattet Apple das Linken externer Zahlungsmethoden für digitale Güter und Dienstleistungen in Apps, die im U.S. App Store verteilt werden, vorausgesetzt, Sie enthalten die erforderlichen Offenlegungen.
W: Muss ich bei Verwendung externer Zahlungsmethoden eine Provision an Apple zahlen?
A: Nein, eines der Hauptvorteile der neuen Regeln ist, dass Zahlungen, die außerhalb des Apple-Systems verarbeitet werden, nicht der Provision unterliegen.
W: Muss mein Unternehmen in den Vereinigten Staaten ansässig sein, um diese neuen Regeln nutzen zu können?
A: Nein, jede Firma aus der ganzen Welt kann externe Zahlungsmethoden implementieren, solange die App im U.S. 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 (U.S. App Store) und die Standort der Benutzer, nicht für den Standort des Unternehmens. Dies bedeutet, dass Entwickler aus Europa, Asien, Südamerika oder überall sonst externe Zahlungslinks für ihre US-amerikanischen Kunden implementieren können.
W: 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 externe Zahlungsoptionen nur für Benutzer in den Vereinigten Staaten anzubieten. Für andere Regionen sollten Sie weiterhin Apples In-App-Kaufsystem verwenden.
W: Kann ich dies für physische Güter oder Dienstleistungen nutzen, 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 Lebensmittellieferungen).
Fortsetzen von Stripe Payments in Capacitor: Neue Apple-Richtlinien
Wenn Sie verwenden Stripe Payments in Capacitor: Neue Apple-Richtlinien Um Sicherheit und Compliance zu planen, verbinden Sie es mit Verschlüsselung Verschlüsselung für die Implementierungsdetail in Verschlüsselung, Compliance Compliance für die Implementierungsdetail in Compliance, Capgo Sicherheits-Scanner für den Produktworkflow in Capgo Sicherheits-Scanner, Capgo Sicherheit zur Produktworkflow in Capgo Sicherheit und Capgo Vertrauenszentrum zur Produktworkflow in Capgo Vertrauenszentrum.