การเปิดใช้การเข้าถึงบริการเกมของ Google Play ในฝั่งเซิร์ฟเวอร์

เราขอแนะนําให้คุณตรวจสอบสิทธิ์ผู้เล่นและส่งข้อมูลระบุตัวตนของผู้เล่นไปยังเซิร์ฟเวอร์แบ็กเอนด์อย่างปลอดภัย วิธีนี้ช่วยให้เกมของคุณเรียกข้อมูลตัวตนของผู้เล่นและข้อมูลอื่นๆ ได้อย่างปลอดภัยโดยไม่ต้องสัมผัสกับความเสียหายที่อาจเกิดขึ้นระหว่างที่ส่งผ่านอุปกรณ์

ในสถานการณ์นี้ เมื่อผู้เล่นลงชื่อเข้าใช้สําเร็จ คุณจะขอรหัสแบบใช้ครั้งเดียวพิเศษ (เรียกว่ารหัสการตรวจสอบสิทธิ์เซิร์ฟเวอร์) จาก Play Games Services v2 SDK ที่ไคลเอ็นต์ส่งไปยังเซิร์ฟเวอร์ได้ จากนั้น ให้แลกเปลี่ยนรหัสการตรวจสอบสิทธิ์เซิร์ฟเวอร์กับโทเค็น OAuth 2.0 ที่เซิร์ฟเวอร์ใช้เพื่อเรียกไปยัง Google Play Games Services API ได้

ดูคําแนะนําเพิ่มเติมเกี่ยวกับการเพิ่มการลงชื่อเข้าใช้ในเกมได้ที่ลงชื่อเข้าใช้ใน Android Games

การเข้าถึงแบบออฟไลน์ต้องใช้ขั้นตอนต่อไปนี้

  1. ใน Google Play Console: สร้างข้อมูลเข้าสู่ระบบสําหรับเซิร์ฟเวอร์เกม ประเภทไคลเอ็นต์ OAuth ของข้อมูลเข้าสู่ระบบจะเป็น "เว็บ"
  2. ในแอป Android: โดยขอรหัสการตรวจสอบสิทธิ์เซิร์ฟเวอร์สําหรับข้อมูลเข้าสู่ระบบของเซิร์ฟเวอร์ แล้วส่งไปยังเซิร์ฟเวอร์ของคุณ ซึ่งเป็นส่วนหนึ่งของการลงชื่อเข้าใช้
  3. ในเซิร์ฟเวอร์เกม: แลกเปลี่ยนรหัสการตรวจสอบสิทธิ์เซิร์ฟเวอร์สําหรับการเข้าถึง OAuth โดยใช้บริการการตรวจสอบสิทธิ์ของ Google จากนั้นใช้การเรียก REST API ของบริการเกมของ Play

ข้อควรทราบก่อนที่จะเริ่มต้น

ก่อนอื่นคุณจะต้องเพิ่มเกมใน Google Play Console ตามที่อธิบายไว้ใน ตั้งค่าบริการเกมของ Google Play และผสานรวมการลงชื่อเข้าใช้บริการเกมของ Play กับเกมของคุณ

สร้างเว็บแอปพลิเคชันฝั่งเซิร์ฟเวอร์ฝั่งเซิร์ฟเวอร์สําหรับเกมของคุณ

บริการเกมของ Google Play ไม่รองรับแบ็กเอนด์ สําหรับเกมบนเว็บ แต่จะให้การสนับสนุนเซิร์ฟเวอร์แบ็กเอนด์สําหรับเซิร์ฟเวอร์เกม Android ของคุณ

หากต้องการใช้ REST API สําหรับบริการเกมของ Google Play ในแอปฝั่งเซิร์ฟเวอร์ ให้ทําตามขั้นตอนต่อไปนี้

  1. จากเกมใน Google Play Console ให้ไปที่บริการเกมของ Play > การตั้งค่าและการจัดการ > การกําหนดค่า
  2. เลือกเพิ่มข้อมูลเข้าสู่ระบบเพื่อเข้าสู่หน้าข้อมูลเข้าสู่ระบบ เลือกเซิร์ฟเวอร์เกมเป็นประเภทข้อมูลเข้าสู่ระบบ แล้วไปที่ส่วนการให้สิทธิ์
    1. หากเซิร์ฟเวอร์เกมมีรหัสไคลเอ็นต์ OAuth อยู่แล้ว ให้เลือกจากเมนูแบบเลื่อนลง หลังจากบันทึกการเปลี่ยนแปลงแล้ว ให้ข้ามไปที่ส่วนถัดไป
    2. หากไม่มีรหัสไคลเอ็นต์ OAuth สําหรับเซิร์ฟเวอร์เกม คุณก็สร้างได้
      1. คลิกสร้างไคลเอ็นต์ OAuth แล้วคลิกลิงก์สร้างรหัสไคลเอ็นต์ OAuth
      2. การดําเนินการนี้จะนําคุณไปยังหน้าสร้างรหัสไคลเอ็นต์ OAuth ของ Google Cloud Platform สําหรับโปรเจ็กต์ Cloud Platform ที่เกี่ยวข้องของเกม
      3. กรอกแบบฟอร์มของหน้าเว็บและคลิกสร้าง อย่าลืมตั้งค่าประเภทแอปพลิเคชันเป็นเว็บแอปพลิเคชัน
      4. กลับไปที่ส่วน Add หลังข้อมูลเข้าสู่ระบบของหน้าการให้สิทธิ์ แล้วเลือกไคลเอ็นต์ OAuth ที่สร้างขึ้นใหม่ แล้วบันทึกการเปลี่ยนแปลง

