La aplicación es un cliente de Android para un servicio remoto en el que todos los usuarios tienen cuentas y pueden realizar compras de artículos no consumibles. Cada compra está vinculada a la cuenta en la que fueron comprados. El esquema de compra actual es el siguiente:
- El cliente inicia la compra con el servicio de facturación en la aplicación Google Play. La solicitud de compra contiene la carga útil que identifica de forma única a la cuenta.
- Cuando la compra se completa con éxito, el cliente recupera los datos de compra que contienen la carga útil y el token de compra. También tiene una firma para los datos recibidos que actualmente no están verificados.
- El cliente envía el token de compra al servidor. En este punto tiene que ser autenticado.
- El servidor recibe el token de compra. El servidor se autentica con el servicio Google Play usando su clave de cuenta de servicio y recibe los datos de compra para el token dado. Los datos contienen la carga útil original y la información sobre la compra.
- El servidor valida los datos de compra: se verifica que la carga útil coincida con la identificación de usuario actualmente registrada, la compra aún no se ha consumido y se ha pagado con éxito.
- Si la verificación es exitosa, se marca que el cliente ha comprado el producto en el servidor y el cliente recibe una confirmación; de lo contrario, el cliente recibe un rechazo.
¿Qué podría salir mal con este esquema? Por ejemplo, me preocupa que la firma no se use en ninguna parte. Sin embargo, no veo qué uso hay en él si el servidor recibe los datos directamente de Google Play. En el peor de los casos, puede recibir un token incorrecto, pero la carga útil contiene la identificación del usuario, por lo que la compra se rechazará si se ha realizado para otra cuenta. Enviar el mismo token dos veces también es inútil ya que el producto no es consumible: se compró o no se compró. Pero tal vez me esté perdiendo algo aquí o hay algún otro defecto que no veo.