Advertencia: El AIDL ya no es compatible y se quitará en una versión futura. Para implementar funciones relacionadas con la facturación, usa la Biblioteca de Facturación Google Play.
Puedes usar una interfaz de Lenguaje de definición de la interfaz de Android (AIDL) a fin de implementar algunas funciones del sistema de facturación de 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 AIDL de Facturación Google Play:
- 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 AIDL 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. - 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 unBundle
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. - 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 unBundle
con los detalles de los productos, como el precio, el título, la descripción y el tipo de compra. - 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.- Google Play muestra un
Bundle
con unPendingIntent
que tu aplicación usa para iniciar la IU de la confirmación de la compra. - Tu aplicación llama al método
startIntentSenderForResult
para iniciar el intent pendiente. - 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étodoonActivityResult
. Como resultado deonActivityResult
, se obtiene un código en el que se indica si se procesó correctamente la compra o si se canceló. ElIntent
de respuesta contiene información sobre el artículo comprado, incluida una stringpurchaseToken
que genera Google Play para identificar de forma exclusiva la transacción de compra. ElIntent
también contiene la firma de la compra, que posee tu clave de desarrollador privada.
- Google Play muestra un
Para obtener más información sobre las llamadas a la API de AIDL de Facturación Google Play y las respuestas del servidor, consulta la Referencia de la API de AIDL de 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 AIDL 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:
- Llama al método
getBuyIntent
para iniciar el flujo de compra. - Inspecciona el objeto
Bundle
que muestra Google Play para determinar si la compra se realizó correctamente. - De ser así, llama al método
consumePurchase
para consumir el producto. - Inspecciona el código de respuesta de Google Play a fin de determinar si se procesó correctamente el consumo.
- 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:
- Envía una solicitud de tipo
getPurchases
para consultar los productos integrados en la aplicación que adquirió el usuario. - 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. - Inspecciona el código de respuesta de Google Play a fin de determinar si se procesó correctamente el consumo.
- De ser así, suministra el producto en la aplicación.
Configuración de compras entregadas cómo recompensas
Advertencia: Ya no se admiten los productos entregados como recompensa. 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.
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 objetoPendingIntent
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
Como el cliente de Google Play ahora almacena en caché los datos de facturación de forma local en el dispositivo, puedes usar la API de AIDL de Facturación Google Play 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 de forma considerable el tiempo de espera de la API.
getBuyIntent
getPurchases
isBillingSupported