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

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

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

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

โปรดทำตามขั้นตอนต่อไปนี้สำหรับการเข้าถึงแบบออฟไลน์

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

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

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

ข้อมูลโค้ดต่อไปนี้แสดงวิธีการที่คุณสามารถติดตั้งโค้ดฝั่งเซิร์ฟเวอร์ใน 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 เพื่อรีเซ็ตรางวัลพิเศษเป็นสถานะเดิม

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

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

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