SubSovereign
All guides

SubSovereign en Flutter — guía de integración

Esta guía cubre el paquete subsovereign para Flutter (sdk-flutter/) — un cliente de datos y un widget nativo de muro de pago. El muro de pago que diseñas en el panel de control de SubSovereign se renderiza aquí como un widget Flutter Paywall real, usando la misma configuración que los SDK de iOS, Android, web, React y React Native.

Antes de empezar

Necesitarás un servidor SubSovereign en ejecución, una app registrada en el panel (un appId y una clave API de rol SDK), niveles de acceso (por ejemplo, pro) vinculados a tus productos de tienda, y un muro de pago publicado. Gestiona la compra en sí con tu plugin de facturación habitual (por ejemplo, in_app_purchase); SubSovereign verificará y registrará la compra después.

Paso 1 — Instalar

Añade el paquete (ruta/dependencia git mientras esté en fase pre-pub.dev):

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

Paso 2 — Configurar una sola vez, al iniciar la 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 estable — el mismo valor en todas partes, para que el acceso siga al usuario entre dispositivos.

Paso 3 — Comprobar qué puede acceder el usuario

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

Paso 4 — Mostrar el muro de pago y vender

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

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

Tras el éxito de la compra, haz que el servidor la verifique, luego vuelve a comprobar y desbloquea:

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

Privacidad (GDPR)

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

Botón de desistimiento (UE) (Pasaporte de cumplimiento)

Si vendes suscripciones a consumidores de la UE en línea, la Directiva (UE) 2023/2673 exige un función de desistimiento claramente etiquetada:

WithdrawalButton(subscriptionId: sub.id)

Muestra el botón destacado, confirma una vez y envía de forma idempotente (un reintento de red nunca creará dos desistimientos). Para interfaces personalizadas usa SubSovereign.instance.withdraw(subscriptionId: …) y getWithdrawalConfig().

Referencia rápida

Quieres… Llama a
Configurar el SDK SubSovereign.instance.configure(SubSovereignConfig(…))
Ver qué ha desbloqueado el usuario await checkEntitlements()EntitlementResult.hasAccess
Cargar la configuración del muro de pago publicado await getPaywallConfig(platform: 'android')
Dibujarlo de forma nativa Paywall(config: …, onSelectProduct: …)
Verificar una compra de Google await validateGooglePurchase(purchaseToken: …, productId: …, accessLevelId: …)
Registrar consentimiento await recordConsent(purpose: …, granted: …)
Desistimiento (UE) WithdrawalButton(subscriptionId: …) · withdraw() · getWithdrawalConfig()

Pasos siguientes