Tenho um aplicativo simples (requer login de usuário com conta). Eu ofereço alguns recursos premium para usuários pagos, como mais conteúdo de notícias.
Preciso registrar se o usuário comprou este item no banco de dados do meu servidor. Quando forneço conteúdo de dados ao dispositivo do usuário, posso verificar o status do usuário e fornecer conteúdo diferente para o usuário pago.
Eu verifiquei o exemplo oficial do Trivialdrive fornecido pelo Google, ele não fornece nenhum código de exemplo para verificação do lado do servidor. Aqui estão minhas perguntas.
- Descobri que o exemplo usa a chave pública do meu aplicativo para verificar a compra, não parece bom, acho que posso simplesmente mover o processo de verificação para o meu servidor combinado com as credenciais de login do usuário para ver se a compra do usuário foi concluída e, em seguida, atualizar o banco de dados.
- Também há a API de compra que posso usar para consultar, o que preciso é passar o purchaseToken do usuário para o servidor.
Não tenho certeza de qual método devo seguir para verificar a compra do usuário e marcar o status do usuário em meu banco de dados, talvez ambos?
E temo que haja uma situação, se um usuário comprou este item do google play, mas por algum motivo, bem naquele momento, quando meu aplicativo lançou a verificação para o meu servidor, a conexão de rede caiu ou meu próprio servidor caiu , o usuário acabou de pagar o dinheiro no google play mas eu não registrei a compra no meu servidor? O que devo fazer, como posso lidar com esta situação.
Respostas:
Parece que você está procurando uma maneira de verificar se o usuário possui recursos premium habilitados em sua conta, então é por aqui que eu começaria;
Certifique-se de que haja um sinalizador de algum tipo em seu banco de dados indicando se o usuário tem recursos premium e inclua-o na carga útil de resposta da API ao solicitar informações da conta. Este sinalizador será sua autoridade principal para "recursos premium".
Quando um usuário faz uma compra no aplicativo, armazene em cache os detalhes (token, id do pedido e id do produto) localmente no cliente (ou seja, o aplicativo) e envie-os para sua API.
Sua API deve então enviar
purchaseToken
para a API do desenvolvedor do Google Play para validação.Algumas coisas podem acontecer a partir daqui:
No caso de 1. ou 2. (códigos de status 2xx ou 4xx) seu cliente limpa o cache de detalhes de compra porque não precisa mais deles porque a API indicou que foi recebido.
Após uma validação bem-sucedida (caso 1.), você deve definir o
premium
sinalizador como verdadeiro para o usuário.No caso de 3. (código de status 5xx) ou um timeout da rede, o cliente deve continuar tentando até receber um código de status 2xx ou 4xx de sua API.
Dependendo dos seus requisitos, você pode esperar alguns segundos antes de enviar novamente ou apenas enviar os detalhes para sua API sempre que o aplicativo for iniciado novamente ou sair do fundo se os detalhes da compra estiverem presentes no cache do aplicativo.
Esta abordagem deve cuidar de tempos limite de rede, servidores indisponíveis, etc.
Existem agora algumas questões que você precisa considerar:
O que deve acontecer imediatamente após uma compra? O aplicativo deve esperar até que a validação seja bem-sucedida antes de fornecer conteúdo premium ou deve conceder acesso provisoriamente e retirá-lo se a validação falhar?
Conceder acesso provisório a recursos premium facilita o processo para a maioria de seus usuários, mas você concederá acesso a vários usuários fraudulentos enquanto sua API valida o
purchaseToken
.Dito de outra forma: a compra é válida até que seja comprovada a fraude ou; fraudulento até que seja comprovado como válido?
Para identificar se o usuário ainda tem uma assinatura válida quando seu período de assinatura chegar para renovação, você precisará agendar uma revalidação no
purchaseToken
para ser executado noexpiryTimeMillis
que foi retornado no resultado .Se
expiryTimeMillis
estiver no passado, você pode definir opremium
sinalizador como falso. Se estiver no futuro, reprograme-o novamente para o novoexpiryTimeMillis
.Por último, para garantir que o usuário tenha acesso premium (ou não), seu aplicativo deve consultar sua API para obter os detalhes do usuário na inicialização do aplicativo ou quando ele sai do segundo plano.
fonte
A documentação sobre isso é confusa e estranhamente prolixa com as coisas que são quase inconseqüentes, enquanto deixa a documentação realmente importante quase desvinculada e super difícil de encontrar. Isso deve funcionar muito bem na plataforma de servidor mais popular que pode executar as bibliotecas de cliente API do Google, incluindo Java, Python, .Net e NodeJS, entre outras. Nota: Eu testei apenas o cliente Python api conforme mostrado abaixo.
Passos necessários:
Faça um projeto de API, a partir do link de acesso à API em seu console do Google Play
Faça uma nova conta de serviço, salve a chave privada JSON que é gerada. Você precisará levar este arquivo para o seu servidor.
Pressione Concluído na seção da conta de serviço do Play console para atualizar e, em seguida, conceda acesso à conta de serviço
Obtenha uma biblioteca cliente API do Google para sua plataforma de servidor em https://developers.google.com/api-client-library
Use a biblioteca de cliente de sua plataforma específica para construir uma interface de serviço e ler diretamente o resultado de sua verificação de compra.
Você não precisa se preocupar com escopos de autorização, fazendo chamadas de solicitações personalizadas, atualizando tokens de acesso, etc. a biblioteca cliente da API cuida de tudo. Aqui está um exemplo de uso da biblioteca Python para verificar uma assinatura:
Primeiro, instale o cliente API do Google em seu pipenv desta forma:
Em seguida, você pode configurar as credenciais do cliente API usando o arquivo json de chave privada para autenticar a conta de serviço.
Agora você pode verificar as compras de assinaturas ou compras de produtos usando a biblioteca, diretamente.
A documentação da interface de serviço da plataforma para a API do desenvolvedor do jogo não está vinculada de uma maneira fácil de encontrar, para alguns é francamente difícil de encontrar . Aqui estão os links para as plataformas populares que encontrei:
Python | Java | .NET | PHP | NodeJS (Github TS) | Go (Github JSON)
fonte
Exemplo completo de uso da biblioteca cliente de API do Google para PHP :
Configure seu projeto do Google e acesse o Google Play para sua conta de serviço, conforme descrito na resposta de Marc aqui https://stackoverflow.com/a/35138885/1046909 .
Instale a biblioteca: https://developers.google.com/api-client-library/php/start/installation .
Agora você pode verificar seu recibo da seguinte forma:
Depois que $ compra é uma instância de Google_Service_AndroidPublisher_SubscriptionPurchase
fonte
Você pode tentar usar Purchases.subscriptions: get server-side. Leva packageName, subscriptionId e token como parâmetros e requer autorização .
Se for bem-sucedido, este método retorna um recurso Purchases.subscriptions no corpo da resposta.
fonte
Eu respondo a esta preocupação
A situação é:
O usuário compra o item 'abc' usando o serviço google play -> retornar OK -> falha ao verificar com o servidor por alguns motivos, como falta de conexão com a Internet.
A solução é:
No lado do cliente, antes de mostrar o botão 'Google Wallet', você verifica se o item 'abc' já pertence a ele.
https://developer.android.com/google/play/billing/billing_reference.html#getSkuDetails
fonte