Интегрируйте API отзыва PGS в свою игру.

На этой странице объясняется, как реализовать API возврата в вашей игре. Сначала он описывает настройку вашего игрового сервера и клиента для поддержки API, а затем рассказывает о том, как хранить и получать токены.

Настройка игрового сервера

Настройте свой игровой сервер для выполнения вызовов API Recall на серверы Google.

Настройте проект игровых сервисов Play.

(Если это еще не выполнено) Следуйте инструкциям в разделе «Настройка игровых сервисов Google Play» .

Настройте сервисную учетную запись для игры

Следуйте инструкциям по созданию сервисной учетной записи . В конце у вас должен получиться файл JSON с учетными данными сервисной учетной записи.

Загрузите серверную библиотеку Java для игровых сервисов Play.

Загрузите последнюю версию библиотеки google-api-services-games и загрузите ее на свой сервер.

Подготовьте учетные данные для вызовов API отзыва

Дополнительную информацию см. в разделе Подготовка к делегированному вызову 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();

Настройка игрового клиента

Настройте игровой клиент на получение идентификаторов сеансов отзыва, используемых вашим сервером для связи с серверами Google.

Java SDK

Настройте Java SDK в своем клиенте и обязательно включите com.google.android.gms:play-services-games-v2:19.0.0 и com.google.android.gms:play-services-tasks:18.0.2 или выше в вашем файле Gradle.

Чтобы обмениваться с серверами Google правильной информацией, запросите идентификатор сеанса отзыва из клиентского SDK, который вы отправляете на сервер вашей игры:

Котлин

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

Джава

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

Используйте API отзыва на своем игровом сервере.

После настройки сервера и клиента вы можете отправить recallSessionID из вашего игрового клиента на игровой сервер и следовать приведенным ниже инструкциям, чтобы начать использовать Java API для хранения, получения или удаления токенов отзыва на стороне сервера.

Магазин токенов

Сохраните личность пользователя и игровой токен, используя объект LinkPersonaRequest . Используйте GoogleCredential для вызова API Google . Чтобы соблюдать ограничение количества элементов 1:1 , вы можете одновременно связать только одного пользователя с одним профилем PGS и наоборот. Установите политику разрешения на случай, если этот профиль PGS уже связан с другим человеком.

При желании вы можете установить TTL для токена, который определяет, как долго токен действителен, с помощью объекта Durations . Вы можете установить это с помощью SetTtl() (как показано ниже), который устанавливает дату истечения срока действия на основе периода времени, указанного в методе, или setExpireTime() , который позволяет вам установить точное время истечения срока действия токенов.

Вы должны зашифровать личность и игровой токен, и они не могут содержать личную информацию. Строки персонажей и токенов могут иметь длину не более 256 символов, и на каждого игрока в каждой игре может храниться не более 20 жетонов или персонажей.

В определенный момент времени на каждого игрока может быть сохранен только один жетон. Если вы попытаетесь сохранить другой токен с той же личностью, система перезапишет исходный токен.

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
}

Получить токены

Чтобы получить токен отзыва, получите recallSessionId от клиента и передайте его в 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
}

Удалить токен отзыва

При необходимости вы также можете удалить токен отзыва с помощью следующего вызова:

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