รับรหัสการตรวจสอบสิทธิ์เซิร์ฟเวอร์

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

  1. โทรหา requestServerSideAccess จากไคลเอ็นต์

    1. ตรวจสอบว่าใช้รหัสไคลเอ็นต์ OAuth ที่ลงทะเบียนไว้สําหรับเซิร์ฟเวอร์เกม ไม่ใช่รหัสไคลเอ็นต์ OAuth ของแอปพลิเคชัน Android
    2. (ไม่บังคับ) หากเซิร์ฟเวอร์เกมของคุณจําเป็นต้องมีการเข้าถึงแบบออฟไลน์ (การเข้าถึงที่มีระยะเวลานานโดยใช้โทเค็นการรีเฟรช) ในบริการเกมของ Play คุณสามารถตั้งค่าพารามิเตอร์ForceRefreshToken เป็น "จริง" ได้
    GamesSignInClient gamesSignInClient = PlayGames.getGamesSignInClient(this);
    gamesSignInClient
      .requestServerSideAccess(OAUTH_2_WEB_CLIENT_ID, /* forceRefreshToken= */ false)
      .addOnCompleteListener( task -> {
        if (task.isSuccessful()) {
          String serverAuthToken = task.getResult();
          // Send authentication code to the backend game server to be
          // exchanged for an access token and used to verify the player
          // via the Play Games Services REST APIs.
        } else {
          // Failed to retrieve authentication code.
        }
    });
    
  2. ส่งโทเค็นการตรวจสอบสิทธิ์ OAuth ไปยังเซิร์ฟเวอร์แบ็กเอนด์เพื่อแลกเปลี่ยนรหัสบัตรประจําตัวที่ยืนยันกับ Play Games Services REST API จากนั้นตรวจสอบสิทธิ์กับเกมของคุณ

แลกเปลี่ยนรหัสการตรวจสอบสิทธิ์เซิร์ฟเวอร์สําหรับโทเค็นเพื่อการเข้าถึงในเซิร์ฟเวอร์

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

ข้อมูลโค้ดต่อไปนี้จะแสดงวิธีใช้โค้ดฝั่งเซิร์ฟเวอร์ในภาษาโปรแกรม Java เพื่อแลกเปลี่ยนรหัสการตรวจสอบสิทธิ์เซิร์ฟเวอร์สําหรับโทเค็นเพื่อการเข้าถึง คือการใช้แอปตัวอย่าง Clientserverskeleton ดังนี้

/**
 * Exchanges the authcode for an access token credential.  The credential
 * is the associated with the given player.
 *
 * @param authCode - the non-null authcode passed from the client.
 * @param player   - the player object which the given authcode is
 *                 associated with.
 * @return the HTTP response code indicating the outcome of the exchange.
 */
private int exchangeAuthCode(String authCode, Player player) {
try {

    // The client_secret.json file is downloaded from the Google API
    // console.  This is used to identify your web application.  The
    // contents of this file should not be shared.
    //
    File secretFile = new File("client_secret.json");

    // If we don't have the file, we can't access any APIs, so return
    // an error.
    if (!secretFile.exists()) {
        log("Secret file : " + secretFile
                .getAbsolutePath() + "  does not exist!");
        return HttpServletResponse.SC_FORBIDDEN;
    }

    GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(
            JacksonFactory.getDefaultInstance(), new
            FileReader(secretFile));

    // Extract the application id of the game from the client id.
    String applicationId = extractApplicationId(clientSecrets
            .getDetails().getClientId());

    GoogleTokenResponse tokenResponse =
            new GoogleAuthorizationCodeTokenRequest(
            HTTPTransport,
            JacksonFactory.getDefaultInstance(),
            "https://oauth2.googleapis.com/token",
            clientSecrets.getDetails().getClientId(),
            clientSecrets.getDetails().getClientSecret(),
            authCode,
            "")
            .execute();

    log("hasRefresh == " + (tokenResponse.getRefreshToken() != null));
    log("Exchanging authCode: " + authCode + " for token");
    Credential credential = new Credential
            .Builder(BearerToken.authorizationHeaderAccessMethod())
            .setJsonFactory(JacksonFactory.getDefaultInstance())
            .setTransport(HTTPTransport)
            .setTokenServerEncodedUrl("https://www.googleapis.com/oauth2/v4/token")
            .setClientAuthentication(new HttpExecuteInterceptor() {
                @Override
                public void intercept(HttpRequest request)
                        throws IOException {
                        }
            })
            .build()
            .setFromTokenResponse(tokenResponse);

    player.setCredential(credential);

    // Now that we have a credential, we can access the Games API.
    PlayGamesAPI api = new PlayGamesAPI(player, applicationId,
            HTTPTransport, JacksonFactory.getDefaultInstance());

    // Call the verify method, which checks that the access token has
    // access to the Games API, and that the player id used by the
    // client matches the playerId associated with the accessToken.
    boolean ok = api.verifyPlayer();

    // Call a Games API on the server.
    if (ok) {
        ok = api.updatePlayerInfo();
        if (ok) {
            // persist the player.
            savePlayer(api.getPlayer());
        }
    }

    return ok ? HttpServletResponse.SC_OK :
            HttpServletResponse.SC_INTERNAL_SERVER_ERROR;

  } catch (IOException e) {
    e.printStackTrace();
  }
  return HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
}

