Zintegruj interfejs PGS Recall API ze swoją grą

Z tego artykułu dowiesz się, jak zaimplementować w swojej grze interfejs Recall API. Najpierw opisuje, jak skonfigurować serwer i klienta gry, aby obsługiwały interfejs API, a potem wyjaśnia, jak przechowywać i pobierać tokeny.

Konfiguracja serwera gry

Skonfiguruj serwer gry, aby wykonywał wywołania interfejsu Recall API do serwerów Google.

1. Konfigurowanie projektu usług gier Play

(Jeśli nie zostało jeszcze wykonane) Postępuj zgodnie z instrukcjami w artykule Konfigurowanie usług gier Play.

.

2. Konfigurowanie konta usługi na potrzeby gry

Postępuj zgodnie z instrukcjami tworzenia konta usługi. Na koniec powinien pojawić się plik JSON z danymi logowania do konta usługi.

3. Pobieranie biblioteki Java po stronie serwera dla PlayGamesServices

Pobierz najnowszą bibliotekę google-api-services-games i prześlij ją na serwer.

4. Przygotowywanie danych logowania do wywoływania interfejsu Recall API

Więcej informacji znajdziesz w artykule Przygotowywanie się do wykonania autoryzowanego wywołania interfejsu API.

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();

Konfiguracja klienta gry

Skonfiguruj klienta gry tak, aby pobierał identyfikatory sesji wycofywania używane przez serwer do komunikacji z serwerami Google.

Java SDK

Skonfiguruj pakiet Java SDK w kliencie i upewnij się, że w pliku Gradle masz wersję com.google.android.gms:play-services-games-v2:19.0.0 lub com.google.android.gms:play-services-tasks:18.0.2 albo nowszą.

Aby komunikować się z serwerami Google i przesyłać prawidłowe informacje, musisz poprosić pakiet SDK klienta o identyfikator sesji Recall, który następnie przesyłasz na serwer gry.

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
    });

Pakiet Unity SDK

Jeśli nie zostało to jeszcze zrobione, skonfiguruj pakiet SDK Unity w aplikacji klienckiej.

Aby komunikować się z serwerami Google i przesyłać prawidłowe informacje, musisz poprosić pakiet SDK klienta o identyfikator sesji Recall i przesłać go na serwer gry.

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

Używanie interfejsu Recall API na serwerze gry

Po skonfigurowaniu serwera i klienta możesz wysłać recallSessionID z klienta gry na serwer gry i postępować zgodnie z poniższymi wskazówkami, aby zacząć używać interfejsu Java API do przechowywania, pobierania lub usuwania tokenów Recall po stronie serwera.

Przechowywanie tokenów

Osobowość użytkownika i token gry można przechowywać za pomocą obiektu LinkPersonaRequest. Aby wywoływać interfejsy API Google, musisz użyć GoogleCredential (więcej informacji znajdziesz w sekcji Wywoływanie interfejsów API Google). Pamiętaj, że zgodnie z ograniczeniem liczności 1:1 możesz połączyć tylko 1 profil z 1 profilem w usługach gier Play (i odwrotnie).Ustaw zasady rozwiązywania konfliktów na wypadek, gdyby ten profil w usługach gier Play był już połączony z innym profilem.

Opcjonalnie możesz ustawić czas życia tokena, który określa, jak długo token jest ważny, za pomocą obiektu Durations. Możesz to zrobić za pomocą funkcji SetTtl() (jak pokazano poniżej), która ustawia datę ważności na podstawie czasu określonego w metodzie, lub setExpireTime(), która pozwala ustawić dokładny czas wygaśnięcia tokenów.

Musisz zaszyfrować token osoby i token gry. Nie mogą one zawierać danych umożliwiających identyfikację osób. Ciągi znaków dotyczące persony i tokena mogą mieć maksymalnie 256 znaków. Każdy gracz może mieć maksymalnie 20 tokenów lub person w każdej grze.

W danym momencie w przypadku każdego gracza można przechowywać tylko 1 token na profil. Próba zapisania kolejnego tokena z tą samą personą spowoduje zastąpienie oryginalnego tokena.

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
}

Pobieranie tokenów

W zależności od potrzeb gry możesz pobrać token na 3 sposoby. Możesz poprosić o:

  • tokeny powiązane z bieżącą grą, w tym tokeny wycofania o zasięgu gry;
  • Ostatni token przechowywany we wszystkich grach należących do konta dewelopera.
  • Na podstawie listy gier należących do konta dewelopera wszystkie tokeny wycofania powiązane z każdą grą.

Tokeny wycofywania w zakresie gry

Aby pobrać tokeny Recall z bieżącej gry, uzyskaj recallSessionId od klienta i przekaż go do interfejsu 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
}

Najnowszy token wycofania we wszystkich grach należących do konta dewelopera

Aby pobrać najnowszy token przechowywany we wszystkich grach należących do konta dewelopera w Konsoli Google Play, musisz uzyskać recallSessionId z klienta i przekazać go do interfejsu lastTokenFromAllDeveloperGames API, jak pokazano w tym fragmencie kodu. W ramach odpowiedzi możesz sprawdzić identyfikator aplikacji powiązany z tym tokenem.

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

Wszystkie tokeny wycofania z danej listy gier należących do konta dewelopera

Aby pobrać wszystkie tokeny powiązane z listą gier, które należą do Twojego konta dewelopera w Konsoli Google Play, uzyskaj recallSessionId od klienta i przekaż go do interfejsu gamesPlayerTokens API. Podaj listę identyfikatorów aplikacji.

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

Usuwanie tokena wycofania

W razie potrzeby możesz też usunąć token wycofania za pomocą tego wywołania:

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();

Włączanie trybu bez profilu

Aby włączyć ograniczoną funkcjonalność interfejsu Recall API w przypadku użytkowników, którzy nie mają profili PGS, wykonaj te czynności:

  1. Włącz wycofywanie bez profilu w projekcie gry w usługach gier Play w Konsoli Play. Wybierz opcję „Włącz
pamięć”.
  2. Zapoznaj się z dodatkowymi warunkami opisanymi w dalszej części tej sekcji.
  3. Dodaj do pliku manifestu aplikacji ten tag metadanych:
<meta-data
  android:name="com.google.android.gms.games.PROFILELESS_RECALL_ENABLED"
  android:value="true" />

Dodatkowe warunki

Oprócz podlegania Warunkom korzystania z usług gier Play zgadzasz się, że jeśli używasz interfejsu Recall API w przypadku użytkowników bez profilu w usługach gier Play, co umożliwia udostępnianie firmie Google danych użytkowników bez profilu w usługach gier Play, przed udostępnieniem takich danych firmie Google musisz przekazać użytkownikowi odpowiednie powiadomienie opisujące:

  1. udostępnianie danych firmie Google w celu włączenia funkcji łączenia konta w Gry Play;
  2. Dostępność ustawień zarządzania takim udostępnianiem, np. ustawień Gier Play.
  3. przetwarzanie takich danych zgodnie z Polityką prywatności Google oraz uzyskanie odpowiedniej zgody użytkownika końcowego na takie udostępnianie danych, która spełnia wszystkie obowiązujące wymagania prawne.