Llega a nuevos mercados con precios regionales de los productos

1. Introducción

En este codelab, te enfocarás en crear un producto único, definir su opción de compra, establecer precios específicos para cada región y probar el flujo de compra de los productos únicos.

Público

Este codelab está dirigido a desarrolladores de apps para Android que deseen usar Play Console para administrar su catálogo de productos únicos.

Qué aprenderás

  • El modelo de objetos de productos únicos.
  • Cómo navegar y usar Google Play Console para administrar tu catálogo de productos únicos
  • Cómo traducir los detalles de productos únicos a varios idiomas sin costo
  • Cómo configurar la disponibilidad y los precios regionales para productos únicos
  • Cómo usar las APIs de la Biblioteca de Play Billing para consultar los detalles de los productos únicos
  • Cómo probar productos únicos con Play Billing Lab

Qué necesitarás

2. Estreno de producto único

El modelo de objetos de productos únicos proporciona mayor flexibilidad en la forma de vender productos y reduce la complejidad de administrarlos. El modelo de objetos separa lo que se vende de cómo se vende, lo cual permite que el mismo derecho tenga varios precios y diferentes formas de comercializarse para los usuarios. El modelo de objetos tiene tres niveles de jerarquía:

  • Producto único: Un objeto de producto define lo que compra el usuario.
  • Opción de compra: Una opción de compra define cómo se otorga el derecho al usuario, su precio y dónde (en qué región) estará disponible el producto. Un solo producto puede tener varias opciones de compra, que pueden representar precios diferentes en distintas regiones.
  • Oferta: Las ofertas pueden afectar el precio de la opción de compra a la que están vinculadas y se pueden usar para crear descuentos o un pedido por adelantado. Una sola opción de compra puede tener varias ofertas.

En el siguiente diagrama, se muestra el modelo de objetos de productos únicos.

codelab-otp-model.png Figura 1: Modelo de objeto único.

Para obtener más información, consulta la descripción general de los productos únicos.

3. Compila la app de ejemplo

En este codelab, se usa una app de ejemplo para Android para mostrarte cómo administrar productos únicos. La app de ejemplo está diseñada para ser una app para Android completamente funcional que tiene el código fuente completo que muestra los siguientes aspectos:

  • Integra la app con PBL
  • Recuperación de productos únicos y las opciones de compra relacionadas
  • Ejecuta flujos de compra con precios regionales

En el siguiente video de demostración, se muestra cómo se verá y se comportará la app de ejemplo después de que se implemente y ejecute.

Si ya conoces los productos únicos y la Biblioteca de Facturación Play (PBL), puedes descargar la app de ejemplo y probarla.

Requisitos previos

Antes de compilar e implementar la app de ejemplo, haz lo siguiente:

Compilación

El objetivo de este paso de compilación es generar un archivo de Android App Bundle firmado de la app de ejemplo.

Para generar el paquete de aplicación para Android, sigue estos pasos:

  1. Descarga la app de ejemplo desde GitHub.
  2. Compila la app de ejemplo. Antes de compilarla, cambia el nombre del paquete y, luego, compílala. Si tienes paquetes de otras apps en Play Console, asegúrate de que el nombre del paquete que proporciones para la app de ejemplo sea único.

    Nota: Cuando compilas la app de ejemplo, solo se crea un archivo APK que puedes usar para las pruebas locales. Sin embargo, ejecutar la app no recupera productos ni precios porque los productos no se configuraron en Play Console.
  3. Genera un Android App Bundle firmado.
    1. Genera una clave de carga y un almacén de claves.
    2. Firma la app con la clave de carga.
    3. Cómo configurar la firma de apps de Play

El siguiente paso es subir el paquete de aplicación para Android a Google Play Console.

4. Crea un producto único en Play Console

Para crear productos únicos en Google Play Console, debes tener una app en Play Console. Crea una app en Play Console y, luego, sube el paquete de aplicación firmado que creaste anteriormente.

Crea una app

Para crear una app, haz lo siguiente:

  1. Accede a Google Play Console con tu cuenta de desarrollador.
  2. Haz clic en Crear app. Se abrirá la página Crear app.
  3. Ingresa el nombre de la app, selecciona el idioma predeterminado y otros detalles relacionados con la app.
  4. Haz clic en Crear app. Esto creará una app en Google Play Console.

Ahora puedes subir el paquete de aplicación firmado de la app de ejemplo.

