Tengo una aplicación simple (necesita inicio de sesión de usuario con cuenta). Proporciono algunas funciones premium para usuarios pagos, como más contenido de noticias.
Necesito registrar si el usuario compró este artículo en la base de datos de mi servidor. Cuando proporciono contenido de datos al dispositivo del usuario, puedo verificar el estado del usuario y proporcionar contenido diferente para el usuario pago.
Verifiqué la muestra oficial de Trivialdrive proporcionada por Google, no proporciona ningún código de muestra para la verificación del lado del servidor, aquí están mis preguntas.
- Encontré que la muestra usa la clave pública de mi aplicación en el interior para verificar la compra, no se ve bien, creo que puedo mover el proceso de verificación a mi servidor combinado con las credenciales de inicio de sesión del usuario para ver si la compra del usuario se completó y luego actualizar la base de datos.
- También hay una API de compra que puedo usar para consultar, lo que necesito es pasar el purchaseToken del usuario al servidor.
No estoy seguro de qué método debo seguir para verificar la compra del usuario y marcar el estado del usuario en mi base de datos, ¿quizás ambos?
Y me temo que hay una situación, si un usuario compró este artículo en Google Play, pero por alguna razón, justo en ese momento, cuando mi aplicación inició la verificación en mi servidor, la conexión de red no funciona o mi propio servidor no funciona , ¿El usuario acaba de pagar el dinero en Google Play pero no registré la compra en mi servidor? ¿Qué debo hacer? ¿Cómo puedo lidiar con esta situación?
Respuestas:
Parece que lo que estás buscando es una forma de comprobar si el usuario tiene funciones premium habilitadas en su cuenta, así que aquí es donde empezaría;
Asegúrese de que haya una bandera de algún tipo en su base de datos que indique si el usuario tiene funciones premium e inclúyala en la carga útil de respuesta de la API cuando solicite información de la cuenta. Esta bandera será su autoridad principal para las "funciones premium".
Cuando un usuario realiza una compra en la aplicación, almacena en caché los detalles (token, identificación del pedido e identificación del producto) localmente en el cliente (es decir, la aplicación) y luego envíalo a tu API.
Luego, su API debe enviar el
purchaseToken
a la API de desarrollador de Google Play para su validación.Algunas cosas pueden suceder desde aquí:
En el caso de 1. o 2. (códigos de estado 2xx o 4xx), su cliente borra el caché de los detalles de la compra porque ya no lo necesita porque la API ha indicado que se ha recibido.
Tras una validación exitosa (caso 1), debe establecer el
premium
indicador en verdadero para el usuario.En el caso de 3. (código de estado 5xx) o un tiempo de espera de la red, el cliente debe seguir intentándolo hasta que reciba un código de estado 2xx o 4xx de su API.
Dependiendo de sus requisitos, puede hacer que espere unos segundos antes de enviar nuevamente o simplemente enviar los detalles a su API cuando la aplicación se inicie nuevamente o salga del segundo plano si los detalles de la compra están presentes en el caché de la aplicación.
Este enfoque debe ocuparse de los tiempos de espera de la red, los servidores no están disponibles, etc.
Ahora hay algunas preguntas que debe considerar:
¿Qué debería suceder inmediatamente después de una compra? ¿Debería la aplicación esperar hasta que la validación sea exitosa antes de proporcionar contenido premium o debería otorgar acceso tentativamente y quitarlo si la validación falla?
Otorgar acceso tentativo a funciones premium simplifica el proceso para la mayoría de sus usuarios, pero también otorgará acceso a varios usuarios fraudulentos mientras su API valida el
purchaseToken
.Para decirlo de otra manera: la compra es válida hasta que se pruebe que es fraudulenta o; fraudulento hasta que se demuestre su validez?
Para identificar si el usuario todavía tiene una suscripción válida cuando su período de suscripción llegue para la renovación, deberá programar una revalidación en el
purchaseToken
para que se ejecute en elexpiryTimeMillis
que se devolvió en el resultado .Si
expiryTimeMillis
está en el pasado, puede establecer elpremium
indicador en falso. Si es en el futuro, vuelva a programarlo para el nuevoexpiryTimeMillis
.Por último, para asegurarse de que el usuario tenga acceso premium (o no), su aplicación debe consultar su API para obtener los detalles de los usuarios al iniciar la aplicación o cuando sale del segundo plano.
fuente
La documentación sobre esto es confusa y extrañamente detallada con las cosas que son casi intrascendentes, mientras que deja la documentación realmente importante casi sin vincular y muy difícil de encontrar. Esto debería funcionar muy bien en la plataforma de servidor más popular que puede ejecutar las bibliotecas cliente de google api, incluidas Java, Python, .Net y NodeJS, entre otras. Nota: He probado solo el cliente de la API de Python como se muestra a continuación.
Pasos necesarios:
Cree un proyecto de API, desde el enlace de acceso a API en su consola de Google Play
Cree una nueva cuenta de servicio, guarde la clave privada JSON que se genera. Deberá llevar este archivo a su servidor.
Presione Listo en la sección de la cuenta de servicio de la consola Play para actualizar y luego otorgar acceso a la cuenta de servicio
Obtenga una biblioteca cliente de google api para su plataforma de servidor en https://developers.google.com/api-client-library
Utilice la biblioteca de cliente de su plataforma en particular para crear una interfaz de servicio y leer directamente el resultado de la verificación de su compra.
Usted no tiene que molestarse con ámbitos de autorización, por lo que las peticiones de encargo llamadas, refrescante tokens de acceso, etc., la biblioteca de la API se encarga de todo. Aquí hay un ejemplo de uso de la biblioteca de Python para verificar una suscripción:
Primero, instale el cliente api de Google en su pipenv de esta manera:
Luego, puede configurar las credenciales del cliente api utilizando el archivo json de clave privada para autenticar la cuenta de servicio.
Ahora puede verificar las compras de suscripciones o las compras de productos usando la biblioteca, directamente.
La documentación de la interfaz de servicio de la plataforma para la API de desarrollador de Play no está vinculada de una manera fácil de encontrar, para algunos es francamente difícil de encontrar . Aquí están los enlaces para las plataformas populares que encontré:
Python | Java | .NET | PHP | NodeJS (Github TS) | Ir (Github JSON)
fuente
Ejemplo completo de uso de la biblioteca cliente de API de Google para PHP :
Configure su proyecto de Google y acceda a Google Play para su cuenta de servicio como se describe en la respuesta de Marc aquí https://stackoverflow.com/a/35138885/1046909 .
Instale la biblioteca: https://developers.google.com/api-client-library/php/start/installation .
Ahora puede verificar su recibo de la siguiente manera:
Después de eso, $ purchase es una instancia de Google_Service_AndroidPublisher_SubscriptionPurchase
fuente
Puede intentar usar las suscripciones de compras: obtener del lado del servidor. Toma packageName, subscriptionId y token como parámetros y requiere autorización .
Si tiene éxito, este método devuelve un recurso de suscripciones de compras en el cuerpo de la respuesta.
fuente
Yo respondo a esta inquietud
La situación es:
El usuario compra el artículo 'abc' usando el servicio de Google Play -> regresar OK -> no verifica con el servidor por algunas razones, como no tener conexión a Internet.
La solución es:
En el lado del cliente, antes de mostrar el botón 'Google Wallet', verifica si el elemento 'abc' ya es de tu propiedad.
https://developer.android.com/google/play/billing/billing_reference.html#getSkuDetails
fuente