SubSovereign
All guides

SubSovereign sur Flutter — guide d’intégration

Ce guide couvre le package Flutter subsovereign (sdk-flutter/) — un client de données et un widget natif de paywall. Le paywall que vous concevez dans le tableau de bord SubSovereign s’affiche ici sous forme de widget Flutter Paywall natif, à partir de la même configuration que les SDK iOS, Android, web, React et React Native.

Avant de commencer

Un serveur SubSovereign en cours d’exécution, une application enregistrée dans le tableau de bord (un appId et une clé API de rôle SDK), des niveaux d’accès (par exemple pro) liés à vos produits en magasin, et un paywall publié. Gérez l’achat lui-même avec votre plugin de facturation habituel (par exemple in_app_purchase) ; SubSovereign le vérifie et l’enregistre ensuite.

Étape 1 — Installation

Ajoutez le package (dépendance par chemin/dépôt tant qu’il n’est pas disponible sur pub.dev) :

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

Étape 2 — Configuration unique, au démarrage de l’application

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

Utilisez un userId stable — la même valeur partout, pour que l’accès suive l’utilisateur sur tous les appareils.

Étape 3 — Vérifier ce à quoi l’utilisateur a accès

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

Étape 4 — Afficher le paywall et vendre

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

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

Une fois l’achat réussi, faites-le vérifier par le serveur, puis relancez la vérification et débloquez l’accès :

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

Confidentialité (RGPD)

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

Bouton de rétractation UE (Compliance Passport)

Si vous vendez des abonnements à des consommateurs de l’UE en ligne, la directive (UE) 2023/2673 exige un bouton de rétractation clairement étiqueté :

WithdrawalButton(subscriptionId: sub.id)

Il affiche le bouton en évidence, confirme une fois, et soumet de manière idempotente (une nouvelle tentative réseau ne peut pas créer deux rétractations). Pour des interfaces personnalisées, utilisez SubSovereign.instance.withdraw(subscriptionId: …) et getWithdrawalConfig().

Référence rapide

Vous voulez… Appelez
Configurer le SDK SubSovereign.instance.configure(SubSovereignConfig(…))
Voir ce que l’utilisateur a débloqué await checkEntitlements()EntitlementResult.hasAccess
Charger la configuration du paywall publié await getPaywallConfig(platform: 'android')
L’afficher nativement Paywall(config: …, onSelectProduct: …)
Vérifier un achat Google await validateGooglePurchase(purchaseToken: …, productId: …, accessLevelId: …)
Enregistrer un consentement await recordConsent(purpose: …, granted: …)
Rétractation UE WithdrawalButton(subscriptionId: …) · withdraw() · getWithdrawalConfig()

Prochaines étapes