Cómo usar la Facturación integrada con AIDL

Puedes usar una interfaz de Lenguaje de definición de la interfaz de Android (AIDL) para implementar algunas funciones del servicio de Facturación integrada.

Compra de productos

Figura 1: Secuencia básica para una solicitud de compra

A continuación, puedes ver un flujo de compra típico con la API de facturación integrada:

  1. La aplicación envía una solicitud isBillingSupported a Google Play para verificar que sea compatible la versión de destino de la API de facturación integrada que utilices. La solicitud también verifica que Google Play admita la facturación en el país del usuario.
  2. Cuando se inicia la aplicación o el usuario accede a ella, es recomendable usar Google Play para verificar qué elementos le pertenecen al usuario. Para consultar las compras directas desde la aplicación que hizo el usuario, debes enviar una solicitud getPurchases. Si resulta exitosa la solicitud, Google Play te mostrará un Bundle con la lista de ID de los elementos comprados, los detalles de cada compra y las firmas correspondientes.
  3. Es probable que quieras informarle al usuario qué productos puede comprar. Para consultar los detalles de los productos integrados en la aplicación que definiste en Google Play, envía una solicitud getSkuDetails desde la aplicación. Debes especificar una lista de los ID de los productos en la solicitud de consulta. Si resulta exitosa la solicitud, Google Play te mostrará un Bundle con los detalles de los productos, incluidos precios, títulos, descripciones y tipos de compra.
  4. Si el usuario no tiene productos integrados en la aplicación, puedes iniciar su compra. Para iniciar una solicitud de compra, tu aplicación envía una solicitud getBuyIntent en la que se especifica el ID del producto del elemento que deseas comprar, entre otros parámetros. Debes registrar el ID de producto en Play Console cuando crees un nuevo producto integrado en la aplicación.
    1. Google Play te muestra un Bundle con un PendingIntent utilizado por tu aplicación para iniciar la IU de confirmación de compra.
    2. Tu aplicación lanza el intent pendiente llamando al método startIntentSenderForResult.
    3. Cuando el flujo de confirmación de la compra finaliza porque el usuario logró comprar el elemento o cancelar la compra, Google Play envía un Intent en respuesta al método onActivityResult. El código de resultado del onActivityResult incluye un código que indica si la compra se realizó con éxito o se canceló. El Intent de respuesta contiene información acerca del elemento comprado, incluida una string purchaseToken generada por Google Play para identificar de forma exclusiva la transacción de compra. El Intent también contiene la firma de la compra, que posee tu clave de desarrollador personal.

Para obtener más información acerca de las llamadas a la API de facturación integrada, consulta la Referencia sobre Facturación integrada.

Consumo de productos integrados en la aplicación

Puedes usar el mecanismo de consumo para hacer un seguimiento de la propiedad del usuario de los productos administrados.

Todos los productos se administran desde la API de facturación integrada. Esto significa que Google Play mantiene la propiedad del usuario de todas las compras de productos administrados y que tu aplicación puede consultar la información de compra del usuario cuando sea necesario. Cuando el usuario compra un producto administrado, la transacción queda registrada en Google Play. Una vez que se compra un producto administrado, se lo considera "adquirido". Los productos administrados "adquiridos" no pueden comprarse desde Google Play. Debes enviar una solicitud de consumo para el producto administrado "de tu propiedad" a fin de que Google Play permita que la compra. Consumir el producto administrado revierte su estado a "no adquirido" y descarta la información de compra anterior.

Figura 2: Secuencia básica para una solicitud de consumo

Para recuperar la lista de productos adquiridos por el usuario, tu aplicación envía una llamada de getPurchases a Google Play. La aplicación puede enviar una llamada consumePurchase para hacer una solicitud de consumo. En el argumento de la solicitud, debes especificar la string purchaseToken única del producto administrado que recibiste de Google Play en el momento de la compra. Google Play te mostrará un código de estado en el que se indicará si se registró correctamente el consumo.

Productos administrados consumibles y no consumibles

Puedes decidir si quieres gestionar tus productos administrados como consumibles o no consumibles.

