Android LVL y InAppBilling: cómo seleccionar la cuenta de usuario actual para la compra?

Utilizo Google LVL y Google Inapp Billing API ver 3 en mi aplicación java para Android. Por supuesto que uso (ligeramente modificado) LVL proyecto de la biblioteca de Google extras y tarro IAP que Google sugiere.

Biblioteca LVL LicenseValidator en verifyLicense recibe ResponseData con el identificador de usuario en él. Se dice en documentos de Google que es un identificador de usuario único, que representa la cuenta de usuario de google utilizada para la compra. Asumí (y me aseguro que en las pruebas) es la misma cadena (por ejemplo, "ANlOH <…> ppA ==") en todos los dispositivos donde el usuario ha iniciado sesión con la misma cuenta de Google.

Así que aquí está mi esquema de protección de compra de iap en breve.


Antes de que la aplicación de compra envíe el ID de usuario a mi servidor. Genera una carga útil cifrada de user-id y la devuelve. La aplicación realiza una solicitud de compra y coloca la carga útil en ella. La aplicación recibe un recibo firmado por Google, que tiene la misma carga. La aplicación envía este recibo a mi servidor con el ID de usuario actual. El servidor hace la firma y otras comprobaciones, compara los id de usuario de la carga útil y del remitente y si todo está bien envía los archivos del artículo de iap a la aplicación.

En otro escenario, cuando el usuario reinstala la aplicación a este u otro dispositivo, la aplicación recibe los recibos que le pertenecen de InAppBilling, los envía a mi servidor con el ID de usuario actual. El servidor realiza las mismas comprobaciones y, si todo está bien, envía todos los archivos necesarios a la aplicación.


Este enfoque con pequeñas diferencias funciona bien en otras plataformas. Pero he experimentado algunas fallas extrañas recientemente en la aplicación para Android. Mi servidor registra los problemas de comprobación de recibos y he encontrado errores extraños: usuario con un ID de usuario enviado correctamente recibos firmados pertenecientes a otro id de usuario (carga útil en el recibo sostiene que otro id de usuario). Cuando empecé a investigar, he descubierto que uno de esos extraños mensajes de "ataque de hackers" pertenece a uno de mis dispositivos de prueba mientras que otros pertenecen a usuarios reales (de acuerdo con los identificadores de pedido en recibos).

Este dispositivo de prueba con Android 4.4.2 tiene varias cuentas de Google agregadas en Configuración. Anteriormente estaba seguro de que Google utiliza la primera cuenta. Vi esos mensajes de registro:

InAppBillingUtils.getPreferredAccount: com.mypackage.appname: Account from first account - [jbC...FgH] 

Pero ahora veo que a veces LVL no usa la primera cuenta, sino otra. Veo esos mensajes en LogCat:

 InAppBillingUtils.pickAccount: smpxg.mythdefdf: Account determined from library ownership - [boL...M5E] 

Por otra parte, después de la nueva instalación de mi aplicación InAppBilling devolvió recibos de una cuenta, pero LVL dio usuario-id de otro ! Pero este comportamiento no es estable. Por ejemplo, ahora veo que LVL y InAppBilling piensan que la segunda cuenta es mi principal y trabajan con ella como se esperaba.

Asumí que ambas bibliotecas trabajarán lado a lado, pero parece que estaba equivocado. Obviamente, cuando la aplicación envía un recibo que pertenece al ID de usuario "… yUQ" junto con el actual id de uso "… ppA" al servidor se niega a enviar contenido comprado. Y tiene razón.

Si el usuario podría cambiar la cuenta corriente utilizada para las compras, acabo de añadir este truco en FAQ. PERO no puedo ver una manera de seleccionarla manualmente en ajustes. Además, el sistema de alguna manera lo selecciona de una manera aleatoria! La única manera de hacer que las cosas funcionen es pedirle al usuario que elimine todas las cuentas del dispositivo, excepto su primaria, pero es una mala solución.

Cuando el usuario compra el artículo de iap que es registrado en una cuenta y entonces cambia a otra cuenta él debe esperar no ver el artículo comprado. Es un comportamiento previsible, al igual que con la compra de aplicaciones. Pero ni siquiera sabe qué cuenta se utiliza en el momento!

AFAIK, no hay manera de obtener de InAppBilling servicio google id de usuario que seleccionó para las compras. Pero incluso si yo pudiera – tener ID de usuario cambiado al azar por el sistema hace IAP elementos a aparecer y desaparecer de vez en cuando 🙂

Parece que Google recomienda utilizar la carga útil del desarrollador para la protección, pero no proporciona ningún ID estable que pueda utilizarse para identificar una cuenta particular.

Así que mis preguntas son:

  1. ¿Alguien experimenta este cambio de cuenta extraño?
  2. ¿Cómo puedo estar seguro de cuál es la cuenta actual?
  3. ¿Hay alguna forma de sincronizar la selección de cuentas LVL y InAppBilling? ¿Alguna solución?

¡Gracias de antemano!

No he tenido una experiencia exacta con su problema, pero esto podría ser algo relevante

De acuerdo con la documentación de facturación de la aplicación

Si el dispositivo tiene más de una cuenta, la compra se realizará con la cuenta que descargó la aplicación. Si ninguna de las cuentas ha descargado la aplicación, la compra se realiza con la primera cuenta. Los usuarios pueden confirmar la cuenta que está realizando una compra ampliando el cuadro de diálogo de compra.

  • Ofrecer recursos multimedia adicionales (gráficos / sonidos) como elementos facturados en la aplicación de Google Play
  • IAB Error Ya poseiste este artículo
  • ¿Por qué otro servicio encima de IMarketBillingService?
  • Android InApp Billing: El elemento que solicitó no está disponible para su compra. Inconsistente en una cuenta de Google diferente
  • Cómo corregir - "Esta versión de la aplicación no está configurada para la facturación de mercado"?
  • El retorno de API de Google IAB API3 getSkuDetails () falló 5: Error del programador
  • Consumir compras antiguas Android IAB V3
  • Cómo probar In App Subscription en android
  • Error al consultar el inventario: Error al actualizar el inventario
  • Referencia actual de Android IAB
  • Android en la aplicación de compra, cómo comprobar si el usuario ha comprado un artículo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.