SubSovereign
All guides

SubSovereign em Flutter — guia de integração

Este guia abrange o pacote Flutter subsovereign (sdk-flutter/) — um cliente de dados e um widget nativo de paywall. O paywall que projetar no painel de controlo do SubSovereign é renderizado aqui como um widget Flutter Paywall, a partir da mesma configuração dos SDKs para iOS, Android, web, React e React Native.

Antes de começar

É necessário um servidor SubSovereign em execução, um app registado no painel (um appId e uma chave de API com função de SDK), níveis de acesso (ex. pro) associados aos seus produtos na loja, e um paywall publicado. Gerencie a compra com o seu plugin de faturação habitual (ex. in_app_purchase); o SubSovereign verifica e regista a compra depois.

Passo 1 — Instalar

Adicione o pacote (dependência por caminho/repositório enquanto não estiver disponível no pub.dev):

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

Passo 2 — Configurar uma vez, quando o app iniciar

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

Use um userId estável — o mesmo valor em todos os locais, para que o acesso acompanhe o utilizador entre dispositivos.

Passo 3 — Verificar o que o utilizador pode aceder

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 — Mostrar o paywall e vender

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

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

Após a compra ser bem-sucedida, peça ao servidor para a verificar, depois volte a verificar e desbloqueie:

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

Privacidade (RGPD)

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

Botão de desistência (UE) (Passaporte de Conformidade)

Se vender assinaturas a consumidores da UE online, a Diretiva (UE) 2023/2673 exige um botão de desistência claramente identificado:

WithdrawalButton(subscriptionId: sub.id)

Ele mostra o botão proeminente, confirma uma vez e envia de forma idempotente (uma nova tentativa de rede nunca criará duas desistências). Para interfaces personalizadas, use SubSovereign.instance.withdraw(subscriptionId: …) e getWithdrawalConfig().

Referência rápida

Pretende… Chamar
Configurar o SDK SubSovereign.instance.configure(SubSovereignConfig(…))
Ver o que o utilizador desbloqueou await checkEntitlements()EntitlementResult.hasAccess
Carregar o paywall publicado await getPaywallConfig(platform: 'android')
Desenhá-lo nativamente Paywall(config: …, onSelectProduct: …)
Verificar uma compra na Google await validateGooglePurchase(purchaseToken: …, productId: …, accessLevelId: …)
Registar consentimento await recordConsent(purpose: …, granted: …)
Desistência (UE) WithdrawalButton(subscriptionId: …) · withdraw() · getWithdrawalConfig()

Próximos passos