Sube el paquete de aplicación firmado

  1. Sube el paquete de aplicación firmado al segmento de prueba interna de Google Play Console. Solo después de subir la app, podrás configurar las funciones relacionadas con la monetización en Play Console.
  2. Haz clic en Prueba y lanza > Pruebas > Versión interna > Crear una versión nueva.
  3. Ingresa un nombre de versión y sube el archivo APK firmado.
  4. Haz clic en Siguiente y, luego, en Guardar y publicar.

Ahora puedes crear tus productos únicos.

Crea un producto único

Para crear un producto único, sigue estos pasos:

  1. En Google Play Console, en el menú de navegación de la izquierda, ve a Monetiza con Play > Productos > Productos únicos.
  2. Haz clic en Crear un producto único.
  3. Ingresa los siguientes detalles del producto:
    • ID del producto: Ingresa un ID único. Por ejemplo, trending_movie_1
    • (Opcional) Etiquetas: Agrega etiquetas relevantes.
    • Nombre: Ingresa un nombre de producto. Por ejemplo, Product Movie
    • Descripción: Ingresa una descripción del producto. Por ejemplo, Product Description
    Traducción manual del nombre y la descripción del producto
    De forma predeterminada, el nombre y la descripción del producto están en el idioma inglés (Estados Unidos) – en-US. También puedes ingresar el nombre y la descripción en otros idiomas de forma manual. Para ingresar los detalles, haz clic en Administrar traducciones, selecciona los idiomas para los que deseas ingresar el texto traducido y, luego, haz clic en Aplicar. En la siguiente imagen, se muestra la opción Administrar traducciones:manage-translations.pngFigura 2: Administrar traducciones.

    Los idiomas que seleccionaste aparecerán en el menú desplegable de idiomas. Selecciona cada idioma y, luego, ingresa el nombre y la descripción correspondientes en el idioma seleccionado. También puedes traducir el nombre y la descripción del producto automáticamente sin costo. Para obtener más información, consulta la sección Cómo traducir productos únicos en este codelab.

    Nota: Para los fines de este codelab, puedes omitir la configuración del campo Ícono y la sección Impuestos, cumplimiento y programas.
  4. Haz clic en Siguiente.
  5. Agrega una opción de compra y configura su disponibilidad regional. Un producto único necesita al menos una opción de compra, que define cómo se otorga el derecho, su precio y la disponibilidad regional. En este codelab, agregaremos la opción estándar Comprar para el producto.

    En la sección Opción de compra, ingresa los siguientes detalles:
    • ID de opción de compra: Ingresa un ID único. Por ejemplo, buy-movie.
    • Tipo de compra: Selecciona Comprar.
    • (Opcional) Etiquetas: Agrega etiquetas específicas para esta opción de compra.
    • Haz clic en Opciones avanzadas para configurar las opciones avanzadas (opcional). Para los fines de este codelab, puedes omitir la configuración de las opciones avanzadas.
  6. A continuación, debes configurar la disponibilidad y el precio regionales para la opción de compra. En la disponibilidad regional, especificarás las regiones en las que está disponible tu producto, incluidas las regiones en las que aún no se publicó tu app. De forma predeterminada, habrá una opción de compra disponible en todas las regiones.

    En la sección Disponibilidad y precios, haz clic en Editar disponibilidad y acceso > Establecer como no disponible. Ten en cuenta que todas las regiones están configuradas como Disponible de forma predeterminada.
    1. Selecciona todos los países, excepto France, Spain y United States, y, luego, haz clic en Establecer como no disponible.
    2. En el menú desplegable Todas las regiones, selecciona Países y regiones disponibles. Aquí solo se muestran los países que seleccionaste en el paso anterior.
    3. Para cada uno de los países disponibles, haz clic en el ícono de edición de la columna Precio. Se mostrará un diálogo para editar el precio. Ingresa y guarda los siguientes precios:
      • En France, ingresa 10 EUR.
      • En Spain, ingresa 8 EUR.
      • En United States, ingresa USD 13.
  7. Haz clic en Activar. De esta manera, tu producto único estará disponible con la opción de compra Comprar.

Nota: La moneda del precio regional se muestra según la configuración del país del usuario en Play. Por ejemplo, si el país de Play del usuario está configurado como Francia, el precio del producto único se muestra en euros.

Video sobre la creación de productos únicos

En el siguiente video, se muestran los pasos para crear un producto por única vez que se describieron anteriormente.

Cómo agregar una opción de compra de alquiler

