Tích hợp Recall API của Dịch vụ trò chơi của Play trong trò chơi

Trang này giải thích cách triển khai Recall API trong trò chơi của bạn. Trước tiên, bạn sẽ được hướng dẫn cách thiết lập máy chủ và ứng dụng khách của trò chơi để hỗ trợ API này, sau đó là về cách lưu trữ và truy xuất mã thông báo.

Thiết lập máy chủ trò chơi

Thiết lập máy chủ trò chơi để thực hiện lệnh gọi Recall API đến máy chủ của Google.

Thiết lập dự án Dịch vụ trò chơi của Play (PGS)

(Nếu chưa hoàn tất) Làm theo hướng dẫn trong bài viết Thiết lập Dịch vụ trò chơi của Google Play.

Thiết lập tài khoản dịch vụ cho trò chơi

Làm theo hướng dẫn về cách tạo tài khoản dịch vụ. Sau khi hoàn tất hướng dẫn, bạn sẽ có một tệp JSON chứa thông tin đăng nhập tài khoản dịch vụ.

Tải thư viện Java phía máy chủ xuống cho Dịch vụ trò chơi của Play

Tải thư viện google-api-services-games mới nhất xuống rồi tải lên máy chủ của bạn.

Chuẩn bị thông tin đăng nhập cho các lệnh gọi Recall API

Xem bài viết Chuẩn bị thực hiện lệnh gọi API được uỷ quyền để biết thêm thông tin.

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

Thiết lập ứng dụng trò chơi

Thiết lập ứng dụng trò chơi để truy xuất ID phiên hoạt động gọi lại mà máy chủ của bạn sử dụng để giao tiếp với các máy chủ của Google.

SDK Java

Thiết lập SDK Java trong ứng dụng khách và nhớ đưa com.google.android.gms:play-services-games-v2:19.0.0com.google.android.gms:play-services-tasks:18.0.2 trở lên vào tệp Gradle của bạn.

Để giao tiếp với máy chủ của Google với thông tin chính xác, hãy yêu cầu Mã phiên hoạt động gọi lại từ SDK ứng dụng khách mà bạn gửi đến máy chủ trò chơi:

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

Sử dụng Recall API trong máy chủ trò chơi

Sau khi định cấu hình máy chủ và ứng dụng khách, bạn có thể gửi recallSessionID từ ứng dụng trò chơi đến máy chủ trò chơi rồi làm theo hướng dẫn bên dưới để bắt đầu sử dụng API Java để lưu trữ, truy xuất hoặc xoá Mã gọi lại phía máy chủ.

Lưu trữ mã

Lưu trữ persona và mã thông báo trò chơi của người dùng bằng đối tượng LinkPersonaRequest. Sử dụng GoogleCredential để gọi các API của Google. Để tuân theo giới hạn về số lượng giá trị riêng biệt 1:1, bạn chỉ có thể liên kết một persona với một hồ sơ PGS và ngược lại. Thiết lập chính sách giải quyết trong trường hợp hồ sơ PGS này đã được liên kết với một persona khác.

Nếu muốn, bạn có thể chọn thiết lập TTL trên mã thông báo. Thao tác này sẽ khai báo khoảng thời gian mã thông báo có hiệu lực bằng cách sử dụng đối tượng Durations. Bạn có thể chọn thiết lập giá trị này bằng cách sử dụng SetTtl() (như trình bày bên dưới) để thiết lập ngày hết hạn từ khoảng thời gian được chỉ định trong phương thức, hoặc setExpireTime() để đặt giá trị chính xác cho thời điểm mã thông báo hết hạn.

Bạn phải mã hoá persona và mã thông báo của trò chơi và không đưa vào bất kỳ thông tin nhận dạng cá nhân nào. Chuỗi mã thông báo và persona có thể dài tối đa 256 ký tự và trong mỗi trò chơi, nhà phát triển có thể lưu trữ tối đa 20 mã thông báo hoặc persona cho mỗi người chơi.

Tại một thời điểm, chỉ có thể lưu một mã thông báo cho mỗi persona của một người chơi. Nếu bạn cố lưu trữ một mã thông báo khác cho cùng persona, hệ thống sẽ ghi đè mã thông báo ban đầu.

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
}

Truy xuất mã

Để truy xuất mã gọi lại, hãy lấy recallSessionId từ ứng dụng rồi truyền vào 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
}

Xoá mã gọi lại

Nếu cần, bạn cũng có thể xoá mã gọi lại bằng lệnh gọi sau:

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