Android: validação de recibo de compra no aplicativo google play

97

Estou usando o google wallet como meu gateway de pagamento, depois de comprar o produto google, dando-me uma resposta abaixo que

{ 
 "orderId":"12999763169054705758.1371079406387615", 
 "packageName":"com.example.app",
 "productId":"exampleSku",
 "purchaseTime":1345678900000,
 "purchaseState":0,
 "developerPayload":"bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ",
 "purchaseToken":"rojeslcdyyiapnqcynkjyyjh"
 }

Estou tentando usar a validação de recibo que o Google Play recentemente introduziu. No console do Google Developer, criei a chave do certificado por conta de serviço na permissão. Mas estou confuso sobre como usar a validação de recibo depois de comprar um produto na Google Play-store.

Então, alguém pode me ajudar como fazer a validação do Recibo de InAppCompra.

Binil Surendran
fonte
Olá Binil, você o completou para a compra de assinatura?
Anshul Tyagi
seu produto de gerenciamento @Anshul Tyag
Binil Surendran
@BinilSurendran .. Minha pergunta é diferente da sua, mas preciso saber o id de e-mail que foi usado para a compra no aplicativo. você pode ajudar como posso obter esse e-mail, pois preciso dele para referência futura em meu aplicativo
Pallavi
@Pallavi. desculpe, não tenho a idéia de obter a id de e-mail do comprador. como a resposta dada pelo google após a compra não tem email_id
Binil Surendran

Respostas:

222

O Google fornece validação de recibo por meio da API do desenvolvedor do Google Play , dentro da API há dois endpoints nos quais você estará mais interessado: Purchases.products: get e Purchases.subscriptions: get .

Purchases.products: getpode ser usado para verificar uma compra de produto sem renovação automática, onde Purchases.subscriptions: geté para verificar e verificar novamente as assinaturas de produto com renovação automática.

Para usar qualquer endpoint você deve saber o packageName, productId, purchaseTokentodos estes podem ser encontrados na carga útil que você recebeu na compra. Você também precisa de um access_tokenque pode obter criando uma conta de serviço API do Google.

Para começar a usar uma conta de serviço, primeiro vá para a página de configurações de acesso da API do console do desenvolvedor do Google Play e clique no botão Criar novo projeto:

Crie um novo projeto de API do Google

Agora você deve ver um novo projeto vinculado e algumas novas seções, na seção Conta de serviço, clique no botão Criar conta de serviço.

Crie uma nova conta de serviço

Você verá uma caixa de informações com instruções para criar sua conta de serviço. Clique no link para o Google Developers Console e uma nova guia aparecerá.

Abra o Google Developers Console

Agora clique em Criar novo ID de cliente, selecione Conta de serviço nas opções e clique em Criar ID de cliente.

Crie um novo ID de cliente

Um arquivo JSON será baixado, este é o seu JSON Web Token que você usará para trocar por um, access_tokenportanto, mantenha-o seguro.

Em seguida, mude as guias de volta para o console do desenvolvedor do Google play e clique em Concluído na caixa de informações. Você deve ver sua nova conta de serviço na lista. Clique em Conceder acesso ao lado do e-mail da conta de serviço.

Garantir acesso

Em seguida, em Escolha uma função para este usuário, selecione Finanças e clique em Adicionar usuário.

Defina a função para Finanças

Agora você configurou sua conta de serviço e ela tem todos os acessos necessários para realizar as validações de recebimento. O próximo passo é trocar seu JWT por um access_token.

O access_tokenexpira após uma hora de troca, você precisa de algum código de servidor para lidar com isso e o Google forneceu várias bibliotecas em várias linguagens para lidar com isso (lista não exaustiva):

Não vou entrar em detalhes porque há muita documentação sobre como usar essas bibliotecas, mas mencionarei que você deseja usar o https://www.googleapis.com/auth/androidpublishercomo o escopo OAuth2, o client_emaildo JWT como o issuere a chave pública que você pode obter no private_keye a frase secreta notasecretserá usada para o signing_key.

