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 (token).

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.

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

Nếu bạn chưa làm việc này, hãy 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.

2. 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ụ.

3. Tải thư viện Java phía máy chủ xuống cho PlayGamesServices

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.

4. 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 mã nhận dạng phiên gọi lại mà máy chủ của chúng tôi 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à đừng quên đưa com.google.android.gms:play-services-games-v2:19.0.0

com.google.android.gms:play-services-tasks:18.0.2 trở lên trong tệp gradle.

Để giao tiếp với máy chủ của Google với thông tin chính xác, bạn cần yêu cầu ID 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
    });

SDK Unity

Nếu chưa hoàn tất, hãy thiết lập SDK Unity trong ứng dụng.

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

PlayGamesPlatform.Instance.RequestRecallAccess(
    recallAccess => {
        string recallSessionId = recallAccess.sessionId;
        // 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 sau để 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ã

Tài khoản người chơi trong API Thu hồi dữ liệu của Google Play Games bao gồm 2 phần thông tin:

  • Persona đóng vai trò là giá trị nhận dạng bất biến cho tài khoản trong trò chơi
  • Mã thông báo đóng vai trò là khoá để đăng nhập người chơi vào tài khoản một cách an toàn

Bạn có thể lưu trữ persona và mã thông báo của người dùng bằng cách sử dụng đối tượng LinkPersonaRequest. Sử dụng GoogleCredential để gọi API của Google (Xem bài viết Gọi API của Google để biết thêm thông tin). Một persona có giới hạn về số lượng giá trị riêng biệt 1:1: một hồ sơ PGS chỉ có thể chứa một persona và một persona chỉ có thể tồn tại trong một hồ sơ PGS. Đặt chính sách giải quyết các đường liên kết xung đột để xác định cách giải quyết các lỗi vi phạm ràng buộc về số lượng 1:1.

Bạn có thể đặt thời gian hết hạn của mã thông báo (không bắt buộc). Sử dụng SetTtl() với một đối tượng Durations để đặt Thời gian tồn tại hoặc cung cấp thời gian hết hạn chính xác bằng setExpireTime().

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

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
}

Truy xuất mã

Có 3 lựa chọn để truy xuất mã thông báo, tuỳ thuộc vào nhu cầu của trò chơi. Bạn có thể yêu cầu những thông tin sau:

  • Các mã thông báo được liên kết với trò chơi hiện tại, bao gồm cả mã thông báo thu hồi theo phạm vi trò chơi.
  • Mã thông báo cuối cùng được lưu trữ trên tất cả các trò chơi do tài khoản nhà phát triển sở hữu.
  • Cho trước danh sách các trò chơi thuộc tài khoản nhà phát triển, tất cả mã truy cập thu hồi được liên kết với từng trò chơi.

Mã gọi lại theo phạm vi trò chơi

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

Mã gọi lại mới nhất trên tất cả các trò chơi do tài khoản nhà phát triển sở hữu

Để truy xuất mã thông báo gần đây nhất được lưu trữ trên tất cả các trò chơi thuộc tài khoản nhà phát triển trong Google Play Console, bạn cần lấy recallSessionId từ ứng dụng và truyền mã thông báo đó vào API lastTokenFromAllDeveloperGames, như minh hoạ trong đoạn mã sau. Trong phần phản hồi, bạn có thể kiểm tra Mã ứng dụng được liên kết với mã thông báo này.

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

Tất cả mã gọi lại trong một danh sách trò chơi nhất định do tài khoản nhà phát triển sở hữu

Để truy xuất tất cả mã thông báo được liên kết với danh sách các trò chơi thuộc tài khoản nhà phát triển của bạn trong Google Play Console, hãy lấy recallSessionId từ ứng dụng và truyền mã này vào API gamesPlayerTokens. Cung cấp danh sách Mã ứng dụng.

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

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

Bật chế độ không có hồ sơ

Bạn có thể bật chức năng Recall API bị hạn chế cho những người dùng không có hồ sơ PGS bằng cách làm theo các bước sau:

  1. Bật tính năng thu hồi không cần hồ sơ cho dự án trò chơi PGS trong Play Developer Console. Chọn mục &quot;Bật bộ nhớ&quot;.
  2. Xem các điều khoản bổ sung được mô tả ở phần sau trong mục này.
  3. Thêm thẻ siêu dữ liệu sau vào tệp kê khai ứng dụng:
<meta-data
  android:name="com.google.android.gms.games.PROFILELESS_RECALL_ENABLED"
  android:value="true" />

Điều khoản bổ sung

Ngoài việc tuân thủ Điều khoản dịch vụ của Dịch vụ trò chơi của Play, bạn đồng ý rằng nếu sử dụng Recall API cho những người dùng không có hồ sơ PGS, cho phép chia sẻ dữ liệu của người dùng cuối với Google mà không cần họ có hồ sơ Dịch vụ trò chơi của Play, thì trước khi chia sẻ dữ liệu đó với Google, bạn phải cung cấp cho người dùng cuối thông báo thích hợp mô tả những điều sau:

  1. Việc bạn chia sẻ dữ liệu với Google để bật tính năng liên kết tài khoản Play Games.
  2. Các chế độ cài đặt để quản lý hoạt động chia sẻ như vậy, chẳng hạn như thông qua chế độ cài đặt Play Games.
  3. Việc xử lý dữ liệu đó theo Chính sách quyền riêng tư của Google và có được sự đồng ý phù hợp của người dùng cuối đối với việc chia sẻ đó theo tất cả các yêu cầu pháp lý hiện hành.