Agrega ofertas de pedido por adelantado para productos únicos

1. Introducción

En este codelab, te enfocarás en crear un producto único (OTP) y agregar una oferta de pedido por adelantado para el producto.

Nota: Antes de comenzar este codelab, debes solicitar acceso a la función de pedido anticipado completando el formulario de interés en el PAA a productos únicos.

Público

Este codelab está dirigido a desarrolladores de apps para Android que conocen los productos únicos y desean comprender cómo agregar ofertas de pedido por adelantado a sus productos únicos.

Requisito previo

Si es la primera vez que usas productos únicos, te recomendamos que completes el codelab Unlock new markets with regional product pricing.

Qué aprenderás

  • Cómo usar Google Play Console para crear ofertas de pedido por adelantado para tus productos únicos
  • Cómo usar las APIs de la Biblioteca de Play Billing para consultar productos únicos y los detalles de la oferta de pedido por adelantado correspondiente

Qué necesitarás

2. Compila la app de ejemplo

En este codelab, se usa una app de ejemplo para Android para enseñarte a 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 ofertas de pedidos por adelantado relacionadas.
  • Ejecuta flujos de compra para 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: Compilar la app de ejemplo solo 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.

3. Crea un OTP con pedido por adelantado en Play Console

Para crear productos únicos (OTP) 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 Play Console de Google Play. Solo después de subirla, podrás configurar las funciones relacionadas con la monetización en Play Console.
    1. Haz clic en Prueba y lanza > Pruebas > Versión interna > Crear una versión nueva.
    2. Ingresa un nombre de versión y sube el archivo APK firmado.
    3. Haz clic en Siguiente y, luego, en Guardar y publicar.

Ahora puedes crear los productos únicos.

Crea un producto único

Ahora, crea el producto único que deseas que compren los usuarios.

  1. Abre la app de ejemplo en Play Console de Google y navega a Monetización 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, upcoming_movie_1
    • (Opcional) Etiquetas: Agrega etiquetas pertinentes.
    • Nombre: Ingresa un nombre de producto. Por ejemplo, Product Movie
    • Descripción: Ingresa una descripción del producto. Por ejemplo, Product Description
    • (Opcional) Agrega una imagen de ícono: Sube un ícono que represente tu producto.
    Nota: Para los fines de este codelab, puedes omitir la configuración de 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.
    1. Selecciona Establecer como no disponible.
    Ten en cuenta que todas las regiones se seleccionan automáticamente y se establecen como Disponibles.
    1. Anula la selección solo del país United States y, luego, haz clic en Establecer como no disponible. Ahora, el producto único solo estará disponible en United States.
    2. En el menú desplegable Todas las regiones, selecciona Países y regiones disponibles. Solo deberías ver United States.
    3. Haz clic en el ícono de Precio. Aparecerá un diálogo para establecer el precio.
    4. Ingresa USD 10 y, luego, haz clic en Guardar.
  7. Haz clic en Guardar como borrador.

Nota: Todavía no actives la opción de compra. La activaremos después de configurar la oferta de pedido por adelantado. Esto se debe a que no puedes agregar una oferta de pedido por adelantado a una opción de compra activa cuya disponibilidad regional esté establecida.

Cómo agregar una oferta de pedido por adelantado

Ahora, agregarás una oferta de pedido por adelantado para la opción de compra Comprar que creaste anteriormente. Una oferta de pedido por adelantado permite a los usuarios comprar tu artículo antes de su lanzamiento oficial. Ten en cuenta que las ofertas de pedidos por adelantado solo se admiten para la opción de compra Comprar y solo se pueden configurar para productos nuevos en una región.

Agregar una oferta de pedido por adelantado implica los siguientes 2 pasos:

  1. Prepara la opción de compra Comprar para la oferta de pedido por adelantado.
  2. Agrega la oferta de pedido por adelantado para la opción de compra.

Prepara la opción de compra Comprar para la oferta de pedido por adelantado

  1. Abre la app de ejemplo en Play Console de Google y navega a Monetización con Play > Productos > Productos únicos.
  2. En la página Productos únicos, haz clic en la flecha hacia la derecha de tu producto (upcoming_movie_1). Se abrirá la página Editar producto único.
  3. Haz clic en la flecha hacia la derecha de la opción de compra buy-movie que creaste antes. Se abrirá la página Editar opción de compra.
  4. Haz clic en Editar disponibilidad y acceso y, luego, selecciona Establecer como disponible y permitir que los usuarios hagan pedidos por adelantado.
  5. En el menú desplegable Todas las regiones, selecciona Países y regiones disponibles. Solo debería mostrarse el United States que configuraste anteriormente.
  6. Selecciona el país y, luego, haz clic en Se estableció como disponible solo para pedidos por adelantado.
  7. Haz clic en Guardar.

Ten en cuenta que aún no agregaste una oferta de pedido por adelantado a tu opción de compra. El siguiente paso es agregar la oferta de pedido por adelantado.