Ahora, agrega una opción de compra de alquiler al producto único creado anteriormente.

  1. En Google Play Console, en el menú de navegación de la izquierda, ve a Monetiza con Play > Productos > Productos únicos.
  2. Haz clic en la flecha hacia la derecha del producto con el ID de producto trending_movie_1 que creaste en el paso anterior.
  3. Haz clic en Agregar opción de compra.
  4. En la sección Opción de compra, ingresa los siguientes detalles:
    • ID de la opción de compra: Ingresa rent-movie.
    • Tipo de compra: Selecciona Alquilar.
    • Período de alquiler: Selecciona 48 horas.
    • Período de inicio del alquiler: Selecciona 24 horas.
    • (Opcional) Etiquetas: Agrega etiquetas específicas para esta opción de compra.
    • Haz clic en Opciones avanzadas para configurar las opciones avanzadas (opcional). Para los fines de este codelab, puedes omitir la configuración de las opciones avanzadas.
  5. Luego, de manera similar a la opción de compra, configura la disponibilidad regional para la opción de compra de alquiler. Consulta los pasos 6 y 7 en la sección anterior. Cuando configures precios regionales, establece un precio diferente para los alquileres. Por ejemplo:
    • France: EUR 5
    • Spain: EUR 4
    • United States: USD 7

5. Traduce los detalles del producto único

Puedes traducir el nombre y la descripción de tu producto sin costo adicional con la función de traducción automática disponible en Google Play Console.

Para traducir el título y la descripción, haz lo siguiente:

  1. En Google Play Console, en el menú de navegación de la izquierda, ve a Crecimiento de usuarios > Traducciones > Productos integrados en la aplicación y en Play Store.
  2. Haz clic en Crear pedido.
  3. Selecciona la opción Traducción automática sin costo y, luego, haz clic en Siguiente.
  4. En los idiomas de Traducir a, selecciona Francés - fr-FR y Español - es-ES y, luego, haz clic en Siguiente.
  5. Selecciona Productos únicos y suscripciones y, luego, haz clic en Traducir y ver traducciones. Se mostrará un banner de renuncia de responsabilidad. Acepta la renuncia de responsabilidad.
  6. Ahora verás la lista de idiomas traducidos. Haz clic en Revisar y aplicar para un idioma. Revisa el texto y, luego, haz clic en Aplicar todas las traducciones. Repite este paso para todos los idiomas a los que elegiste traducir.

Después de la traducción, puedes editar el texto traducido en Play Console. Para editar el texto traducido, sigue estos pasos:

  1. Abre la página Productos únicos > [tu producto único] > Editar producto único > Editar detalles del producto único.
  2. Selecciona el idioma requerido en el menú desplegable. Se muestra el texto en el idioma seleccionado. En la siguiente imagen, se muestra la selección de un idioma para editar el texto traducido:

    edit-translations.png Figura 3: Edita el texto traducido.
  3. Edita el texto según sea necesario y, luego, haz clic en Guardar cambios.

El usuario puede ver el texto traducido según las preferencias de idioma de su teléfono. Por ejemplo, si el idioma del teléfono del usuario está configurado en francés, el título y la descripción del producto único se mostrarán en francés. En la siguiente imagen de ejemplo, se muestra cómo y dónde aparecerá el texto traducido en diferentes idiomas.

post-translation.pngFigura 4: Texto traducido en tu app.

Video de configuración de la traducción

En el siguiente video, se muestran los pasos de configuración de la traducción que se describieron anteriormente.

6. Integración con PBL

