Activar compras con Flow y Paywall Builder en el SDK de Unity
Esta guía utiliza las APIs del SDK de Unity v4 (beta) de Adapty. Si usas la v3, consulta la guía de migración para los nombres de métodos correspondientes.
Para habilitar las compras in-app, necesitas entender tres conceptos clave:
- Productos – todo lo que los usuarios pueden comprar (suscripciones, consumibles, acceso de por vida)
- Flows y paywalls – pantallas que presentan productos a los usuarios, creadas en el Flow & Paywall Builder sin código. El SDK los recupera mediante
GetFlow. Si prefieres construir la UI en tu propio código, consulta Implementar paywalls personalizados. - Placements – dónde y cuándo muestras flows y paywalls en tu app (como
main,onboarding,settings). Los vinculas a placements en el dashboard y luego los solicitas por ID de placement en tu código. Esto facilita ejecutar pruebas A/B y mostrar distintos contenidos a diferentes usuarios.
Adapty te ofrece tres formas de habilitar compras en tu app. Selecciona una según los requisitos de tu aplicación:
| Implementación | Complejidad | Cuándo usarla |
|---|---|---|
| Adapty Flow & Paywall Builder | ✅ Fácil | Creas un flow o paywall completo y listo para compras en el editor sin código. Adapty lo renderiza automáticamente y gestiona toda la lógica de compra, validación de recibos y gestión de suscripciones. |
| Paywalls personalizados | 🟡 Media | Implementas la UI de tu paywall en el código de tu app, pero obtienes el objeto flow de Adapty para mantener flexibilidad en la oferta de productos. Consulta la guía. |
| Modo observador | 🔴 Difícil | Ya tienes tu propia infraestructura de gestión de compras y quieres seguir usándola. Ten en cuenta que el modo observador tiene sus limitaciones en Adapty. Consulta el artículo. |
Los pasos a continuación muestran cómo implementar un flow o paywall creado en el Adapty Flow & Paywall Builder.
Si prefieres crear la interfaz del paywall tú mismo, consulta Implementar paywalls personalizados.
Para mostrar un flow o paywall creado en el Adapty Flow & Paywall Builder, en el código de tu app solo necesitas:
- Obtén el flow o el paywall: Obténlo desde Adapty.
- Muéstralo y Adapty gestionará las compras por ti: Muestra la vista en tu app.
- Gestiona las acciones de los botones: Asocia las interacciones del usuario con la respuesta de tu app. Por ejemplo, abre enlaces o cierra el paywall cuando el usuario pulse los botones.
Antes de empezar
Antes de empezar, completa estos pasos:
- Conecta tu app al App Store y/o Google Play en el Adapty Dashboard.
- Crea tus productos en Adapty.
- Crea un flow o paywall y añade productos a él.
- Crea un placement y añade tu flow o paywall a él.
- Instala y activa el SDK de Adapty en el código de tu app.
La forma más rápida de completar estos pasos es seguir la guía de inicio rápido o crear flows y placements usando el CLI para desarrolladores.
1. Obtén el flow o el paywall
Tus flows y paywalls están asociados con placements configurados en el dashboard. Los placements te permiten mostrar diferentes flows o paywalls a distintas audiencias o ejecutar pruebas A/B.
Para obtener un flow o paywall creado en el Adapty Flow & Paywall Builder, necesitas:
-
Obtener el objeto
flowa través del ID del placement usando el métodoGetFlow. -
Crea la vista del flow con el método
CreateFlowView. La vista contiene los elementos de UI y el estilo necesarios para mostrarla. Si el flow no tiene ninguna vista configurada,CreateFlowViewdevuelve un error — trátalo en el callback.
Para obtener la vista, publica el flow o paywall. Un flow o paywall con cambios sin publicar tiene el estado Dirty, y su placement seguirá sirviendo la última versión publicada.
Adapty.GetFlow("YOUR_PLACEMENT_ID", (flow, error) => {
if (error != null) {
// handle the error
return;
}
// Create the flow view
AdaptyUI.CreateFlowView(flow, (view, error) => {
if (error != null) {
// the flow has no view configured, or view creation failed
return;
}
// view - the flow view ready to be presented
});
});
Este quickstart proporciona la configuración mínima necesaria para mostrar un flow o paywall. Para más detalles sobre la configuración avanzada, consulta nuestra guía para obtener flows y paywalls.
2. Mostrar el flow o el paywall
Ahora que ya tienes la vista del flow, basta con añadir unas pocas líneas para mostrarlo.
Para mostrar el flow, usa el método view.Present() sobre el view creado por el método CreateFlowView. Cada view solo puede usarse una vez: cuando lo descartes, llama a CreateFlowView de nuevo para mostrarlo otra vez.
view.Present((error) => {
// handle the error
});
Para más detalles sobre cómo mostrar un flow o un paywall, consulta nuestra guía.
3. Gestionar las acciones de los botones
Cuando los usuarios hacen clic en los botones del flow o del paywall, el SDK de Unity gestiona automáticamente las compras y la restauración. Sin embargo, otros botones tienen IDs personalizados o predefinidos y requieren que gestiones las acciones en tu código.
Por ejemplo, tu paywall probablemente tiene un botón de cerrar y URLs que abrir (p. ej., términos de uso y política de privacidad). Para gestionar estas acciones, tu clase necesita implementar la interfaz IAdaptyFlowsEventsListener y registrarse como listener.
Ten en cuenta que el flow permanece abierto después de una compra exitosa. Si quieres cerrarlo una vez que la compra finalice, cierra la vista en el callback FlowViewDidFinishPurchase.
public class YourClass : MonoBehaviour, IAdaptyFlowsEventsListener
{
void Start()
{
// Register this class as the flows events listener
Adapty.SetFlowsEventsListener(this);
}
// IAdaptyFlowsEventsListener method - handles button actions
public void FlowViewDidPerformAction(
AdaptyUIFlowView view,
AdaptyUIUserAction action
) {
switch (action.Type) {
case AdaptyUIUserActionType.Close:
view.Dismiss(null);
break;
case AdaptyUIUserActionType.OpenUrl:
AdaptyUI.OpenUrl(action.Value, AdaptyWebPresentation.ExternalBrowser, null);
break;
default:
break;
}
}
// IAdaptyFlowsEventsListener method - dismiss the flow after a purchase
public void FlowViewDidFinishPurchase(
AdaptyUIFlowView view,
AdaptyPaywallProduct product,
AdaptyPurchaseResult purchasedResult
) {
if (purchasedResult.Type != AdaptyPurchaseResultType.UserCancelled) {
view.Dismiss(null);
}
}
}
Próximos pasos
¿Tienes preguntas o estás teniendo algún problema? Consulta nuestro foro de soporte donde encontrarás respuestas a preguntas frecuentes o podrás plantear las tuyas. ¡Nuestro equipo y la comunidad están aquí para ayudarte!
Tu flow o paywall está listo para mostrarse en la app. Prueba tus compras en el sandbox de App Store o en Google Play Store para asegurarte de que puedes completar una compra de prueba desde el flow.
Ahora necesitas verificar el nivel de acceso de los usuarios para asegurarte de mostrar un paywall o dar acceso a las funciones de pago a los usuarios correctos.
Ejemplo completo
Así es como todos esos pasos pueden integrarse juntos en tu app.
using System;
using System.Collections.Generic;
using UnityEngine;
using AdaptySDK;
public class FlowManager : MonoBehaviour, IAdaptyFlowsEventsListener
{
[SerializeField] private string placementId = "YOUR_PLACEMENT_ID";
void Start()
{
// Register for flow events
Adapty.SetFlowsEventsListener(this);
GetAndDisplayFlow();
}
private void GetAndDisplayFlow()
{
Adapty.GetFlow(placementId, (flow, error) => {
if (error != null) {
Debug.LogError("Error getting flow: " + error.Message);
return;
}
CreateAndPresentFlowView(flow);
});
}
private void CreateAndPresentFlowView(AdaptyFlow flow)
{
AdaptyUI.CreateFlowView(flow, (view, error) => {
if (error != null) {
// the flow has no view configured — use custom logic
Debug.LogError("Error creating flow view: " + error.Message);
return;
}
view.Present((presentError) => {
if (presentError != null) {
Debug.LogError("Error presenting flow: " + presentError.Message);
return;
}
Debug.Log("Flow presented successfully");
});
});
}
// IAdaptyFlowsEventsListener implementation
public void FlowViewDidPerformAction(
AdaptyUIFlowView view,
AdaptyUIUserAction action
) {
switch (action.Type) {
case AdaptyUIUserActionType.Close:
Debug.Log("Close button pressed");
view.Dismiss(null);
break;
case AdaptyUIUserActionType.OpenUrl:
AdaptyUI.OpenUrl(action.Value, AdaptyWebPresentation.ExternalBrowser, null);
break;
default:
break;
}
}
public void FlowViewDidFinishPurchase(
AdaptyUIFlowView view,
AdaptyPaywallProduct product,
AdaptyPurchaseResult purchasedResult
) {
if (purchasedResult.Type != AdaptyPurchaseResultType.UserCancelled) {
view.Dismiss(null);
}
}
// Required interface methods (implement as needed)
public void FlowViewDidAppear(AdaptyUIFlowView view) { }
public void FlowViewDidDisappear(AdaptyUIFlowView view) { }
public void FlowViewDidSelectProduct(AdaptyUIFlowView view, string productId) { }
public void FlowViewDidStartPurchase(AdaptyUIFlowView view, AdaptyPaywallProduct product) { }
public void FlowViewDidFailPurchase(AdaptyUIFlowView view, AdaptyPaywallProduct product, AdaptyError error) { }
public void FlowViewDidStartRestore(AdaptyUIFlowView view) { }
public void FlowViewDidFinishRestore(AdaptyUIFlowView view, AdaptyProfile profile) { }
public void FlowViewDidFailRestore(AdaptyUIFlowView view, AdaptyError error) { }
public void FlowViewDidReceiveError(AdaptyUIFlowView view, AdaptyError error) { }
public void FlowViewDidFailLoadingProducts(AdaptyUIFlowView view, AdaptyError error) { }
public void FlowViewDidFinishWebPaymentNavigation(AdaptyUIFlowView view, AdaptyPaywallProduct product, AdaptyError error) { }
public void FlowViewDidReceiveAnalyticEvent(AdaptyUIFlowView view, string name, IDictionary<string, object> @params) { }
public void ShowFlow()
{
GetAndDisplayFlow();
}
}