SubSovereign
All guides

SubSovereign su Flutter — guida all’integrazione

Questa guida copre il pacchetto Flutter subsovereign (sdk-flutter/) — un client dati e un widget nativo per paywall. Il paywall che progetti nella dashboard di SubSovereign viene renderizzato qui come un vero widget Flutter Paywall, partendo dalla stessa configurazione usata per gli SDK di iOS, Android, web, React e React Native.

Prima di iniziare

È necessario un server SubSovereign in esecuzione, un’app registrata nella dashboard (un appId e una chiave API per il ruolo SDK), livelli di accesso (ad esempio pro) collegati ai tuoi prodotti dello store e un paywall pubblicato. Gestisci l’acquisto vero e proprio con il tuo solito plugin di fatturazione (ad esempio in_app_purchase); SubSovereign verifica e registra l’acquisto in seguito.

Passo 1 — Installazione

Aggiungi il pacchetto (percorso/dipendenza Git finché non è disponibile su pub.dev):

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

Passo 2 — Configurazione una volta sola, all’avvio dell’app

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

Usa un userId stabile — lo stesso valore ovunque, in modo che l’accesso segua l’utente tra i dispositivi.

Passo 3 — Verifica cosa può fare l’utente

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

Passo 4 — Mostra il paywall e vendi

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

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

Dopo il successo dell’acquisto, fai verificare l’acquisto dal server, quindi ricontrolla e sblocca:

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

Privacy (GDPR)

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

Pulsante di recesso UE (Compliance Passport)

Se vendi abbonamenti a consumatori UE online, la Direttiva (UE) 2023/2673 richiede una funzione di recesso chiaramente etichettata:

WithdrawalButton(subscriptionId: sub.id)

Mostra il pulsante in evidenza, conferma una volta e invia in modo idempotente (un nuovo tentativo di rete non può creare due recessi). Per interfacce utente personalizzate usa SubSovereign.instance.withdraw(subscriptionId: …) e getWithdrawalConfig().

Riferimento rapido

Vuoi… Chiama
Configurare l’SDK SubSovereign.instance.configure(SubSovereignConfig(…))
Vedere cosa ha sbloccato l’utente await checkEntitlements()EntitlementResult.hasAccess
Caricare il paywall pubblicato await getPaywallConfig(platform: 'android')
Renderizzarlo nativamente Paywall(config: …, onSelectProduct: …)
Verificare un acquisto Google await validateGooglePurchase(purchaseToken: …, productId: …, accessLevelId: …)
Registrare il consenso await recordConsent(purpose: …, granted: …)
Recesso UE WithdrawalButton(subscriptionId: …) · withdraw() · getWithdrawalConfig()

Passaggi successivi