---
title: "Habilitar compras en tu paywall personalizado en Android SDK"
description: "Integra el SDK de Adapty en tus paywalls personalizados de Android para habilitar las compras in-app."
---

Esta guía describe cómo integrar Adapty en tus paywalls personalizados. Mantén el control total sobre la implementación del paywall, mientras el SDK de Adapty obtiene los productos, gestiona las nuevas compras y restaura las anteriores.

:::important
**Esta guía es para desarrolladores que implementan paywalls personalizados.** Si quieres la forma más sencilla de habilitar compras, usa el [Adapty Paywall Builder](android-quickstart-paywalls). Con Paywall Builder, creas paywalls en un editor visual sin código, Adapty gestiona toda la lógica de compras automáticamente y puedes probar distintos diseños sin volver a publicar tu app.
:::

## Antes de empezar \{#before-you-start\}

### Configurar productos \{#set-up-products\}

Para habilitar las compras in-app, necesitas entender tres conceptos clave:

- [**Productos**](product) – todo lo que los usuarios pueden comprar (suscripciones, consumibles, acceso de por vida)
- [**Paywalls**](paywalls) – configuraciones que definen qué productos ofrecer. En Adapty, los paywalls son la única forma de obtener productos, pero este diseño te permite modificar productos, precios y ofertas sin tocar el código de tu app.
- [**Placements**](placements) – dónde y cuándo muestras los paywalls en tu app (como `main`, `onboarding`, `settings`). Configuras los paywalls para los placements en el dashboard y luego los solicitas por ID de placement en tu código. Esto facilita ejecutar pruebas A/B y mostrar diferentes paywalls a distintos usuarios.

Asegúrate de entender estos conceptos aunque trabajes con tu paywall personalizado. Básicamente, son tu forma de gestionar los productos que vendes en tu app.

Para implementar tu paywall personalizado, necesitarás crear un **paywall** y añadirlo a un **placement**. Esta configuración te permite obtener tus productos. Para entender qué debes hacer en el dashboard, sigue la guía de inicio rápido [aquí](quickstart).

### Gestionar usuarios \{#manage-users\}

Puedes trabajar con o sin autenticación de backend en tu lado.

Sin embargo, el SDK de Adapty gestiona de forma diferente a los usuarios anónimos e identificados. Lee la [guía de inicio rápido de identificación](android-quickstart-identify) para entender las particularidades y asegurarte de trabajar correctamente con los usuarios.

## Paso 1. Obtener productos \{#step-1-get-products\}

Para obtener los productos de tu paywall personalizado, necesitas:

1. Obtener el objeto `paywall` pasando el ID del [placement](placements) al método `getPaywall`.
2. Obtener el array de productos para este paywall usando el método `getPaywallProducts`.

<Tabs groupId="current-os" queryString>

<TabItem value="kotlin" label="Kotlin" default>

```kotlin showLineNumbers

fun loadPaywall() {
    Adapty.getPaywall("YOUR_PLACEMENT_ID") { result ->
        when (result) {
            is AdaptyResult.Success -> {
                val paywall = result.value
                Adapty.getPaywallProducts(paywall) { productResult ->
                    when (productResult) {
                        is AdaptyResult.Success -> {
                            val products = productResult.value
                            // Use products to build your custom paywall UI
                        }
                        is AdaptyResult.Error -> {
                            val error = productResult.error
                            // Handle the error
                        }
                    }
                }
            }
            is AdaptyResult.Error -> {
                val error = result.error
                // Handle the error
            }
        }
    }
}
```
</TabItem>

<TabItem value="java" label="Java" default>

```java showLineNumbers

public void loadPaywall() {
    Adapty.getPaywall("YOUR_PLACEMENT_ID", result -> {
        if (result instanceof AdaptyResult.Success) {
            AdaptyPaywall paywall = ((AdaptyResult.Success<AdaptyPaywall>) result).getValue();
            
            Adapty.getPaywallProducts(paywall, productResult -> {
                if (productResult instanceof AdaptyResult.Success) {
                    List<AdaptyPaywallProduct> products = ((AdaptyResult.Success<List<AdaptyPaywallProduct>>) productResult).getValue();
                    // Use products to build your custom paywall UI
                } else if (productResult instanceof AdaptyResult.Error) {
                    AdaptyError error = ((AdaptyResult.Error) productResult).getError();
                    // Handle the error
                }
            });
        } else if (result instanceof AdaptyResult.Error) {
            AdaptyError error = ((AdaptyResult.Error) result).getError();
            // Handle the error
        }
    });
}
```
</TabItem>
</Tabs>

## Paso 2. Aceptar compras \{#step-2-accept-purchases\}

