android - tarjeta - google play developer console
Cómo verificar la compra de la aplicación de Android en el lado del servidor(Google Play en la aplicación de facturación v3) (5)
Tengo una aplicación simple (necesita inicio de sesión de usuario con cuenta). Proporciono algunas características premium para usuarios pagos, como más contenido de noticias.
Necesito registrar si el usuario ha comprado 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.
Revisé la muestra oficial de Trivialdrive provista 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 dentro para verificar la compra, no se ve bien, creo que solo 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 la compra del usuario al servidor.
No estoy seguro de qué método debo tomar para verificar la compra del usuario y marcar el estado del usuario en mi base de datos, ¿quizás ambos?
Y me temo que existe 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 está inactiva o mi propio servidor está inactivo , ¿El usuario acaba de pagar el dinero en Google Play pero no grabé la compra en mi servidor? ¿Qué debo hacer? ¿Cómo puedo lidiar con esta situación?
Ejemplo completo de uso de la Biblioteca de cliente API de Google para PHP :
-
Configure su Proyecto Google y acceda a Google Play para su cuenta de servicio como se describe en la respuesta de Marc aquí https://.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:
$client = new /Google_Client(); $client->setAuthConfig(''/path/to/service/account/credentials.json''); $client->addScope(''https://www.googleapis.com/auth/androidpublisher''); $service = new /Google_Service_AndroidPublisher($client); $purchase = $service->purchases_subscriptions->get($packageName, $productId, $token);
Después de esa compra $ es una instancia de Google_Service_AndroidPublisher_SubscriptionPurchase
$purchase->getAutoRenewing(); $purchase->getCancelReason(); ...
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 desvinculada y súper difícil de encontrar. Esto debería funcionar muy bien en la plataforma de servidor más popular que puede ejecutar las bibliotecas de cliente de API de Google, incluidas Java, Python, .Net y NodeJS, entre otras. Nota: He probado solo el cliente de API Python como se muestra a continuación.
Pasos necesarios:
-
Haga un proyecto de API, desde el enlace de acceso de API en su consola 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 Cuenta de servicio de la consola Play para actualizar y luego otorgar acceso a la cuenta de servicio
-
Obtenga una biblioteca de cliente de API de Google para su plataforma de servidor en https://developers.google.com/api-client-library
- Use la biblioteca de cliente de su plataforma particular para crear una interfaz de servicio y lea directamente el resultado de su verificación de compra.
No necesita preocuparse por los ámbitos de autorización, realizar llamadas de solicitudes personalizadas, actualizar tokens de acceso, etc. la biblioteca del cliente 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 de API de Google en su pipenv de esta manera:
$ pipenv install google-api-python-client
Luego, puede configurar las credenciales del cliente api utilizando el archivo json de clave privada para autenticar la cuenta de servicio.
credentials = service_account.Credentials.from_service_account_file("service_account.json")
Ahora puede verificar compras de suscripción o compras de productos utilizando la biblioteca, directamente.
#Build the "service" interface to the API you want
service = googleapiclient.discovery.build("androidpublisher", "v3", credentials=credentials)
#Use the token your API got from the app to verify the purchase
result = service.purchases().subscriptions().get(packageName="your.app.package.id", subscriptionId="sku.name", token="token-from-app").execute()
#result is a python object that looks like this ->
# {''kind'': ''androidpublisher#subscriptionPurchase'', ''startTimeMillis'': ''1534326259450'', ''expiryTimeMillis'': ''1534328356187'', ''autoRenewing'': False, ''priceCurrencyCode'': ''INR'', ''priceAmountMicros'': ''70000000'', ''countryCode'': ''IN'', ''developerPayload'': '''', ''cancelReason'': 1, ''orderId'': ''GPA.1234-4567-1234-1234..5'', ''purchaseType'': 0}
La documentación para la interfaz de servicio de la plataforma para la API del 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)
Parece que lo que está buscando es una forma de verificar si el usuario tiene funciones premium habilitadas en su cuenta, así que aquí es donde comenzaría;
Asegúrese de que haya algún tipo de indicador en su base de datos que indique si el usuario tiene características premium e inclúyalo en la carga útil de respuesta de la API cuando solicite información de la cuenta. Esta bandera será su autoridad principal para las "características premium".
Cuando un usuario realiza una compra en la aplicación, guarde 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íelo a su API.
Su API debería enviar el
purchaseToken
a la
API de desarrollador de Google Play
para su validación.
Algunas cosas pueden pasar desde aquí:
- El recibo es válido, su API responde al cliente con un código de estado de 200 Ok
- El recibo no es válido, su API responde al cliente con un código de estado 400 Solicitud incorrecta
- La API de Google Play está inactiva, su API responde con un código de estado 502 Bad Gateway
En el caso de 1. o 2. (códigos de estado 2xx o 4xx) su cliente borra el caché de los detalles de 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 indicador
premium
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 volver a enviar o simplemente enviar los detalles a su API cada vez que la aplicación se inicie nuevamente o salga del fondo 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 conceder acceso tentativamente y quitarla si la validación falla?
Otorgar acceso tentativo a funciones premium facilita el proceso para la mayoría de sus usuarios, pero también otorgará acceso a una cantidad de usuarios fraudulentos mientras su API valida la
purchaseToken
.
Para decirlo de otra manera: la compra es válida hasta que se demuestre fraudulenta o; fraudulento hasta que se pruebe su validez
Para identificar si el usuario aún tiene una suscripción válida cuando se venza su período de suscripción, deberá programar una revalidación en el
purchaseToken
para que se ejecute en el
expiryTimeMillis
que se devolvió en el
result
.
Si
expiryTimeMillis
está en el pasado, puede establecer el indicador
premium
en falso.
Si está en el futuro, reprograme nuevamente para el nuevo
expiryTimeMillis
.
Por último, para garantizar que el usuario tenga acceso premium (o no), su aplicación debe consultar en su API los detalles de los usuarios sobre el inicio de la aplicación o cuando se sale de un segundo plano.
Puede intentar usar Purchases.subscriptions: obtener del lado del servidor. Toma packageName, suscripciónId y token como parámetros y requiere authorization .
Comprueba si la compra de suscripción de un usuario es válida y devuelve su tiempo de vencimiento.
Si tiene éxito, este método devuelve un recurso Purchases.subscriptions en el cuerpo de la respuesta.
Respondo a esta inquietud
la conexión de red está inactiva o mi propio servidor está inactivo, ¿el usuario acaba de pagar el dinero en google play pero no grabé la compra en mi servidor? ¿Qué debo hacer? ¿Cómo puedo lidiar con esta situación?
La situacion es:
El usuario compra el artículo ''abc'' usando el servicio de Google Play -> regresar OK -> no puede verificar con el servidor por algunas razones, como la falta de 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 propiedad.
- en caso afirmativo, verifique nuevamente con el servidor
- si no, muestra el botón ''Google Wallet''.
Compra compra = mInventory.getPurchase (''abc'');
if (purchase != null) // Verify with server else // show Google Wallet button
https://developer.android.com/google/play/billing/billing_reference.html#getSkuDetails