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 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 ID phiên hoạt động 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
và com.google.android.gms:play-services-tasks:18.0.2 trở lên vào 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 bạn chưa làm việc này, hãy thiết lập SDK Unity trong ứng dụng khách.
Để 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
});
SDK gốc phiên bản 2 (thử nghiệm)
Nếu bạn chưa làm việc này, hãy bắt đầu sử dụng Dịch vụ trò chơi của Play cho C và C++.
// Include the following headers
#include "play_games.h"
#include "recall_client.h"
#include "pgs_status_code.h"
// Request Recall Access
// Initializes the Play Games Services v2 Native SDK (beta).
Pgs_initialize(javaVM, activity);
//Creating Recall Client
PgsRecallClient* pgs_recall_client =
PgsRecallClient_create(activity);
// RequestRecallAccess Function
PgsRecallClient_requestRecallAccess(
pgs_recall_client,
// This is your callback function defined as an inline lambda
[](PgsStatusCode status_code, char* session_id, user_data) {
if (status_code == PGS_STATUS_SUCCESS) {
// Recall Session Id Fetched Successfully
} else {
// Fetching Recall Session Id Failed
// Handle error based on status_code.
// Examples:
// PGS_STATUS_NETWORK_ERROR: Check internet connection.
// PGS_STATUS_INTERNAL_ERROR: An unexpected error occurred.
}
// Clean up the client instance passed as user_data
PgsRecallClient* client = static_cast<PgsRecallClient*>(user_data);
if (client != nullptr) {
PgsRecallClient_destroy(client);
}
},
user_data // Data to pass to the callback
);
// Shuts down the Play Games Services v2 Native SDK (beta).
Pgs_destroy()
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 Recall API 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). 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ể thuộc về một hồ sơ PGS. Thiết lập chính sách xử lý xung đột liên kết để xác định
cách giải quyết các lỗi vi phạm giới hạn về số lượng giá trị riêng biệt 1:1.
Bạn có thể đặt thời gian hết hạn của mã thông báo. Sử dụng SetTtl() với đối tượng
Durations để đặt Thời gian tồn tại (TTL) 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 cách để truy xuất mã thông báo, tuỳ theo nhu cầu của trò chơi. Bạn có thể yêu cầu những nội dung sau:
- Mã thông báo liên kết với trò chơi hiện tại, bao gồm cả mã gọi lại theo phạm vi trò chơi.
- Mã thông báo được lưu trữ gần đây nhất trên tất cả trò chơi do tài khoản nhà phát triển sở hữu.
- Với danh sách trò chơi do tài khoản nhà phát triển sở hữu, tất cả mã gọi lại 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 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ả trò chơi do tài khoản nhà phát triển sở hữu
Để truy xuất mã thông báo được lưu trữ gần đây nhất trên tất cả trò chơi do tài khoản nhà phát triển sở hữu trong Google Play Console, bạn cần lấy recallSessionId từ ứng dụng khách rồi truyền vào API lastTokenFromAllDeveloperGames, như trong đoạn mã sau. Trong phần phản hồi, bạn có thể kiểm tra
Mã ứng dụng 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 trên danh sách trò chơi do tài khoản nhà phát triển sở hữu
Để truy xuất tất cả mã thông báo liên kết với danh sách trò chơi do tài khoản nhà phát triển của bạn sở hữu trong Google Play Console, hãy lấy recallSessionId từ ứng dụng khách rồi truyền 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 có giới hạn cho người dùng không có hồ sơ PGS bằng cách làm theo các bước sau:
- Bật tính năng gọi lại không có hồ sơ cho dự án trò chơi PGS trong Play Developer
Console.

- Xem các điều khoản bổ sung được mô tả ở phần sau trong mục này.
- 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
Bạn cũng phải tuân thủ Điều khoản dịch vụ của Dịch vụ trò chơi của Play. Nếu bạn sử dụng Recall API cho người dùng không có hồ sơ PGS (việc này liên quan đến việc chia sẻ dữ liệu người dùng cuối với Google), thì trước khi chia sẻ dữ liệu này 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 nội dung sau:
- Cách 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.
- Các chế độ cài đặt có sẵn để quản lý việc chia sẻ này, chẳng hạn như thông qua phần cài đặt Play Games.
- Việc xử lý dữ liệu này theo Chính sách quyền riêng tư của Google và yêu cầu phải có được sự đồng ý thích hợp của người dùng cuối cho việc chia sẻ này, đáp ứng mọi yêu cầu pháp lý hiện hành.