Assim que tiver o, access_tokenvocê está pronto para ir (pelo menos na próxima hora, momento em que você vai querer solicitar um novo seguindo o mesmo processo no parágrafo acima).

Para verificar o status de uma compra de consumível (sem renovação automática), faça uma getsolicitação http para:https://www.googleapis.com/androidpublisher/v2/applications/com.example.app/purchases/products/exampleSku/tokens/rojeslcdyyiapnqcynkjyyjh?access_token=your_access_token

Se você receber um código de resposta 200 http, tudo correu conforme planejado e sua compra foi válida. Um 404 significa que seu token é inválido, portanto, a compra provavelmente foi uma tentativa de fraude. Um 401 significará que seu token de acesso é inválido e um 403 significará que sua conta de serviço não tem acesso suficiente. Verifique se você ativou Finanças para a conta de acesso no console do desenvolvedor do Google Play.

A resposta de um 200 será semelhante a esta:

{
  "kind": "androidpublisher#productPurchase",
  "purchaseTimeMillis": long,
  "purchaseState": integer,
  "consumptionState": integer,
  "developerPayload": string
}

Para obter uma explicação de cada propriedade, consulte https://developers.google.com/android-publisher/api-ref/purchases/products .

As assinaturas são semelhantes, mas o endpoint se parece com isto:

https://www.googleapis.com/androidpublisher/v2/applications/packageName/purchases/subscriptions/subscriptionId/tokens/token?access_token=you_access_token

E a resposta deve conter estas propriedades:

{
  "kind": "androidpublisher#subscriptionPurchase",
  "startTimeMillis": long,
  "expiryTimeMillis": long,
  "autoRenewing": boolean
}

Consulte https://developers.google.com/android-publisher/api-ref/purchases/subscriptions para as descrições das propriedades e observe que startTimeMillise expiryTimeMillisestarão sujeitos a alterações dependendo da duração da assinatura.

Boa validação!

Marc Greenstock
fonte
Eu adicionei um novo usuário no console do desenvolvedor e recebi um certificado JSON obtido no console. Você pode me ajudar a fazer a validação de recibo com o arquivo baixado @Marc Greenstock
Binil Surendran
@BinilS Você precisará ser mais específico, em qual linguagem do lado do servidor você deve escrever seu código?
Marc Greenstock
estou usando java no lado do servidor @Marc Greenstock
Binil Surendran
3
Esta é a primeira vez que vejo um guia detalhado para implementar a validação de pagamento do servidor em 2 dias de pesquisa. Afirmativo. Existe um código de servidor pronto para usar em algum lugar? Acho muito estranho não conseguir encontrar algo assim em lugar nenhum
Anônimo,
2
@MarcGreenstock Obrigado pela resposta detalhada.
Lavakush
28

A resposta de Marc é excelente. Acrescentarei apenas que a biblioteca cliente da API do desenvolvedor do Google Play para Java torna muito mais simples a conexão de seu servidor aos servidores do Google Play. A biblioteca lida automaticamente com a atualização do token de autenticação e também fornece uma API segura de tipos para que você não precise se preocupar com URLs.

Veja como você configura o Publishersingleton:

httpTransport = GoogleNetHttpTransport.newTrustedTransport();
jsonFactory = JacksonFactory.getDefaultInstance();      
credential = GoogleCredential.fromStream(getClass().getResourceAsStream("/path/to/your/key.json")).createScoped(Collections.singleton(AndroidPublisherScopes.ANDROIDPUBLISHER));
publisher = new AndroidPublisher.Builder(httpTransport, jsonFactory, credential).setApplicationName(APP_NAME).build();

O código a seguir consulta a compra de um produto:

ProductPurchase product = publisher.purchases().products().get(PACKAGE_NAME, sku, token).execute();
Integer purchaseState = product.getPurchaseState();
product.getPurchaseTimeMillis();
product.getConsumptionState();
product.getDeveloperPayload();

Você também pode consultar assinaturas:

