Cómo usar la Facturación Google Play con AIDL

Advertencia: El AIDL ya no es compatible y se quitará en una versión futura. Para implementar las funciones de la Facturación Google Play, usa la Biblioteca de la Facturación Google Play.

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

Compra de productos

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

A continuación, puedes ver un flujo de compra típico con la API de Google Play Billing:

  1. Tu aplicación envía una solicitud isBillingSupported a Google Play para determinar que la versión de destino de la API de Google Play Billing que estás usando es compatible. 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. A fin de consultar las compras del usuario, envía una solicitud getPurchases. Si es exitosa, Google Play muestra un objeto Bundle que contiene una lista de ID de producto de los artículos comprados, una lista de los detalles de las compras individuales y una lista de las firmas para las compras.
  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. Asegúrate de especificar una lista de los ID de los productos en ella. Si es exitosa, Google Play mostrará un objeto 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. Cuando crees un nuevo producto integrado en la aplicación, deberás registrar el ID de producto en Google Play Console.
    1. Google Play muestra un objeto Bundle con un elemento PendingIntent que tu aplicación utiliza para iniciar la IU de confirmación de compra.
    2. Tu aplicación lanza el intent pendiente mediante una llamada al método startIntentSenderForResult.
    3. Cuando finaliza el flujo de confirmación de la compra porque el usuario logró adquirir el elemento o cancelar la compra, Google Play envía un objeto Intent en respuesta al método onActivityResult. Como resultado de onActivityResult, se obtiene un código en el que se indica si se procesó correctamente la compra o si se canceló. El elemento Intent de respuesta contiene información acerca del elemento comprado, incluida una string purchaseToken que genera Google Play para identificar de forma exclusiva la transacción de compra. El objeto 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 Google Play Billing y las respuestas del servidor, consulta la Referencia de la Facturación Google Play.

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 Google Play Billing. 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 "adquirido" a fin de que Google Play permita que vuelva a estar disponible para comprar. 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 a Google Play una llamada de tipo getPurchases. La aplicación puede enviar una llamada de tipo 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 durante 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 para 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 se pueden 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.

Importante: Antes de aprovisionar el producto administrado consumible 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 objeto 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 a fin de 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 de tipo getPurchases para consultar los productos integrados en la aplicación que adquirió el usuario.
  2. Si hay productos integrados consumibles, envía una llamada de tipo 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 a fin de 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 el AIDL para trabajar con productos entregados como recompensas, deberás almacenar en caché el objeto "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.

Indica y carga 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 entregado como 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.
}

Declara 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 la Privacidad Infantil en Internet (COPPA) y el Reglamento General de Protección de Datos (GDPR), tu app debe declarar qué anuncios pueden dirigirse a niños de Estados Unidos o a sus 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);

Reproduce 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(), de la siguiente manera:

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 administrar el proceso de reproducción de anuncios, Google Play utiliza el mismo conjunto de códigos de respuesta al servidor que usa 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 la Facturación Google Play de forma local, por lo que puedes usar la API de Google Play Billing para consultar esta información con mayor frecuencia. Las llamadas a esta API 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