Cuando un usuario pulsa un producto en tu paywall personalizado, llama al método `makePurchase` con el producto seleccionado. Esto gestionará el flujo de compra y devolverá el perfil actualizado.

<Tabs groupId="current-os" queryString>

<TabItem value="kotlin" label="Kotlin" default>

```kotlin showLineNumbers

fun purchaseProduct(activity: Activity, product: AdaptyPaywallProduct) {
    Adapty.makePurchase(activity, product) { result ->
        when (result) {
            is AdaptyResult.Success -> {
                when (val purchaseResult = result.value) {
                    is AdaptyPurchaseResult.Success -> {
                        val profile = purchaseResult.profile
                        // Purchase successful, profile updated
                    }
                    is AdaptyPurchaseResult.UserCanceled -> {
                        // User canceled the purchase
                    }
                    is AdaptyPurchaseResult.Pending -> {
                        // Purchase is pending (e.g., user will pay offline with cash)
                    }
                }
            }
            is AdaptyResult.Error -> {
                val error = result.error
                // Handle the error
            }
        }
    }
}
```
</TabItem>

<TabItem value="java" label="Java" default>

```java showLineNumbers

public void purchaseProduct(Activity activity, AdaptyPaywallProduct product) {
    Adapty.makePurchase(activity, product, null, result -> {
        if (result instanceof AdaptyResult.Success) {
            AdaptyPurchaseResult purchaseResult = ((AdaptyResult.Success<AdaptyPurchaseResult>) result).getValue();
            
            if (purchaseResult instanceof AdaptyPurchaseResult.Success) {
                AdaptyProfile profile = ((AdaptyPurchaseResult.Success) purchaseResult).getProfile();
                // Purchase successful, profile updated
            } else if (purchaseResult instanceof AdaptyPurchaseResult.UserCanceled) {
                // User canceled the purchase
            } else if (purchaseResult instanceof AdaptyPurchaseResult.Pending) {
                // Purchase is pending (e.g., user will pay offline with cash)
            }
        } else if (result instanceof AdaptyResult.Error) {
            AdaptyError error = ((AdaptyResult.Error) result).getError();
            // Handle the error
        }
    });
}
```
</TabItem>
</Tabs>

## Paso 3. Restaurar compras \{#step-3-restore-purchases\}

Google Play y otras tiendas de aplicaciones exigen que todas las apps con suscripciones ofrezcan una forma de que los usuarios puedan restaurar sus compras.

Llama al método `restorePurchases` cuando el usuario pulse el botón de restaurar. Esto sincronizará su historial de compras con Adapty y devolverá el perfil actualizado.

<Tabs groupId="current-os" queryString>

<TabItem value="kotlin" label="Kotlin" default>

```kotlin showLineNumbers

fun restorePurchases() {
    Adapty.restorePurchases { result ->
        when (result) {
            is AdaptyResult.Success -> {
                val profile = result.value
                // Restore successful, profile updated
            }
            is AdaptyResult.Error -> {
                val error = result.error
                // Handle the error
            }
        }
    }
}
```
</TabItem>

<TabItem value="java" label="Java" default>

```java showLineNumbers

public void restorePurchases() {
    Adapty.restorePurchases(result -> {
        if (result instanceof AdaptyResult.Success) {
            AdaptyProfile profile = ((AdaptyResult.Success<AdaptyProfile>) result).getValue();
            // Restore successful, profile updated
        } else if (result instanceof AdaptyResult.Error) {
            AdaptyError error = ((AdaptyResult.Error) result).getError();
            // Handle the error
        }
    });
}
```
</TabItem>
</Tabs>

## Siguientes pasos \{#next-steps\}

---
no_index: true
---
import Callout from '../../../components/Callout.astro';

<Callout type="tip">
¿Tienes preguntas o estás teniendo algún problema? Consulta nuestro [foro de soporte](https://adapty.featurebase.app/) donde encontrarás respuestas a preguntas frecuentes o podrás plantear las tuyas. ¡Nuestro equipo y la comunidad están aquí para ayudarte!
</Callout>

Tu paywall ya está listo para mostrarse en la app. [Prueba tus compras en Google Play Store](testing-on-android) para asegurarte de que puedes completar una compra de prueba desde el paywall. Para ver cómo funciona en una implementación lista para producción, consulta [ProductListFragment.kt](https://github.com/adaptyteam/AdaptySDK-Android/blob/master/app/src/main/java/com/adapty/example/ProductListFragment.kt) en nuestra app de ejemplo, que muestra el manejo de compras con gestión adecuada de errores, retroalimentación en la interfaz y administración de suscripciones.

A continuación, [comprueba si los usuarios han completado su compra](android-check-subscription-status) para determinar si mostrar el paywall o conceder acceso a las funciones de pago.