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.
- Android: ¿En la facturación de la aplicación, utilizando la biblioteca o no?
- Algo ha cambiado en las facturas en la aplicación en Android
- Reproducir en la aplicación de facturación v3 - ¿Debo guardar los símbolos de compra?
- ¿Cómo puedo firmar automáticamente las solicitudes de facturación?
- ¿Por qué debería deshabilitar ProGuard para vending.billing?
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:
- ¿Alguien experimenta este cambio de cuenta extraño?
- ¿Cómo puedo estar seguro de cuál es la cuenta actual?
- ¿Hay alguna forma de sincronizar la selección de cuentas LVL y InAppBilling? ¿Alguna solución?
¡Gracias de antemano!
- En Facturación de aplicaciones - Orientación rápida de dispositivos - causa bloqueo (IllegalStateException)
- Las órdenes de Google Play realizadas mediante la facturación en la aplicación no se pueden cargar
- InApp comprado en Android
- ¿En qué condiciones se aplican los cambios de servidor de versión 3 de facturación en la aplicación disponibles en los dispositivos cliente?
- Facturación personalizada en la aplicación para evitar las tarifas de transacciones de Android / iTunes
- AndroidBillingLibrary: Servicio remoto se bloqueó en BillingController.requestPurchase
- La compra en la aplicación de Google Play devuelve el código de error -1008: null puchaseData o dataSignature
- Facturación de Android v3 - sin firma
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.
- dequeueOutputBuffer eleva IllegalStateException cuando se utiliza COLOR_FormatYUV420Codec compatible con Planar
- Constantes de diseño XML de Android