فعال کردن دسترسی سمت سرور به خدمات بازی های Google Play

توصیه می کنیم بازیکنان را احراز هویت کنید و هویت بازیکن را به طور ایمن به سرور باطن منتقل کنید. این به بازی شما امکان می‌دهد تا هویت بازیکن و سایر داده‌ها را بدون قرار گرفتن در معرض دستکاری احتمالی هنگام عبور از دستگاه، به‌طور ایمن بازیابی کند.

در این سناریو، هنگامی که بازیکن با موفقیت وارد سیستم شد، می‌توانید یک کد یکبار مصرف خاص (به نام کد تأیید اعتبار سرور ) از Play Games Services v2 SDK درخواست کنید که مشتری آن را به سرور ارسال می‌کند. سپس، در سرور، کد تأیید اعتبار سرور را با یک توکن OAuth 2.0 که سرور می‌تواند برای برقراری تماس با Google Play Games Services API استفاده کند، مبادله کنید.

برای راهنمایی بیشتر در مورد افزودن ورود به سیستم در بازی‌های خود، به ورود به سیستم در بازی‌های Android مراجعه کنید.

برای دسترسی آفلاین مراحل زیر لازم است:

  1. در کنسول Google Play: یک اعتبار برای سرور بازی خود ایجاد کنید. نوع مشتری OAuth اعتبارنامه "وب" خواهد بود.
  2. در برنامه Android: به عنوان بخشی از ورود به سیستم، یک کد تأیید اعتبار سرور برای اعتبار سرور خود درخواست کنید و آن را به سرور خود ارسال کنید.
  3. در سرور بازی خود: کد تأیید اعتبار سرور را با یک نشانه دسترسی OAuth با استفاده از سرویس های تأیید اعتبار Google مبادله کنید و سپس از آن برای فراخوانی API های REST Services Games Play استفاده کنید.

قبل از اینکه شروع کنی

ابتدا باید بازی خود را در کنسول Google Play اضافه کنید، همانطور که در راه‌اندازی خدمات بازی‌های Google Play توضیح داده شده است، و خدمات بازی‌های Play را با بازی خود ادغام کنید.

یک برنامه وب سمت سرور مرتبط برای بازی خود ایجاد کنید

خدمات بازی Google Play از بازی های وب پشتیبانی نمی کند. با این حال، پشتیبانی از سرور پشتیبان را برای سرور بازی اندروید شما فراهم می کند.

اگر می‌خواهید از REST API برای خدمات بازی‌های Google Play در برنامه سمت سرور خود استفاده کنید، این مراحل را دنبال کنید:

  1. از بازی خود در کنسول Google Play ، به خدمات Play Games > Setup and management > Configuration بروید.
  2. افزودن اعتبار را انتخاب کنید تا به صفحه افزودن اعتبارنامه آورده شود. سرور بازی را به عنوان نوع اعتبار انتخاب کنید و به بخش مجوز ادامه دهید.
    1. اگر سرور بازی شما قبلاً شناسه مشتری OAuth دارد آن را از منوی کشویی انتخاب کنید. پس از ذخیره تغییرات خود، به بخش بعدی بروید.
    2. اگر شناسه مشتری OAuth برای سرور بازی خود ندارید، می توانید آن را ایجاد کنید.
      1. روی Create OAuth client کلیک کنید و پیوند Create OAuth Client ID را دنبال کنید.
      2. این شما را به صفحه Create OAuth Client ID پلتفرم Google Cloud برای پروژه پلتفرم ابری مرتبط با بازی شما می‌برد.
      3. فرم صفحه را پر کنید و روی ایجاد کلیک کنید. حتماً نوع Application را روی Web application تنظیم کنید.
      4. به بخش مجوز صفحه افزودن اعتبارنامه بازگردید، مشتری OAuth جدید ایجاد شده را انتخاب کنید و تغییرات خود را ذخیره کنید.

کد تایید سرور را دریافت کنید