Productos no consumibles
Normalmente, no se implementa el consumo en aquellos productos administrados que solo se pueden comprar una vez en la aplicación y que brindan un beneficio continuo. Una vez comprados, estos artículos quedan asociados de forma permanente a la Cuenta de Google del usuario. Las actualizaciones premium y los paquetes de niveles son ejemplos de productos administrados no consumibles.
Productos consumibles
Por el contrario, puedes implementar el consumo para los artículos que pueden estar disponibles para comprar varias veces. Normalmente, estos artículos brindan efectos transitorios. Por ejemplo, el personaje de un juego puede obtener puntos de vida o recibir monedas de oro adicionales en su inventario. El ofrecimiento de beneficios o efectos del producto comprado en tu aplicación se llama aprovisionamiento del producto administrado. Tienes la responsabilidad de controlar y rastrear la manera en la que se suministran los productos administrados a los usuarios.

Atención: Antes de suministrar el producto consumible administrado en tu aplicación, debes enviar una solicitud de consumo a Google Play y recibir una respuesta afirmativa que indique que se registró el consumo.

Gestión de compras consumibles en la aplicación

A continuación, puedes ver el flujo básico para la compra de un producto consumible administrado:

  1. Envía una llamada al método getBuyIntent para iniciar el flujo de compra.
  2. Inspecciona el Bundle que muestra Google Play para determinar si se realizó correctamente la compra.
  3. De ser así, envía una llamada al método consumePurchase para consumir el producto.
  4. Inspecciona el código de respuesta de Google  Play para determinar si se procesó correctamente el consumo.
  5. De ser así, suministra el producto en la aplicación.

Luego, cuando el usuario inicie la aplicación o acceda a ella, deberás controlar si posee productos consumibles integrados pendientes en la aplicación. En ese caso, asegúrate de consumir y suministrar esos productos. A continuación, puedes ver el flujo de inicio de la aplicación recomendado si implementas productos integrados consumibles en la aplicación:

  1. Envía una solicitud getPurchases para consultar los productos integrados adquiridos por el usuario en la aplicación.
  2. Si hay productos integrados consumibles, envía una llamada consumePurchase para consumirlos. Este paso es necesario porque es posible que la aplicación haya completado previamente la orden de compra del producto consumible, pero que se haya detenido o desconectado antes de enviar una solicitud de consumo.
  3. Inspecciona el código de respuesta de Google  Play para determinar si se procesó correctamente el consumo.
  4. De ser así, suministra el producto en la aplicación.

Configuración de compras entregadas cómo recompensas

Cuando uses AIDL para trabajar con productos entregados como recompensas, deberás almacenar en caché el "Intent" de compra antes de que un usuario necesite canjear su recompensa. Puedes llamar al intent de compra en un subproceso en segundo plano y guardar el de la respuesta realizada con éxito hasta que el usuario canjee la recompensa.

Cómo indicar y cargar un SKU

Antes de ofrecer un producto entregado como recompensa al usuario, debes llamar a getSkuDetails() para obtener los detalles del producto. Por cada producto entregado como recompensa, se llena un nuevo campo JSON (rewardToken) en la lista de SKU.

Para proporcionar la mejor experiencia del usuario, asegúrate de que haya un anuncio cargado y disponible antes de ofrecerle el producto en recompensa al usuario. Para ello, llama a getBuyIntentExtraParams() en un subproceso en segundo plano. Una vez que obtengas una respuesta de BILLING_RESPONSE_RESULT_OK, habilita el producto entregado como recompensa para el usuario y guarda el objeto PendingIntent para utilizarlo más adelante. El siguiente fragmento de código ejemplifica el proceso de carga de un anuncio asociado a un producto entregado como recompensa:

Kotlin

    val rewardToken = skuDetailsJson.optString("rewardToken")
    val extraParams = Bundle().putString("rewardToken", rewardToken)

    // This call blocks the current thread, so do this in the background.
    val buyIntentBundle : Bundle = mService.getBuyIntentExtraParams(9, packageName,
            sku, "inapp", "", extraParams)

    val response = buyIntentBundle.getInt("RESPONSE_CODE")
    if (response == BILLING_RESPONSE_RESULT_OK) {
        // Enable rewarded product.

        // Save this object for use later.
        val pendingIntentToSave = bundle.getParcelable(RESPONSE_BUY_INTENT)
    } else {
        // Don't offer rewarded product.
    }
    

Java

    String rewardToken = skuDetailsJson.optString("rewardToken");
    Bundle extraParams = new Bundle();
    extraParams.putString("rewardToken", rewardToken);

    // This call blocks the current thread, so do this in the background.
    Bundle buyIntentBundle = mService.getBuyIntentExtraParams(9, getPackageName(),
            sku, "inapp", "", extraParams);

    int response = buyIntentBundle.getInt("RESPONSE_CODE");
    if (response == BILLING_RESPONSE_RESULT_OK) {
        // Enable rewarded product.

        // Save this object for use later.
        PendingIntent pendingIntentToSave = bundle.getParcelable(RESPONSE_BUY_INTENT);
    } else {
        // Don't offer rewarded product.
    }
    

