ผสานรวม PGS Recall API ภายในเกม

หน้านี้จะอธิบายวิธีใช้ Recall API ภายในเกม ก่อนอื่นจะครอบคลุม การตั้งค่าเซิร์ฟเวอร์เกมและไคลเอ็นต์ให้รองรับ API จากนั้นจะพูดถึง วิธีจัดเก็บและเรียกโทเค็น

การตั้งค่าเซิร์ฟเวอร์เกม

ตั้งค่าเซิร์ฟเวอร์เกมให้เรียก Recall API ไปยังเซิร์ฟเวอร์ของ Google

ตั้งค่าโปรเจ็กต์บริการเกมของ Play

(หากยังไม่ได้ดำเนินการ) ทำตามวิธีการในการตั้งค่าบริการเกมของ Google Play

ตั้งค่าบัญชีบริการสำหรับเกม

ทำตามวิธีการสร้างบัญชีบริการ ในตอนท้าย คุณควรมีไฟล์ JSON ที่มีข้อมูลเข้าสู่ระบบของบัญชีบริการ

ดาวน์โหลดไลบรารี Java ฝั่งเซิร์ฟเวอร์สำหรับบริการเกมของ Play

ดาวน์โหลดไลบรารี google-api-services-games ล่าสุดและอัปโหลดไปยังเซิร์ฟเวอร์ของคุณ

เตรียมข้อมูลเข้าสู่ระบบสำหรับการเรียก Recall 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 ของไคลเอ็นต์ซึ่งคุณส่งไปยังเซิร์ฟเวอร์เกม

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

ใช้ Recall API ภายในเซิร์ฟเวอร์เกม

หลังจากกำหนดค่าเซิร์ฟเวอร์และไคลเอ็นต์แล้ว คุณสามารถส่ง recallSessionID จากไคลเอ็นต์เกมไปยังเซิร์ฟเวอร์เกม และทำตามวิธีการด้านล่างเพื่อเริ่มใช้ Java API เพื่อจัดเก็บ ดึง หรือลบโทเค็นการเรียกคืนฝั่งเซิร์ฟเวอร์

โทเค็นร้านค้า

จัดเก็บลักษณะตัวตนและโทเค็นเกมของผู้ใช้โดยใช้ออบเจ็กต์ LinkPersonaRequest ใช้ GoogleCredential เพื่อเรียกใช้ Google API หากต้องการทำตามข้อจำกัดเกี่ยวกับคาร์ดินัลลิตี้ 1:1 คุณจะลิงก์ลักษณะตัวตนกับโปรไฟล์ PGS ได้ทีละ 1 รายการเท่านั้น และจะลิงก์ตัวตนกับโปรไฟล์ PGS ทีละ 1 รายการได้ ตั้งค่านโยบายการแก้ปัญหาในกรณีที่โปรไฟล์ PGS นี้ลิงก์กับลักษณะอื่นอยู่แล้ว

นอกจากนี้ คุณยังเลือกตั้งค่า TTL ในโทเค็นได้ ซึ่งจะประกาศระยะเวลาที่โทเค็นถูกต้องโดยใช้ออบเจ็กต์ Durations คุณอาจเลือกตั้งค่านี้โดยใช้ SetTtl() (ดังที่แสดงด้านล่าง) ซึ่งจะกำหนดวันที่หมดอายุจากเวลาที่ระบุในเมธอด หรือ setExpireTime() ซึ่งให้คุณกำหนดเวลาที่แน่นอนได้ว่าโทเค็นจะหมดอายุเมื่อใด

คุณต้องเข้ารหัสลักษณะตัวตนและโทเค็นเกม และต้องไม่มีข้อมูลส่วนบุคคลที่ระบุตัวบุคคลนั้นได้ สตริงลักษณะตัวตนและโทเค็นมีอักขระได้สูงสุด 256 อักขระ และสามารถจัดเก็บโทเค็นหรือลักษณะตัวตนได้สูงสุด 20 ตัวต่อผู้เล่นต่อเกม

คุณจัดเก็บโทเค็นได้เพียง 1 รายการต่อลักษณะตัวตนต่อผู้เล่น 1 คนในเวลาที่กำหนด หากคุณพยายามจัดเก็บโทเค็นอื่นที่มีตัวตนเดียวกัน ระบบจะเขียนทับโทเค็นเดิม

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
}

เรียกดูโทเค็น

หากต้องการเรียกโทเค็น Recall ให้รับ recallSessionId จากไคลเอ็นต์ แล้วส่งไปยัง retrieveTokens API ดังนี้

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
}

ลบโทเค็น Recall

หากจำเป็น คุณยังลบโทเค็นการเรียกคืนได้โดยใช้การเรียกต่อไปนี้

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