android - invoice - google play billing



Como verificar a compra para o aplicativo Android no lado do servidor(google play no app faturamento v3) (4)

A documentação sobre isso é confusa e estranhamente detalhada com as coisas que são quase inconsequentes, deixando 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 cliente do google api, incluindo Java, Python, .Net e NodeJS, entre outras. Nota: Eu testei apenas o cliente api do Python, conforme mostrado abaixo.

Etapas necessárias:

  1. Crie um projeto de API, a partir do link de acesso à API no seu console do Google Play

  2. Crie uma nova conta de serviço, salve a chave privada JSON gerada. Você precisará levar este arquivo para o seu servidor.

  3. Pressione Concluído na seção da conta de serviço do Play Console para atualizar e conceder acesso à conta de serviço

  4. Obtenha uma biblioteca cliente da API do Google para sua plataforma de servidor em https://developers.google.com/api-client-library

  5. Use a biblioteca de clientes da sua plataforma específica para criar uma interface de serviço e leia diretamente o resultado da verificação de compra.

Você não precisa se preocupar com escopos de autorização, fazer chamadas de solicitações personalizadas, atualizar 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 google api no seu pipenv assim:

$ pipenv install google-api-python-client

Em seguida, você pode configurar credenciais de cliente da API usando o arquivo json de chave privada para autenticar a conta de serviço.

credentials = service_account.Credentials.from_service_account_file("service_account.json")

Agora você pode verificar as compras de assinatura ou compras de produtos usando a biblioteca diretamente.

#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}

A documentação da interface do serviço de plataforma para a API do desenvolvedor do Google Play não está vinculada de maneira fácil de encontrar. Para alguns, é extremamente difícil encontrá-la . Aqui estão os links para as plataformas populares que encontrei:

Python | Java | .NET | PHP | NodeJS (Github TS) | Vá (Github JSON)

https://ffff65535.com

Eu tenho um aplicativo simples (precisa de login de usuário com conta). Eu forneço alguns recursos premium para usuários pagos, como mais conteúdo de notícias.

Eu preciso gravar se o usuário comprou este item no meu banco de dados do 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 a amostra Trivialdrive oficial fornecida pelo Google, ele não fornece nenhum código de exemplo para verificação do lado do servidor, aqui estão minhas perguntas.

  1. Eu encontrei o exemplo usar a chave pública do meu aplicativo dentro para verificar compra, parece não bom, eu acho que posso apenas mover o processo de verificação para o meu servidor combinado com credenciais de login de usuário para ver se a compra do usuário concluída e, em seguida, atualizar o banco de dados.
  2. Também existe uma API de compra que eu posso usar para consultar, o que eu preciso é passar o purchaseToken do usuário para o servidor.

Não tenho certeza do método que devo tomar para verificar a compra do usuário e marcar o status do usuário no meu banco de dados, talvez ambos?

E receio que haja uma situação, se um usuário comprou esse item do Google Play, mas, por algum motivo, só nesse momento, quando meu aplicativo fez a verificação para meu servidor, a conexão de rede está inativa ou meu servidor está inativo . usuário acabou de pagar o dinheiro no google play, mas eu não gravei a compra no meu servidor? O que devo fazer, como posso lidar com essa situação?


Eu respondo a essa preocupação

a conexão de rede está desativada ou o meu próprio servidor está inativo, o usuário acabou de pagar o dinheiro no google play, mas eu não gravei a compra no meu servidor? O que devo fazer, como posso lidar com essa situaçã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 nenhuma conexão com a Internet.

Solução é:

No lado do cliente, antes de mostrar o botão "Google Wallet", você verifica se o item "abc" já é de propriedade.

  • se sim, verifique com o servidor novamente
  • se não, mostre o botão "Google Wallet".

Compra de 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


Parece que o que você está procurando é uma maneira de verificar se o usuário tem recursos premium habilitados em sua conta, então é nesse ponto que eu começaria;

Certifique-se de que haja um sinalizador de algum tipo no seu banco de dados, indicando se o usuário tem recursos premium e o inclui na carga útil da resposta da API ao solicitar informações da conta. Esse sinalizador será sua principal autoridade 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, em seguida, envie-o para sua API.

Sua API deve enviar o purchaseToken para a API do desenvolvedor do Google Play para validação.

Algumas coisas podem acontecer daqui:

  1. O recibo é válido, sua API responde ao cliente com um código de status 200 Ok
  2. O recibo é inválido, sua API responde ao cliente com um código de status de 400 solicitações inválidas
  3. A API do Google Play está inativa, sua API responde com um código de status 502 Bad Gateway

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 dele porque a API indicou que ele foi recebido.

Após uma validação bem-sucedida (caso 1), você deve definir o sinalizador premium como verdadeiro para o usuário.

No caso de 3. (código de status 5xx) ou um tempo limite de rede, o cliente deve continuar tentando até receber um código de status 2xx ou 4xx da sua API.

Dependendo dos seus requisitos, você pode aguardar alguns segundos antes de enviar novamente ou apenas enviar os detalhes para sua API sempre que o aplicativo for iniciado novamente ou sair do segundo plano se os detalhes da compra estiverem presentes no cache do aplicativo.

Essa abordagem deve cuidar dos tempos limite de rede, servidores indisponíveis etc.

Existem agora algumas perguntas que você precisa considerar:

O que deve acontecer imediatamente após uma compra? O aplicativo deve aguardar 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?

A concessão de acesso provisório a recursos premium suaviza o processo para a maioria de seus usuários, mas você também concederá acesso a vários usuários fraudulentos enquanto sua API valida o purchaseToken .

Para colocar isso de outra maneira: a compra é válida até comprovada fraudulent ou; fraudulento até se provar válido?

Para identificar se o usuário ainda tem uma assinatura válida quando o período de assinatura é renovado, será necessário agendar uma expiryTimeMillis no purchaseToken para ser executado no expiryTimeMillis retornado no result .

Se o expiryTimeMillis estiver no passado, você poderá definir o sinalizador premium como false. Se for no futuro, reprograme-o novamente para o novo expiryTimeMillis .

Por fim, para garantir que o usuário tenha acesso premium (ou não), seu aplicativo deve consultar sua API para obter detalhes sobre o lançamento do aplicativo ou quando ele sai do segundo plano.






in-app-billing