Para integrar tu app con la Biblioteca de Facturación Play (PBL), sigue estos pasos:

  1. Agrega la dependencia de la Biblioteca de Facturación Play a la app de ejemplo.
    dependencies {
    val billing_version = "8.0.0"
    
    implementation("com.android.billingclient:billing-ktx:$billing_version")
    }
    
  2. Inicializa el objeto BillingClient. BillingClient es el SDK del cliente que reside en tu app y se comunica con la Biblioteca de Facturación Play. En el siguiente fragmento de código, se muestra cómo inicializar el cliente de facturación.
    private BillingClient createBillingClient() {
    return BillingClient.newBuilder(activity)
        .enablePendingPurchases(PendingPurchasesParams.newBuilder().enableOneTimeProducts().build())
        // For one-time products, add a listener to process and acknowledge the purchases. This will notify
        // Google the purchase was processed.
        // For client-only apps, use billingClient.acknowledgePurchase().
        // If you have a secure backend, you must acknowledge purchases on your server using the
        // server-side API.
        // See https://developer.android.com/google/play/billing/security#acknowledge
        // In this sample snippet purchases aren't processed. You must
        // implement your business logic to process and acknowledge the purchases.
        .setListener((billingResult, purchases) -> {})
        .enableAutoServiceReconnection()
        .build();
     }
    
  3. Conéctate a Google Play.En el siguiente fragmento de código, se muestra cómo conectarse a Google Play.
    /**
    * Starts the billing connection with Google Play. This method should be called exactly once
    * before any other methods in this class.
    *
    * @param productList The list of products to query for after the connection is established.
    */
    public void startBillingConnection(List<Product> productList) {
        billingClient.startConnection(
            new BillingClientStateListener() {
            @Override
            public void onBillingSetupFinished(BillingResult billingResult) {
                if (billingResult.getResponseCode() == BillingResponseCode.OK) {
                Log.d(TAG, "Billing Client Connection Successful");
                queryProductDetails(productList);
                } else {
                Log.e(TAG, "Billing Client Connection Failed: " + billingResult.getDebugMessage());
                listener.onBillingSetupFailed(billingResult); // Propagate the error to the listener to show a message to the user.
                }
            }
    
            @Override
            public void onBillingServiceDisconnected() {
                Log.e(TAG, "Billing Client Connection Lost");
                listener.onBillingError("Billing Connection Lost");
            }
            });
    }
    
  4. Recupera los detalles del producto único.Después de integrar tu app con PBL, debes recuperar los detalles del producto único en tu app. En el siguiente fragmento de código, se muestra cómo recuperar los detalles del producto único en tu app.
    private void queryProductDetails(List<Product> productList) {
        QueryProductDetailsParams queryProductDetailsParams =
            QueryProductDetailsParams.newBuilder().setProductList(productList).build();
    
        billingClient.queryProductDetailsAsync(
            queryProductDetailsParams,
            new ProductDetailsResponseListener() {
            @Override
            public void onProductDetailsResponse(
                BillingResult billingResult, QueryProductDetailsResult productDetailsResponse) {
                if (billingResult.getResponseCode() == BillingResponseCode.OK) {
                List<ProductDetails> productDetailsList =
                    productDetailsResponse.getProductDetailsList();
                    listener.onProductDetailsResponse(productDetailsList);
                } else {
                Log.e(TAG, "QueryProductDetailsAsync Failed: " + billingResult.getDebugMessage());
                listener.onBillingError("Query Products Failed: " + billingResult.getResponseCode());
                }
            }
            });
    }
    
    Si recuperas el producto único (trending_movie_1 en este ejemplo) en ProductDetails, obtendrás una respuesta similar a la siguiente:
    {
        "productId": "trending_movie_1",
        "type": "inapp",
        "title": "Purrfect Mayhem: The Rewind Protocol (Movies All Day | Play Samples)",
        "name": "Purrfect Mayhem: The Rewind Protocol",
        "description": "Dr. Arid Thorne and a smart tiger named Yolo find a mysterious tape. It's a \"Rewind Protocol\" to fix time. A shadowy group, the Clockinator, hunts them to seize the tape's power.",
        "skuDetailsToken": "<---skuDetailsToken--->",
        "oneTimePurchaseOfferDetails": {},
        "oneTimePurchaseOfferDetailsList": [
            {
                "priceAmountMicros": 13000000,
                "priceCurrencyCode": "USD",
                "formattedPrice": "$13.00",
                "offerIdToken": "<---buy offerIdToken --->",
                "purchaseOptionId": "buy-option",
                "offerTags": [
                    "adventure",
                    "mystery"
                ]
            },
            {
                "priceAmountMicros": 7000000,
                "priceCurrencyCode": "USD",
                "formattedPrice": "$7.00",
                "offerIdToken": "<---rent offerIdToken--->",
                "purchaseOptionId": "rent-option",
                "offerTags": [
                    "adventure",
                    "mystery"
                ],
                "rentalDetails": {
                    "rentalPeriod": "P30D",
                    "rentalExpirationPeriod": "PT24H"
                }
            }
        ]
    }
    
    Observa que las opciones de compra de alquiler y compra están disponibles en oneTimePurchaseOfferDetailsList. Esta lista tiene 2 opciones de compra (buy-option y rent-option) que se configuraron en Play Console. Puedes identificar cada opción de compra de forma única por su offerIdToken.
  5. Recupera los tokens de oferta para las ofertas de alquiler y compra. Necesitas los tokens de la oferta para iniciar el flujo de facturación en el paso 6.
    @Override
    public void onProductDetailsResponse(List<ProductDetails> productDetailsList) {
    
        if (productDetailsList != null && !productDetailsList.isEmpty()) {
    
            // Iterate over all details of the queried product in step 4.
            for (ProductDetails productDetails : productDetailsList) {
    
                // Get the list of all the offers associated with the product.
                List<ProductDetails.OneTimePurchaseOfferDetails> offerDetailsList =
                        productDetails.getOneTimePurchaseOfferDetailsList();
    
                // Iterate over the offer details
                for (ProductDetails.OneTimePurchaseOfferDetails offerDetails : offerDetailsList) {
    
                    // For a Rent purchase option, the
                    // offerDetails.getRentalDetails() method returns
                    // the rent information. If this information is present,
                    // the offer corresponds to a Rent purchsae option.
                    if (offerDetails.getRentalDetails() != null) {
                        rentFormattedPrice = offerDetails.getFormattedPrice();
    
                        // Get the offerIdToken for the Rent purchase option
                        rentOfferToken = offerDetails.getOfferToken();
                        rentMovieTags = offerDetails.getOfferTags();
                    }
                    // If the offerDetails.getRentalDetails() returns
                    // null, the offer corresponds to a Buy purchsae option.
                    else {
                        buyFormattedPrice = offerDetails.getFormattedPrice();
    
                        // Get the offerIdToken for the Buy purchase option
                        buyOfferToken = offerDetails.getOfferToken();
                        buyMovieTags = offerDetails.getOfferTags();
                    }
                }
                updateUIButtons();
                return;
    
            }
        } else {
            Log.e(TAG, "No product details found for " + productId);
        }
    }
    
  6. Inicia el flujo de facturación.
    /**
     * Launches the billing flow for the product with the given offer token.
    *
    * @param activity The activity instance from which the billing flow will be launched.
    * @param productDetails The product details of the product to purchase.
    * @param offerToken The offer token of the product to purchase.
    * @return The result of the billing flow.
    */
    public void launchPurchase(Activity activity, ProductDetails productDetails, String offerToken) {
        ImmutableList<BillingFlowParams.ProductDetailsParams> productDetailsParamsList =
            ImmutableList.of(
                BillingFlowParams.ProductDetailsParams.newBuilder()
                    .setProductDetails(productDetails)
                    .setOfferToken(offerToken)
                    .build());
        BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
            .setProductDetailsParamsList(productDetailsParamsList)
            .build();
        billingClient.launchBillingFlow(activity, billingFlowParams);
    }
    

