Integrar a API Recall do PGS ao jogo

Esta página explica como implementar a API Recall no seu jogo. Primeiro, vamos abordar a configuração do servidor de jogos e do cliente para oferecer suporte à API. Em seguida, vamos mostrar como armazenar e extrair tokens.

Configuração do servidor de jogos

Configure o servidor de jogos para fazer chamadas da API Recall para os servidores do Google.

1. Configurar seu projeto dos serviços relacionados a jogos do Google Play

Siga as instruções em Como configurar os serviços relacionados a jogos do Google Play, caso ainda não tenha feito isso.

2. Configurar uma conta de serviço para o jogo

Siga as instruções para criar uma conta de serviço. No final, você terá um arquivo JSON com as credenciais da conta de serviço.

3. Fazer o download da biblioteca Java do lado do servidor para PlayGamesServices

Faça o download da biblioteca google-api-services-games (link em inglês) mais recente e faça upload dela para seu servidor.

4. Preparar credenciais para chamadas da API Recall

Consulte Como se preparar para fazer uma chamada de API autorizada para mais contexto.

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.services.games.Games;
import com.google.api.services.games.GamesScopes;

// ...

GoogleCredential credential =
  GoogleCredential.fromStream(new FileInputStream("<credentials>.json"))
    .createScoped(Collections.singleton(GamesScopes.ANDROIDPUBLISHER));

Games gamesApi =
    new Games.Builder(httpTransport, JSON_FACTORY, credential).build();

Configuração do cliente do jogo

Configure o cliente do jogo para extrair os IDs de sessão de recuperação usados pelo servidor para se comunicar com os servidores do Google.

SDK do Java

Configure o SDK do Java no seu cliente e inclua com.google.android.gms:play-services-games-v2:19.0.0 e com.google.android.gms:play-services-tasks:18.0.2 ou versões mais recentes no arquivo do Gradle.

Para se comunicar com os servidores do Google com as informações corretas, solicite um ID de sessão de recuperação do SDK do cliente, que você vai enviar ao servidor do jogo.

Kotlin

PlayGames.getRecallClient(getActivity())
                .requestRecallAccess()
                .addOnSuccessListener { recallAccess -> val recallSessionId: String = recallAccess.getSessionId() }
                // Send the recallSessionId to your game server

Java

PlayGames.getRecallClient(getActivity())
  .requestRecallAccess()
  .addOnSuccessListener(
    recallAccess -> {
      String recallSessionId = recallAccess.getSessionId();
      // Send the recallSessionId to your game server
    });

SDK do Unity

Configure o SDK do Unity no seu cliente, caso ainda não tenha feito isso.

Para se comunicar com os servidores do Google com as informações corretas, solicite um ID de sessão de recuperação do SDK do cliente e a envie ao servidor do jogo.

PlayGamesPlatform.Instance.RequestRecallAccess(
    recallAccess => {
        string recallSessionId = recallAccess.sessionId;
        // Send the recallSessionId to your game server
    });

Usar a API Recall no servidor do jogo

Depois de configurar o servidor e o cliente, é possível enviar o recallSessionID do cliente do jogo para o servidor do seu jogo e seguir as orientações abaixo para começar a usar a API Java para armazenar, extrair ou excluir os tokens de recuperação do lado do servidor.

Armazenar tokens

O perfil do usuário e o token do jogo podem ser armazenados usando o objeto LinkPersonaRequest. Você precisa usar o GoogleCredential para chamar as APIs do Google. Consulte Como chamar APIs do Google para maior contexto. De acordo com a Restrição de cardinalidade 1:1, só é possível vincular um perfil de recuperação a um perfil dos Serviços relacionados a jogos do Google Play por vez (e vice-versa). Defina a política de resolução caso esse perfil já tenha sido vinculado a outro.

Opcionalmente, defina um TTL no token, que declara por quanto tempo ele é válido usando um objeto Durations (link em inglês). É possível definir essa opção usando SetTtl() (como mostrado abaixo), que define a data de validade a partir do período especificado no método, ou setExpireTime(), que permite definir uma data de validade exata dos tokens.

