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 Facturación Google Play:

  1. Tu aplicación envía una solicitud de isBillingSupported a Google Play para determinar si se admite la versión de destino de la API de Facturación Google Play que usas. 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. Envía una solicitud de getPurchases para hacer una consulta sobre las compras del usuario. Si la solicitud se completa correctamente, Google Play muestra un Bundle con una lista de los ID del producto de los artículos comprados, de los detalles de cada compra y 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 hayas definido en Google Play, tu aplicación puede enviar una solicitud getSkuDetails. Debes especificar una lista de los ID de producto en la solicitud de consulta. Si la solicitud se completa correctamente, Google Play muestra un Bundle con los detalles de los productos, como el precio, el título, la descripción y el tipo 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 de getBuyIntent, en la que detalla el ID del producto del artículo que se comprará y 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 Bundle con un PendingIntent que tu aplicación usa para iniciar la IU de la confirmación de la compra.
    2. Tu aplicación llama al método startIntentSenderForResult para iniciar el intent pendiente.
    3. Cuando el flujo de confirmación de la compra termina (es decir, el usuario compra el artículo o cancela la compra), Google Play envía una respuesta Intent a tu 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 Intent de respuesta contiene información sobre el artículo comprado, incluida una string purchaseToken que genera 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 privada.

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 administrados se administran en la API de Facturación Google Play. Esto significa que Google Play mantiene la propiedad del usuario de todas las compras de productos administrados y 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 una llamada de getPurchases a Google Play. Tu aplicación puede enviar una llamada de consumePurchase para hacer una solicitud de consumo. En el argumento de la solicitud, incluye la string purchaseToken única del producto administrado que obtuviste de Google Play cuando se realizó 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. Llama al método getBuyIntent para iniciar el flujo de compra.
  2. Inspecciona el objeto Bundle que muestra Google Play para determinar si la compra se realizó correctamente.
  3. De ser así, llama 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 consumibles integrados en la aplicación, llama al método consumePurchase para consumir los artículos. 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 como recompensas

Advertencia: Los productos entregados como recompensa ya no son compatibles. Para obtener más información, consulta Cómo crear un producto entregado como recompensa.

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.

Cómo indicar y cargar un SKU

Antes de ofrecer un producto entregado como recompensa a un usuario, llama 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.

Si deseas 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 al getBuyIntentExtraParams() en un subproceso en segundo plano. Una vez que obtengas una respuesta del BILLING_RESPONSE_RESULT_OK, habilita el producto entregado como recompensa del usuario y guarda el objeto PendingIntent que se muestra para usarlo 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 en el cumplimiento de las obligaciones legales relacionadas con niños y usuarios menores de edad, como la Ley de Protección de la Privacidad de Menores en Internet (COPPA) y el Reglamento General de Protección de Datos (GDPR), tu app debe declarar qué anuncios pueden estar dirigidos 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 de recompensa está dirigida a niños o usuarios menores de edad, incluye los parámetros adicionales childDirected y underAgeOfConsent, 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, su aplicación podrá usar el objeto PendingIntent guardado para reproducir anuncios. Para ello, llama al elemento startIntentSenderForResult():

Kotlin

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

Java

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

Luego, procesa los resultados del flujo de trabajo de facturación en el onActivityResult(), como se muestra en los siguientes fragmentos de código. Para controlar 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