Sugerencia: También puedes configurar notificaciones para desarrolladores en tiempo real (RTDN) para implementar campañas de recuperación y otras estrategias de administración del ciclo de vida de las compras. Para comprender cómo configurar las RTDN y controlar las notificaciones con un seguimiento y derechos precisos, te recomendamos que realices el codelab Maximize Your Play Billing Integration.

7. Opciones de compra de prueba

Antes de que tus productos únicos estén disponibles en tu app publicada, puedes probar la integración de la PBL con verificadores de licencias y Play Billing Lab.

Aprenderás a probar la localización y la disponibilidad de precios en los casos en que la app solo está disponible en algunas regiones con un precio diferente para cada una.

Requisitos previos

Probar los precios regionales para las opciones de compra

Para probar los precios regionales de las opciones de compra, haz lo siguiente:

  1. Abre la app de Play Billing Lab y, luego, accede como verificador de licencias.
  2. En Configuration Settings, haz clic en Edit, selecciona el país France y, luego, haz clic en Apply. Aquí seleccionamos el país de Play, que determina la moneda que se mostrará en la app.
  3. Cierra y vuelve a abrir la app de ejemplo. Ahora debería mostrar la moneda de compra y alquiler para France en euros.

Para probar con otro país, selecciona Spain en el paso 2 y, luego, realiza el paso 3.

Video de prueba de Play Billing Lab

En el siguiente video, se muestran los pasos para probar los precios regionales con la app de ejemplo.

8. Próximos pasos

Documentos de referencia

9. ¡Felicitaciones!

¡Felicitaciones! Navegaste con éxito por Google Play Console para crear un nuevo producto único, configuraste una opción de compra y probaste el flujo de compra con Play Billing Lab. Ahora tienes una mejor comprensión del catálogo de productos flexible de Google Play para las compras únicas.

Encuesta

Valoramos mucho tus comentarios sobre este codelab. Considera dedicar unos minutos a completar nuestra encuesta.