SubSovereign
All guides

SubSovereign — przewodnik integracji z Flutterem

Ten przewodnik dotyczy pakietu subsovereign dla Fluttera (sdk-flutter/) — klienta danych oraz natywnego widżetu płatnej ściany. Zaprojektowana w panelu SubSovereign płatna ściana renderuje się tutaj jako rzeczywisty widżet Flutter Paywall, z tej samej konfiguracji co SDK dla iOS, Androida, sieci, Reacta i React Native.

Zanim zaczniesz

Działający serwer SubSovereign, aplikacja zarejestrowana w panelu (z appId i kluczem API roli SDK), poziomy dostępu (np. pro) powiązane z produktami sklepowymi oraz opublikowana płatna ściana. Sam zakup obsługuje się standardowym wtycznym płatności (np. in_app_purchase); SubSovereign weryfikuje i rejestruje go później.

Krok 1 — Instalacja

Dodaj pakiet (ścieżka/zależność git, póki nie jest dostępny na pub.dev):

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

Krok 2 — Konfiguracja raz, przy uruchomieniu aplikacji

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',
));

Użyj stałego userId — tej samej wartości wszędzie, aby dostęp podążał za użytkownikiem między urządzeniami.

Krok 3 — Sprawdź, do czego użytkownik ma dostęp

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');
}

Krok 4 — Pokaż płatną ścianę i sprzedaj

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

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

Po pomyślnym zakupie należy zweryfikować go po stronie serwera, a następnie ponownie sprawdzić i odblokować:

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();
}

Prywatność (RODO)

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

Przycisk odstąpienia od umowy (Compliance Passport)

Jeśli sprzedajesz subskrypcje konsumentom z UE przez internet, dyrektywa (UE) 2023/2673 wymaga wyraźnie oznaczonej funkcji odstąpienia:

WithdrawalButton(subscriptionId: sub.id)

Pokazuje on widoczny przycisk, potwierdza jednokrotnie i wysyła idempotentnie (ponowna próba sieciowa nigdy nie utworzy dwóch odstąpień). W przypadku interfejsów użytkownika dostosowanych indywidualnie użyj SubSovereign.instance.withdraw(subscriptionId: …) oraz getWithdrawalConfig().

Szybki przegląd

Chcesz… Wywołaj
Skonfigurować SDK SubSovereign.instance.configure(SubSovereignConfig(…))
Zobaczyć, co użytkownik odblokował await checkEntitlements()EntitlementResult.hasAccess
Załadować opublikowaną płatną ścianę await getPaywallConfig(platform: 'android')
Wyświetlić ją natywnie Paywall(config: …, onSelectProduct: …)
Zweryfikować zakup w Google Play await validateGooglePurchase(purchaseToken: …, productId: …, accessLevelId: …)
Zapisać zgodę await recordConsent(purpose: …, granted: …)
Odstąpienie od umowy w UE WithdrawalButton(subscriptionId: …) · withdraw() · getWithdrawalConfig()

Następne kroki

  • Działający przykład znajdziesz w sdk-flutter/example/.
  • Nowy w tych koncepcjach? Przeczytaj Jak działa SubSovereign.