เรียก REST API จากเซิร์ฟเวอร์

ดู REST API สําหรับบริการเกมของ Google Play สําหรับคําอธิบายที่สมบูรณ์ของการเรียก API ที่ใช้ได้

ตัวอย่างการเรียก REST API ที่อาจมีประโยชน์มีดังนี้

ผู้เล่น

  • หากต้องการรับรหัสและรูปโปรไฟล์ของผู้เล่นที่ลงชื่อเข้าใช้ โทร Players.get ด้วยรหัสเป็น 'me'

เพื่อน

อย่าลืมอ่านคู่มือเพื่อน ซึ่งจะอธิบายเกี่ยวกับเพื่อนโดยละเอียด

  • หากต้องการเรียกข้อมูลรายชื่อเพื่อนของผู้เล่น เรียก Players.list ด้วย 'friends_all' เป็น collection
  • ตรวจดูว่ามีสิทธิ์เข้าถึงรายชื่อเพื่อนหรือไม่ เรียก Players.get สําหรับ me และดูที่ช่อง profileSettings.friendsListVisibility ในการตอบกลับ

ความสำเร็จ

อย่าลืมอ่านคู่มือรางวัลพิเศษ ซึ่งอธิบายรางวัลพิเศษเพิ่มเติม

  • หากต้องการดูรายการรางวัลพิเศษในปัจจุบัน คุณสามารถเรียกใช้ AchievementDefinitions.list
  • รวมกับการเรียกไปที่ Achievements.list เพื่อดูว่าโปรแกรมเล่นใดปลดล็อกแล้ว
  • ผู้เล่นได้รับรางวัลพิเศษไหม ใช้ Achievements.unlock เพื่อปลดล็อก
  • โปรแกรมเล่นคืบหน้าไปสู่รางวัลพิเศษบางส่วนหรือไม่ ใช้ Achievements.increment เพื่อรายงานความคืบหน้า (และดูว่าโปรแกรมเล่นปลดล็อกอยู่หรือไม่)
  • คุณกําลังแก้ไขข้อบกพร่องเกมที่ยังไม่ได้ใช้งานจริงหรือไม่ ลองเรียก Achievements.reset หรือ Achievements.resetAll จาก Management API เพื่อรีเซ็ตรางวัลพิเศษเป็นสถานะเดิม

ลีดเดอร์บอร์ด

โปรดอ่านคู่มือลีดเดอร์บอร์ด ซึ่งอธิบายถึงลีดเดอร์บอร์ดโดยละเอียด

  • หากต้องการดูรายชื่อตารางคะแนนทั้งหมดในเกม เรียกใช้ ลีดเดอร์บอร์ด.list
  • ผู้เล่นเล่นวิดีโอเสร็จแล้วใช่ไหม โดยคุณจะส่งคะแนนไปยัง Scores.submit และดูว่านี่เป็นคะแนนสูงสุดใหม่ได้ไหม
  • หากต้องการแสดงลีดเดอร์บอร์ด รับข้อมูลจาก Scores.list และแสดงให้ผู้ใช้เห็น
  • ใช้ Scores.listWindow เพื่อดูคะแนนต่างๆ ที่อยู่ใกล้กับคะแนนสูงสุดของผู้ใช้
  • หากต้องการดูข้อมูลเพิ่มเติมเกี่ยวกับคะแนนของผู้เล่นในลีดเดอร์บอร์ดหนึ่งๆ (เช่น หากผู้เล่นอยู่ในอันดับสูงสุด 12% ของผู้เล่นทั้งหมด) ให้เรียก Scores.get
  • คุณกําลังแก้ไขข้อบกพร่องของเกมใช่ไหม ลองเรียก Scores.reset จาก Management API เพื่อรีเซ็ตคะแนนทั้งหมดสําหรับโปรแกรมเล่นนั้นจากลีดเดอร์บอร์ด