Cómo declarar anuncios apropiados a la edad

Para ayudar con el cumplimiento de obligaciones legales relacionadas con niños y usuarios menores de edad, entre ellas, la Ley de Protección de Privacidad Infantil en Internet (COPPA) y el Reglamento General de Protección de Datos (GDPR), tu aplicación debe declarar qué anuncios pueden dirigirse a niños de Estados Unidos o a usuarios que aún no tengan la edad de consentimiento aplicable de su país. En el centro de ayuda de AdMob, se explica cuándo debes etiquetar tus solicitudes de anuncios como contenido dirigido a niños y cuándo debes etiquetarlas como contenido apto para menores de edad. También se explica qué efecto tienen esas etiquetas.

Para indicar que una solicitud recompensada está dirigida a niños o usuarios menores de edad, debes incluir los parámetros adicionales childDirected y underAgeOfConsent, tal como se muestra en el siguiente fragmento de código:

Kotlin

    val rewardToken = skuDetailsJson.optString("rewardToken")
    val extraParams = Bundle().putString("rewardToken", rewardToken)
            .putInt("childDirected", ChildDirected.CHILD_DIRECTED)
            .putInt("underAgeOfConsent", UnderAgeOfConsent.UNDER_AGE_OF_CONSENT)

    // This call blocks the current thread, so do this in the background.
    val buyIntentBundle : Bundle = mService.getBuyIntentExtraParams(9, packageName,
            sku, "inapp", "", extraParams)
    

Java

    Bundle extraParams = new Bundle();
    extraParams.putString("rewardToken", rewardToken);
    extraParams.putInt("childDirected", ChildDirected.CHILD_DIRECTED);
    extraParams.putInt("underAgeOfConsent", UnderAgeOfConsent.UNDER_AGE_OF_CONSENT);

    // This call blocks the current thread, so do this in the background.
    Bundle buyIntentBundle =
      mService.getBuyIntentExtraParams(
        9, getPackageName(), sku, "inapp", "", extraParams);
    

Cómo reproducir anuncios antes de recompensar al usuario

Una vez que el usuario haga clic en el botón para comenzar a ver el anuncio, la aplicación podrá usar el objeto PendingIntent guardado para reproducir anuncios. Para ello, deberás llamar a startIntentSenderForResult():

Kotlin

    startIntentSenderForResult(
        pendingIntentToSave,
        RC_BUY, Intent(),
        0,
        0,
        0
    )
    

Java

    startIntentSenderForResult(pendingIntentToSave, RC_BUY, new Intent(),
            0, 0, 0);
    

Luego, deberás procesar los resultados del flujo de trabajo de facturación en onActivityResult(), como se muestra en los siguientes fragmentos de código. Para gestionar el proceso de reproducción de anuncios, Google Play utiliza el mismo conjunto de códigos de respuesta al servidor que utiliza con otros flujos de facturación.

Kotlin

    fun onActivityResult(requestCode : Int, resultCode : Int, data : Intent) {
        if (requestCode == RC_BUY) {
            int responseCode = data.getIntExtra(RESPONSE_CODE)
            String purchaseData = data.getStringExtra(RESPONSE_INAPP_PURCHASE_DATA)
            String signature = data.getStringExtra(RESPONSE_INAPP_SIGNATURE)

            // Handle reward purchase.
        }
    }
    

Java

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == RC_BUY) {
            int responseCode = data.getIntExtra(RESPONSE_CODE);
            String purchaseData = data.getStringExtra(RESPONSE_INAPP_PURCHASE_DATA);
            String signature = data.getStringExtra(RESPONSE_INAPP_SIGNATURE);

            // Handle reward purchase.
        }
    }
    

Almacenamiento en caché local

Ahora, el cliente de Google Play almacena en caché la información de facturación integrada de forma local, por lo que puedes usar la API de facturación integrada para consultar esta información con mayor frecuencia. Las llamadas a la API de facturación integrada que se muestran a continuación se hacen mediante búsquedas en caché en lugar de utilizar una conexión de red, lo que reduce considerablemente el tiempo de espera de la API:

  • getBuyIntent
  • getPurchases
  • isBillingSupported