SubSovereign
All guides

SubSovereign en Roku — guía de integración

Esta guía lleva tu canal de Roku desde "no tengo ni idea de quién me ha pagado" a "mi canal desbloquea las funciones correctas para el usuario correcto, verificado en mi propio servidor". El SDK es un único archivo BrightScript y no requiere experiencia previa con herramientas de suscripciones.

Qué hace SubSovereign por ti

Tus usuarios se suscriben a través de Roku Pay (la Tienda de Canales de Roku). SubSovereign responde una única pregunta para tu canal, de forma fiable: ¿qué ha pagado realmente este usuario?

  • Tu canal consulta a SubSovereign por el derecho de acceso — lo que el usuario ha desbloqueado.
  • La validación de recibo se realiza en el servidor, directamente con Roku, por lo que un cliente manipulado no puede falsificar una suscripción.
  • Es autohospedado: se ejecuta en tu infraestructura, los datos de tus usuarios se quedan contigo y no hay reparto de ingresos — te quedas el 100% de lo que pagan tus usuarios.

Nunca confíes en el dispositivo. El dispositivo pregunta; el servidor decide.

Antes de empezar

Necesitarás un servidor de SubSovereign en ejecución, una app registrada en el panel de control (que te proporcionará un appId y una clave de API), y tus niveles de acceso (rangos, por ejemplo pro) creados y vinculados a tus productos de Roku Pay. Configura los productos en el Roku Developer Dashboard y gestiona la compra con roChannelStore como de costumbre — SubSovereign verifica y registra la compra después.

Paso 1 — Añadir el SDK

Coloca SubSovereign.brs en la carpeta source/ de tu canal. Eso es todo — sin gestor de paquetes. Sus llamadas HTTP usan roUrlTransfer con el paquete de certificados de Roku ya configurado.

Paso 2 — Configurar una vez, al iniciar el canal

Llama a SubSovereign_Configure al principio (por ejemplo, en tu Main), pasando tu clave de API, el ID de la app, un identificador de usuario estable y la URL de tu servidor:

SubSovereign_Configure("YOUR_APP_API_KEY", "your-app-id", userId, "https://subs.yourdomain.com/api/v1")

Usa el mismo userId cada vez para un usuario determinado para que su acceso lo siga en todos los dispositivos. (La configuración reside en m, así que configúrala en el mismo hilo desde el que harás las llamadas — consulta la nota en el Paso 6.)

Paso 3 — Comprobar qué puede acceder el usuario

SubSovereign_CheckEntitlements() devuelve un objeto. Lee hasAccess para la respuesta rápida sí/no:

result = SubSovereign_CheckEntitlements()
if result.hasAccess = true
    unlockProFeatures()
else
    showFreeExperience()   ' rango gratuito, o envíalos a la Tienda de Canales
end if

Si la petición falla, el objeto devuelve hasAccess = false y un campo error — por lo que un fallo de red cierra el acceso (bloqueado), nunca se desbloquea accidentalmente.

Paso 4 — Vender una suscripción

Realiza la compra a través de Roku Pay (roChannelStore) como de costumbre. Cuando Roku devuelva una transacción exitosa, pasa su transactionId (junto con el ID del producto y el nivel de acceso que concede) a SubSovereign para que el servidor lo valide directamente con Roku:

result = SubSovereign_ValidateRokuPurchase(transactionId, productId, "pro")
if result.granted = true
    entitlements = SubSovereign_CheckEntitlements()   ' vuelve a comprobar, luego desbloquea
    unlockProFeatures()
end if

La compra solo es real una vez que el servidor la ha confirmado con Roku.

Paso 5 — Bandera de funciones y consentimiento

Lanza funciones desde el servidor sin actualizar el canal:

flags = SubSovereign_GetFeatureFlags()
if flags.newPlayer = true then showNewPlayer()

Captura el consentimiento GDPR (dispara y olvida):

purposes = { analytics: true, marketing: false }
SubSovereign_RecordConsent(purposes, "GDPR")

Paso 6 — Ejecutar llamadas de red fuera del hilo de renderizado

SubSovereign_CheckEntitlements y SubSovereign_ValidateRokuPurchase esperan al servidor (hasta 15 segundos). Nunca las llames en el hilo de renderizado/UI — una red lenta congelaría la pantalla. Ejecútalas dentro de un nodo Task y pasa el resultado de vuelta a tu escena:

' en una función de un nodo Task:
SubSovereign_Configure(m.top.apiKey, m.top.appId, m.top.userId, m.top.baseUrl)
m.top.result = SubSovereign_CheckEntitlements()   ' campo observado que la escena escucha

La llamada de disparar y olvidar SubSovereign_RecordConsent no espera respuesta y es seguro llamarla directamente.

Buenas prácticas

  • Comprobar al iniciar el canal para que el acceso esté correcto antes de que el usuario llegue al contenido bloqueado.
  • Revisar después de comprar para que la interfaz refleje el nuevo acceso al instante.
  • Nunca confíes en el cliente — pregunta al servidor; es el que verificó la transacción con Roku.
  • Usa siempre un nodo Task para las llamadas de acceso y validación.

Referencia rápida

Quieres… Llama a
Configurar el SDK SubSovereign_Configure(apiKey, appId, userId, baseUrl)
Ver qué ha desbloqueado el usuario SubSovereign_CheckEntitlements() → objeto con hasAccess
Verificar una compra de Roku Pay SubSovereign_ValidateRokuPurchase(transactionId, productId, accessLevel)
Leer banderas de funciones SubSovereign_GetFeatureFlags()
Registrar consentimiento GDPR SubSovereign_RecordConsent(purposes, jurisdiction)

Pasos siguientes