Zintegruj interfejs PGS Recall API ze swoją grą

Na tej stronie dowiesz się, jak wdrożyć interfejs Recall API w swojej grze. Najpierw opisujemy, jak skonfigurować serwer i klienta gry pod kątem obsługi interfejsu API, a potem jak przechowywać i pobierać tokeny.

Konfiguracja serwera gry

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

Konfigurowanie projektu w usługach gier Play

Postępuj zgodnie z instrukcjami podanymi w artykule Konfigurowanie usług gier Google Play.

Skonfiguruj konto usługi gry

Wykonaj instrukcje tworzenia konta usługi. Na końcu powinien być plik JSON z danymi logowania do konta usługi.

Pobierz bibliotekę Java po stronie serwera dla usług gier Play

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

Przygotowywanie danych logowania do wywołań interfejsu API Recall

Więcej informacji znajdziesz w sekcji na temat przygotowywania wywołania delegowanego 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, aby pobierał identyfikatory sesji wycofywania używane przez serwer do komunikacji z serwerami Google.

Pakiet SDK Java

Skonfiguruj w kliencie pakiet SDK Java i pamiętaj, by w pliku Gradle uwzględnić com.google.android.gms:play-services-games-v2:19.0.0 i com.google.android.gms:play-services-tasks:18.0.2 lub nowsze wersje.

Aby komunikować się z serwerami Google przy użyciu prawidłowych informacji, poproś pakiet SDK klienta o identyfikator sesji, który 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
  });

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 wycofywania po stronie serwera.

Tokeny sklepu

Przechowuj profil użytkownika i token gry za pomocą obiektu LinkPersonaRequest. Użyj GoogleCredential, aby wywołać interfejsy API Google. Aby zachować ograniczenie mocy zbioru 1:1, możesz łączyć tylko 1 profil klienta w danym momencie i odwrotnie. Ustaw zasadę rozwiązywania na wypadek, gdyby ten profil usług gier Play został już połączony z inną profilami usług.

Opcjonalnie możesz ustawić wartość TTL tokena, która określa za pomocą obiektu Durations czas ważności tokena. Możesz to zrobić za pomocą pola SetTtl() (jak poniżej), który ustawia datę ważności od okresu podanego w metodzie, lub setExpireTime(), który pozwala ustawić dokładny czas wygaśnięcia tokenów.

Musisz zaszyfrować profil użytkownika i token gry. Nie mogą one zawierać informacji umożliwiających identyfikację osoby. Ciągi znaków tożsamości i tokenów mogą mieć maksymalnie 256 znaków, a na gracza może być przechowywanych maksymalnie 20 tokenów lub profili klientów.

W danym momencie można przechowywać tylko 1 token na profil na gracza. Jeśli spróbujesz zapisać kolejny token z tym samym profilem, system zastąpi oryginalny.

import com.google.api.services.games.Games.Recall.LinkPersona;
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

Aby pobrać token wycofywania, pobierz recallSessionId od klienta i przekaż go do interfejsu API retrieveTokens:

import com.google.api.services.games.Games.Recall.RetrieveTokens;

// ...

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
}

Usuń token wycofywania

W razie potrzeby możesz też usunąć token wycofywania, używając tego wywołania:

import com.google.api.services.games.Games.Recall.UnlinkPersona;

// ...

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

// Confirm that the unlinking process completed successfully.
boolean unlinked = unlinkPersonaResponse.isUnlinked();