Cómo agregar una oferta de pedido por adelantado

  1. Abre la app de ejemplo en Play Console de Google y navega a Monetización con Play > Productos > Productos únicos.
  2. En la página Productos únicos, haz clic en Agregar oferta > Pedido por adelantado para tu producto (upcoming_movie_1). Se abrirá la página Agregar un pedido por adelantado.
  3. Ingresa los detalles del pedido por adelantado:
    • ID de pedido por adelantado: Ingresa preorder-offer-1.
    • (Opcional) Agrega un descuento: Puedes seleccionar Ninguno, Porcentaje o Absoluto. A los efectos de este codelab, selecciona Ninguno.
    • (Opcional) Etiquetas: Agrega etiquetas pertinentes.
    • Fecha y hora de inicio: Establece una fecha que sea, al menos, dentro de 3 días.
    • Fecha y hora de finalización: Establece una fecha al menos 24 horas después de la fecha de inicio.
    • Disponibilidad después del período de pedido por adelantado: Elige si el producto estará disponible inmediatamente después del período de pedido por adelantado o en una fecha y hora posteriores específicas.
    • (Opcional) Garantía de precio más bajo: Selecciona esta opción si quieres que a los usuarios se les cobre el precio más bajo entre el precio del pedido por adelantado y el precio en el momento del lanzamiento. Esto puede ser un gran incentivo para los compradores anticipados.
  4. Haz clic en Guardar.
  5. Abre la página Editar producto único de tu producto único (upcoming_movie_1).
  6. Haz clic en Activar para la opción de compra (buy-movie).
  7. Haz clic en Activar para la oferta de pedido por adelantado (preorder-offer-1) en la opción de compra. Con esta acción, se activa la oferta de pedido por adelantado y se publica en la fecha que configuraste anteriormente en los detalles del pedido por adelantado.

Video sobre la creación de ofertas de pedido por adelantado

En el siguiente video, se muestran los pasos para crear una oferta de pedido por adelantado que se describieron anteriormente.

4. 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.1.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 (upcoming_movie_1 en este ejemplo) en ProductDetails, obtendrás una respuesta similar a la siguiente:
    {
        "productId": "upcoming_movie_1",
        "type": "inapp",
        "title": "Purrfect Mayhem: The Final Playback (Movies All Day | Play Samples)",
        "name": "Purrfect Mayhem: The Final Playback",
        "description": "Yolo and Thorne must reach the original broadcasting site to initiate the \"Final Playback\" and save the timeline. Follow them through their race against the Clockinators.",
        "skuDetailsToken": "<---skuDetailsToken--->",
        "oneTimePurchaseOfferDetails": {},
        "oneTimePurchaseOfferDetailsList": [
            {
                "priceAmountMicros": 8500000,
                "priceCurrencyCode": "USD",
                "formattedPrice": "$8.50",
                "offerIdToken": "<---offerIdToken--->",
                "offerId": "preorder",
                "purchaseOptionId": "buy-option",
                "offerTags": [],
                "validTimeWindow": {
                    "startTimeMillis": 1756771200000,
                    "endTimeMillis": 1785542400000
                },
                "preorderDetails": {
                    "preorderReleaseTimeMillis": 1785542400000,
                    "preorderPresaleEndTimeMillis": 1785542400000
                }
            }
        ]
    }
    
    Observa que los detalles de la oferta de pedido por adelantado están disponibles en oneTimePurchaseOfferDetailsList. Esta lista tiene 1 opción de compra (buy-option) para la que se configuró una oferta de pedido por adelantado en Play Console. Puedes identificar cada opción de compra de forma única por su offerIdToken.
  5. Recupera el token de la oferta junto con los detalles de la oferta de pedido por adelantado. Necesitas el token 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()) {
    
    // Process productDetailsList returned by QueryProductDetailsResult
    for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) {
      for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails :
          productDetails.getOneTimePurchaseOfferDetailsList()) {
        // Checks if the offer is a preorder offer.
        if (oneTimePurchaseOfferDetails.getPreorderDetails() != null) {
          // Process the returned PreorderDetails
          OneTimePurchaseOfferDetails.PreorderDetails preorderDetails =
              oneTimePurchaseOfferDetails.getPreorderDetails();
          // Get preorder release time in millis.
          long preorderReleaseTimeMillis = preorderDetails.getPreorderReleaseTimeMillis();
          // Get preorder presale end time in millis.
          long preorderPresaleEndTimeMillis = preorderDetails.getPreorderPresaleEndTimeMillis();
          // Get offer ID
            String offerId = oneTimePurchaseOfferDetails.getOfferId();
          // Get the associated purchase option ID
          if (oneTimePurchaseOfferDetails.getPurchaseOptionId() != null) {
            String purchaseOptionId = oneTimePurchaseOfferDetails.getPurchaseOptionId();
          }
        }
      }
      }
      } 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);
    }
    

5. 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.

Para comprender cómo puedes probar tus opciones de compra con Play Billing Lab, consulta el codelab Unlock new markets with regional product pricing.

6. Próximos pasos

Documentos de referencia

7. ¡Felicitaciones!

¡Felicitaciones! Navegaste correctamente por Google Play Console para crear una oferta de pedido por adelantado de un producto único. 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.