SubscriptionPurchase sub = publisher.purchases().subscriptions().get(PACKAGE_NAME, sku, token).execute();
sub.getAutoRenewing();
sub.getCancelReason();
...
Jeshurun
fonte
Este é o código em um servidor Java ou executado no Android antes de chamar um servidor arbitrário?
usuário
2
@jeshurun ​​Obrigado pelo código. Para outros leitores APP_NAME = APP_PACKAGE_NAME.
nevasca de
1
E quanto ao Python?
Babken Vardanyan
1
Obrigado! Para mim em vez de getClass().getResourceAsStream(...usar new FileInputStream(....
António Almeida
Obrigado. Muito útil. No entanto, eu também precisava adicionar: credential.refreshToken();entre obter a credencial e o editor.
grooble
5

@marc-greenstock forneceu uma ótima resposta, no entanto, há algo muito importante sobre a validação de recibos usando a API de desenvolvedor Android do Google Play.

Se você tiver problemas com o uso dessa API e adicionou seu produto no aplicativo ANTES de conceder permissão ou vinculá-lo à sua conta de serviço, será necessário abrir "Produtos no aplicativo" e realizar algumas atualizações. Você pode, por exemplo, editar a descrição do seu produto e salvar. Você deve obter permissão imediatamente.

Passei algumas horas pensando o que fiz de errado ...

Wojciech Kulik
fonte
2

Essa resposta é excelente. Outro problema que encontramos ao seguir a orientação foi que a conta do serviço não apareceu no Google Play Console. Acabamos encontrando esta solução para ajudar: A conta de serviço não aparece no Google Console após a criação

Basicamente, vá para IAM no Google API Console e adicione a nova conta de serviço, então ela aparecerá no Google Play Console. captura de tela

crescente
fonte
Você pode adicionar uma descrição aqui. Outra vez, se o link for revogado, sua resposta torna-se inválida
Mathews Sunny
1
Qual deve ser a função da conta adicionada?
Adi
2

Eu enfrentei um problema semelhante, o problema está nas configurações que fazemos no projeto de desenvolvedor do Google.

Consulte create-play-service-credentials para configurações. Use a mesma conta principal com a qual você criou seus produtos no aplicativo.

Certifique-se de remover o anterior.

Link para um projeto de desenvolvedor do Google Sua conta de desenvolvedor do Play precisa estar vinculada a um projeto de desenvolvedor do Google.

1a. Abra os menus Configurações> Conta do desenvolvedor e selecione acesso à API

Acesso API

1b. Selecione Link para conectar sua conta do Play a um projeto do Google Developer

escolha-link-projeto

1c. Concordo com os termos e condições

concordar termos-condições

2. Crie uma conta de serviço Em seguida, precisamos criar uma conta de serviço. Isso é feito no Console de API do Google.

2a. Selecione Criar conta de serviço

criar conta de serviço

2b. Criar credenciais de chave de conta de serviço

conta de serviço

2c. Insira os detalhes da conta de serviço

enter-service-account-details

2d. Baixe sua credencial JSON: json-credentials

3. Conceda acesso

3a. No Play Console, selecione Conceder acesso na conta de serviço recém-criada

garantir acesso

3b. Conceda as seguintes permissões:

aplicar permissões

Depois disso, aguarde 48 horas para permitir que o Google propague todos os direitos de acesso para APIs.

Ankit Jindal
fonte
1
Olá, eu segui estas etapas para acessar a API de desenvolvedor Android do Google Play. Ao conceder essa permissão, estou me pedindo para convidar um usuário. O que devemos fazer é me mostrando "ID da conta de serviço" será convidado a acessar esta conta de desenvolvedor .. qualquer ideia ?
Jay Rathod RJ
É esta alternativa para sasikanth.dev/posts/iap-verification-using-cloud-functions ? Estou completamente confuso se devo usar o Firebase ... o que não parece suficiente por si só, já que há uma necessidade de banco de dados (do blog) , sugiro salvar as informações de compra no banco de dados e verificar com outros usuários para evitar assinaturas duplicadas
Rahul Kahale