SubSovereign
All guides

SubSovereign auf Flutter — Integrationsanleitung

Dieser Leitfaden behandelt das subsovereign-Flutter-Paket (sdk-flutter/) — einen Daten-Client und ein natives Paywall-Widget. Die Paywall, die du im SubSovereign-Dashboard erstellst, wird hier als echtes Flutter-Paywall-Widget aus derselben Konfiguration wie die iOS-, Android-, Web-, React- und React-Native-SDKs gerendert.

Vorbereitung

Ein laufender SubSovereign-Server, eine im Dashboard registrierte App (mit einer appId und einem SDK-Rollen-API-Key), verknüpfte Zugangsebenen (z. B. pro) mit deinen Store-Produkten sowie eine veröffentlichte Paywall. Die eigentliche Kaufabwicklung übernimmst du mit deinem üblichen Billing-Plugin (z. B. in_app_purchase); SubSovereign prüft und erfasst den Kauf anschließend.

Schritt 1 — Installation

Füge das Paket hinzu (Pfad/Git-Abhängigkeit, solange es noch nicht auf pub.dev verfügbar ist):

dependencies:
  subsovereign:
    path: ../sdk-flutter   # or a git dependency
import 'package:subsovereign/subsovereign.dart';

Schritt 2 — Einmalige Konfiguration beim App-Start

SubSovereign.instance.configure(SubSovereignConfig(
  apiKey:  'YOUR_SDK_KEY',
  appId:   'your-app-id',
  baseUrl: 'https://subs.yourdomain.com/api/v1', // YOUR self-hosted server
  userId:  currentUser.id,                        // your own stable user id
  locale:  'en',
));

Verwende eine stabile userId — derselbe Wert überall, damit der Zugang nutzerübergreifend auf allen Geräten konsistent bleibt.

Schritt 3 — Verfügbaren Zugang prüfen

try {
  final result = await SubSovereign.instance.checkEntitlements();
  if (result.hasAccess) {
    showPremiumContent();
  } else {
    showPaywall();
  }
} on SubSovereignException catch (e) {
  // Keep the user on their last-known access and retry later.
  debugPrint('Entitlement check failed: $e');
}

Schritt 4 — Paywall anzeigen und verkaufen

final config = await SubSovereign.instance.getPaywallConfig(platform: 'android');

Paywall(
  config: config,
  onSelectProduct: (productId) => buy(productId), // your billing plugin
)

Nach erfolgreicher Kaufabwicklung lässt du den Server die Transaktion verifizieren, prüfst erneut und gibst den Zugang frei:

final granted = await SubSovereign.instance.validateGooglePurchase(
  purchaseToken: purchase.verificationData.serverVerificationData,
  productId: purchase.productID,
  accessLevelId: 'pro',
);
if (granted) {
  final result = await SubSovereign.instance.checkEntitlements();
  if (result.hasAccess) unlockProFeatures();
}

Datenschutz (GDPR)

await SubSovereign.instance.recordConsent(purpose: 'analytics', granted: true);

EU-Widerrufsbutton (Compliance Passport)

Verkaufst du Abonnements an EU-Verbraucher online, verlangt die Richtlinie (EU) 2023/2673 einen klar gekennzeichneten Widerrufsbutton:

WithdrawalButton(subscriptionId: sub.id)

Er zeigt den auffälligen Button an, bestätigt einmalig und sendet idempotent (ein Netzwerk-Retry kann nie zwei Widerrufe erzeugen). Für benutzerdefinierte Oberflächen nutze SubSovereign.instance.withdraw(subscriptionId: …) und getWithdrawalConfig().

Schnellreferenz

Du möchtest… Rufe auf
SDK einrichten SubSovereign.instance.configure(SubSovereignConfig(…))
Verfügbaren Zugang prüfen await checkEntitlements()EntitlementResult.hasAccess
Veröffentlichte Paywall laden await getPaywallConfig(platform: 'android')
Sie nativ rendern Paywall(config: …, onSelectProduct: …)
Google-Kauf verifizieren await validateGooglePurchase(purchaseToken: …, productId: …, accessLevelId: …)
Einwilligung erfassen await recordConsent(purpose: …, granted: …)
EU-Widerruf WithdrawalButton(subscriptionId: …) · withdraw() · getWithdrawalConfig()

Nächste Schritte