برای بازیابی کد احراز هویت سرور که بازی شما می تواند از آن برای دسترسی به نشانه های سرور باطن خود استفاده کند:

  1. requestServerSideAccess از مشتری تماس بگیرید.

    1. مطمئن شوید که از OAuth Client ID ثبت شده برای سرور بازی خود استفاده می کنید و نه از OAuth Client ID برنامه اندروید خود.
    2. (اختیاری) اگر سرور بازی شما نیاز به دسترسی آفلاین (دسترسی طولانی مدت با استفاده از نشانه رفرش) به خدمات بازی های Play دارد، می توانید پارامتر forceRefreshToken را روی true تنظیم کنید.
    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 از طرف بازیکن استفاده کنید و به صورت اختیاری، رمز بازخوانی را ذخیره کنید تا پس از منقضی شدن نشانه دسترسی، یک نشانه دسترسی جدید به دست آورید.

قطعه کد زیر نشان می دهد که چگونه می توانید کد سمت سرور را در زبان برنامه نویسی جاوا پیاده سازی کنید تا کد تأیید اعتبار سرور را برای توکن های دسترسی مبادله کنید. از برنامه نمونه کلاینت سرور سرور استفاده می کند:

/**
 * 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;
}

API های REST را از سرور تماس بگیرید

برای توضیح کامل تماس‌های API موجود، به REST API برای خدمات بازی‌های Google Play مراجعه کنید.

نمونه‌هایی از تماس‌های REST API که ممکن است برای شما مفید باشد عبارتند از:

بازیکن

  • آیا می‌خواهید شناسه و اطلاعات نمایه بازیکن واردشده را دریافت کنید؟ با 'me' به عنوان شناسه با Players.get تماس بگیرید.

دوستان

مطمئن شوید که راهنمای دوستان را مرور کرده اید، که دوستان را با جزئیات بیشتری توضیح می دهد.

  • آیا می خواهید لیست دوستان بازیکن را بازیابی کنید؟ Players.list را با 'friends_all' به عنوان collection تماس بگیرید.
  • بررسی کنید که آیا به لیست دوستان دسترسی دارید؟ برای me با Players.get تماس بگیرید و به قسمت profileSettings.friendsListVisibility در پاسخ نگاه کنید.

دستاوردها

مطمئن شوید که راهنمای دستاوردها را مرور کرده اید، که دستاوردها را با جزئیات بیشتری توضیح می دهد.

  • آیا می خواهید لیستی از دستاوردهای فعلی دریافت کنید؟ می توانید با AchievementDefinitions.list تماس بگیرید.
  • آن را با یک تماس به Achievements.list ترکیب کنید تا متوجه شوید بازیکن کدام یک را باز کرده است.
  • آیا بازیکن دستاوردی کسب کرده است؟ از Achievements.unlock برای باز کردن آن استفاده کنید!
  • آیا بازیکن به سمت یک دستاورد جزئی پیشرفت کرده است؟ از Achievements.increment برای گزارش پیشرفت استفاده کنید (و متوجه شوید که آیا بازیکن قفل آن را باز کرده است).
  • آیا در حال رفع اشکال بازی هستید که هنوز تولید نشده است؟ سعی کنید با Achievements.reset یا Achievements.resetAll از APIهای مدیریت تماس بگیرید تا دستاوردها به حالت اولیه بازنشانی شوند.

تابلوهای امتیازات

مطمئن شوید که راهنمای تابلوهای امتیازات را مرور کرده اید، که تابلوهای امتیازات را با جزئیات بیشتری توضیح می دهد.

  • آیا می خواهید لیستی از تمام تابلوهای امتیاز بازی را دریافت کنید؟ با Leaderboards.list تماس بگیرید.
  • آیا بازیکن با بازی تمام شده است؟ شما می توانید امتیاز آنها را به Scores.submit ارسال کنید و متوجه شوید که آیا این یک امتیاز بالا جدید است یا خیر.
  • آیا می خواهید تابلوی امتیازات را نمایش دهید؟ داده ها را از Scores.list دریافت کرده و به کاربر نشان دهید.
  • از Scores.listWindow برای پیدا کردن مجموعه ای از نمرات نزدیک به امتیاز بالای کاربر استفاده کنید.
  • برای دریافت اطلاعات بیشتر در مورد امتیاز بازیکن در یک تابلوی امتیازات خاص (به عنوان مثال، اگر بازیکن در 12٪ برتر همه بازیکنان باشد)، با Scores.get تماس بگیرید.
  • آیا یک بازی را دیباگ می کنید؟ سعی کنید با Scores.reset از APIهای مدیریت تماس بگیرید تا همه امتیازات آن بازیکن از یک تابلوی امتیازات خاص بازنشانی شود.