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

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

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

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

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

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

ก่อนเริ่มต้น

ก่อนอื่น คุณต้องเพิ่มเกมใน 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 บริการเกมของ 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 เป็น playerID และ ดู profileSettings.friendsListVisibility ในการตอบกลับ

ความสำเร็จ

ดูรายละเอียดได้จากคู่มือรางวัลพิเศษ

  • หากต้องการดูรายการรางวัลพิเศษในปัจจุบัน ให้โทร AchievementDefinitions.list

  • รวมเข้ากับการโทรเพื่อ Achievements.list เพื่อหาว่าผู้เล่นปลดล็อกเกมใดบ้าง

  • โทร Achievements.unlock เพื่อปลดล็อกรางวัลพิเศษของผู้เล่น

  • โทร Achievements.increment เพื่อรายงานความคืบหน้าของรางวัลพิเศษและดูว่าผู้เล่นได้ปลดล็อกรางวัลพิเศษนั้นหรือไม่

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

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

ดูรายละเอียดในคู่มือลีดเดอร์บอร์ด

  • อยากดูตารางคะแนนทั้งหมดในเกมไหม โทรหา ลีดเดอร์บอร์ดs.list

  • หากผู้เล่นเล่นเกมจบ คุณสามารถส่งคะแนนไปที่ Scores.submit และดูว่านี่เป็นคะแนนใหม่ที่สูงหรือไม่

  • หากต้องการแสดงลีดเดอร์บอร์ด รับข้อมูลจาก Scores.list และแสดงให้ผู้ใช้เห็น

  • ใช้ Scores.listWindow เพื่อค้นหาคะแนนประเภทต่างๆ ที่ใกล้เคียงกับคะแนนสูงสุดของผู้ใช้

  • หากต้องการดูข้อมูลเพิ่มเติมเกี่ยวกับคะแนนของผู้เล่นในลีดเดอร์บอร์ดหนึ่งๆ (เช่น หากผู้เล่นอยู่ใน 12% แรกของผู้เล่นทั้งหมด) ให้ Scores.get

  • ถ้าคุณแก้ไขข้อบกพร่องของเกม คุณสามารถ Scores.reset จาก API การจัดการ เพื่อรีเซ็ตคะแนนทั้งหมดสำหรับผู้เล่นรายนั้นจาก ลีดเดอร์บอร์ด