Você precisa criptografar o perfil e o token do jogo, e eles não podem conter informações de identificação pessoal. As strings de perfis e tokens podem ter no máximo 256 caracteres e podem haver no máximo 20 perfis ou tokens armazenados por jogador em cada jogo.

Somente um token pode ser armazenado por perfil e por jogador em um determinado momento. A tentativa de armazenar outro token com o mesmo perfil substitui o token original.

import com.google.api.services.games.Games.Recall.LinkPersona;
import com.google.api.services.games.model.LinkPersonaRequest;
import com.google.api.services.games.model.LinkPersonaResponse;
import com.google.protobuf.util.Durations;

// ...

Games gamesApi =
    new Games.Builder(httpTransport, JSON_FACTORY, credential).build();

String recallSessionId = ... // recallSessionID from game client
String persona = ... // encrypted opaque string, stable for in-game account
String token = ... // encrypted opaque string encoding the progress line

LinkPersonaRequest linkPersonaRequest =
  LinkPersonaRequest.newBuilder()
    .setSessionId(recallSessionId)
    .setPersona(persona)
    .setToken(token)
    .setCardinalityConstraint(ONE_PERSONA_TO_ONE_PLAYER)
    .setConflictingLinksResolutionPolicy(CREATE_NEW_LINK)
    .setTtl(Durations.fromDays(7)) // Optionally set TTL for token
    .build();

LinkPersonaResponse linkPersonaResponse =
  gamesApi.recall().linkPersona(linkPersonaRequest).execute();

if (linkPersonaResponse.getState() == LINK_CREATED) {
  // success
}

Extrair tokens

Há três opções para recuperar um token com base nas necessidades. Você pode solicite o seguinte:

  • Os tokens associados ao jogo atual, incluindo tokens de recuperação no escopo do jogo.
  • O último token armazenado em todos os jogos da conta de desenvolvedor.
  • Com uma lista de jogos da conta do desenvolvedor, todos os tokens de recall associadas a cada jogo.
.

Tokens de recall no escopo do jogo

Para recuperar os tokens de recuperação do jogo atual, acesse o recallSessionId do cliente e transmita-o para a API retrieveTokens:

import com.google.api.services.games.Games;
import com.google.api.services.games.model.RetrievePlayerTokensResponse;
import com.google.api.services.games.model.RecallToken;

// ...

String recallSessionId = ... // recallSessionID from game client

RetrievePlayerTokensResponse retrievePlayerTokensResponse =
  gamesApi.recall().retrieveTokens(recallSessionId).execute();

for (RecallToken recallToken : retrievePlayerTokensResponse.getTokens()) {
  String token recallToken.getToken();
  // Same string as was written in LinkPersona call
  // decrypt and recover in-game account
}

Token de recall mais recente em todos os jogos da conta de desenvolvedor

Recuperar o token mais recente armazenado em todos os jogos do desenvolvedor no Google Play Console, será preciso baixar o recallSessionId do cliente e transmiti-lo para a API lastTokenFromAllDeveloperGames, conforme como mostrado no snippet de código a seguir. Como parte da resposta, é possível inspecionar o ID do aplicativo associado com esse token.

import com.google.api.services.games.Games;
import com.google.api.services.games.model.RetrieveDeveloperGamesLastPlayerTokenResponse;
import com.google.api.services.games.model.GamePlayerToken;
import com.google.api.services.games.model.RecallToken;

// ...

String recallSessionId = ... // recallSessionID from game client

RetrieveDeveloperGamesLastPlayerTokenResponse response =
        gamesApi.recall().lastTokenFromAllDeveloperGames(recallSessionId)
        .execute();

if (response.hasGamePlayerToken()) {
    GamePlayerToken gamePlayerToken = response.getGamePlayerToken();

    // The ID of the application that the token is associated with.
    String applicationId = gamePlayerToken.getApplicationId();

    // Same string as was written in LinkPersona call.
    RecallToken recallToken = gamePlayerToken.getRecallToken();

    // Decrypt and recover in-game account.
}

Todos os tokens de recall em uma determinada lista de jogos da conta de desenvolvedor

Para recuperar todos os tokens associados a uma lista de jogos que pertencem a sua conta de desenvolvedor no Google Play Console, faça o download do recallSessionId do cliente e transmiti-lo para a API gamesPlayerTokens. Forneça um lista de IDs de aplicativos.

import com.google.api.services.games.Games;
import com.google.api.services.games.model.RetrieveGamesPlayerTokensResponse;
import com.google.api.services.games.model.GamePlayerToken;
import com.google.api.services.games.model.RecallToken;

// ...

String recallSessionId = ... // recallSessionID from game client

// Application IDs for which you would like to retrieve the recall tokens.
List<String> applicationIds = ...

RetrieveGamesPlayerTokensResponse response =
gamesApiClient
        .recall()
        .gamesPlayerTokens(recallSessionId)
        .setApplicationIds(applicationIds)
        .execute();

for (GamePlayerToken gamePlayerToken : response.getGamePlayerTokens()) {
    // The ID of the application that the token is associated with.
    String applicationId  = gamePlayerToken.getApplicationId();


    // Same string as was written in LinkPersona call.
    RecallToken recallToken = gamePlayerToken.getRecallToken();
    
    // Decrypt and recover in-game account.
}

Excluir token de recuperação

Se necessário, também é possível excluir o token de recuperação com esta chamada:

import com.google.api.services.games.Games;
import com.google.api.services.games.model.UnlinkPersonaRequest;
import com.google.api.services.games.model.UnlinkPersonaResponse;

// ...

String recallSessionId = ...
String persona = ...
String token = ...

Games gamesApi =
    new Games.Builder(httpTransport, JSON_FACTORY, credential).build();

UnlinkPersonaRequest unlinkPersonaRequest =
  UnlinkPersonaRequest.newBuilder()
    .setSessionId(recallSessionId)
    .setPersona(persona)
    // .setToken(token) - alternatively set token, but not both
    .build();

UnlinkPersonaResponse unlinkPersonaResponse =
  gamesApi.recall().unlinkPersona(unlinkPersonaRequest).execute();

boolean unlinked = unlinkPersonaResponse.isUnlinked();

Ativar o modo sem perfil

É possível ativar a funcionalidade limitada da API Recall para usuários que não têm perfis dos Serviços relacionados a jogos do Google Play:

  1. Ativar o recall sem perfil para seu projeto de jogo dos serviços relacionados a jogos do Google Play (PGS, na sigla em inglês) no Google Play Developer do Cloud. Selecione a opção intitulada &quot;Ativar
armazenamento&quot;.
  2. Consulte os termos adicionais descritos mais adiante nesta seção.
  3. Adicione a seguinte tag de metadados ao seu aplicativo manifesto do app:
<meta-data
  android:name="com.google.android.gms.games.PROFILELESS_RECALL_ENABLED"
  android:value="true" />

Termos adicionais

Além de estarem sujeitos aos Termos dos serviços relacionados a jogos do Google Play do Google, você concorda que, se use a API Recall para usuários sem um perfil dos Serviços relacionados a jogos do Google Play (PGS, na sigla em inglês), o que permite o compartilhamento dados do usuário final com o Google sem que ele tenha um perfil dos serviços relacionados a jogos do Google Play; antes de compartilhar esses dados com o Google, forneça ao usuário final aviso adequado descrevendo 1) seu compartilhamento dos dados com o Google para ativar Play Games 2) a disponibilidade de configurações para gerenciar compartilhamento, como os nas configurações do Play Games, e 3) o processamento do esses dados de acordo com a Política de Privacidade do Google, política e conseguir informações de usuários finais consentimento para esse compartilhamento que atenda a todos os requisitos legais aplicáveis.