Google Play Oyun Hizmetleri'ne sunucu tarafı erişimini etkinleştir

Google ile Giriş API'sinin desteğinin sonlandırılmasının ardından, 2026'da Games v1 SDK'sını kaldırıyoruz. Şubat 2025'ten sonra games v1 SDK'sıyla yeni entegre edilen oyunları Google Play'de yayınlayamayacaksınız. Bunun yerine games v2 SDK'sını kullanmanızı öneririz.
Önceki Games v1 entegrasyonlarına sahip mevcut uygulamalar birkaç yıl daha çalışmaya devam edecek olsa da Haziran 2025'ten itibaren v2'ye geçiş yapmanız önerilir.
Bu kılavuz, Play Games Hizmetleri v1 SDK'sının kullanımıyla ilgilidir. En son SDK sürümü hakkında bilgi için v2 belgelerine bakın.

Oyununuzda arka uç sunucusu kullanılıyorsa oyuncuların kimliğini doğrulamak ve oyuncunun kimliğini arka uç sunucusuna güvenli bir şekilde iletmek için Google ile oturum açma özelliğini kullanmanızı öneririz. Bu, oyununuzun, cihazdan geçerken olası kurcalama işlemlerine maruz kalmadan oyuncunun kimliğini ve diğer verilerini güvenli bir şekilde almasını da sağlar.

Bu senaryoda, oyununuz oyuncudan her zamanki gibi Google Play Games Hizmetleri'nde oturum açmasını ister. Oyuncu başarılı bir şekilde oturum açtığında GoogleSignInAccount nesnesi, istemcinin sunucuya ilettiği özel bir tek kullanımlık kod (sunucu kimlik doğrulama kodu olarak adlandırılır) içerir. Ardından, sunucuda sunucu kimlik doğrulama kodunu, sunucunun Google Play Games Hizmetleri API'sine çağrı yapmak için kullanabileceği bir OAuth 2.0 jetonuyla değiştirin.

Oyunlarınıza oturum açma özelliği ekleme hakkında daha fazla bilgi için Android Oyunlarında Oturum Açma başlıklı makaleyi inceleyin.

Oyuncuların kimliğini doğrulamak için Google ile Giriş'in nasıl kullanılacağını gösteren ayrıntılı bir kod örneği için GitHub'daki clientserverskeleton örneğine bakın.

Çevrimdışı erişim için aşağıdaki adımlar gereklidir:

  1. Google Play Console'da: Oyun sunucunuz için bir kimlik bilgisi oluşturun. Kimliğin OAuth istemci türü "web" olur.
  2. Android uygulamasında: Oturum açma işleminin bir parçası olarak sunucunuzun kimlik bilgisi için sunucu kimlik doğrulama kodu isteyin ve bunu sunucunuza iletin.
  3. Oyun sunucunuzda: Google kimlik doğrulama hizmetlerini kullanarak sunucu yetkilendirme kodunu OAuth erişim jetonuyla değiştirin ve ardından Play Games Hizmetleri REST API'lerini çağırmak için bu jetonu kullanın.

Başlamadan önce

Google ile Giriş'i oyununuza entegre etmeden önce, Google Play Console'a oyununuzu eklemeniz gerekir. Bu işlem, Google Play Games Hizmetleri'ni ayarlama bölümünde açıklanmıştır.

Oyununuz için ilişkili bir sunucu tarafı web uygulaması oluşturma

Google Play Oyun Hizmetleri, web oyunları için arka uç desteği sağlamaz. Ancak Android oyununuzun sunucusu için arka uç sunucu desteği sağlar.

Sunucu tarafı uygulamanızda Google Play Games hizmetleri için REST API'leri kullanmak istiyorsanız aşağıdaki adımları uygulayın:

  1. Google Play Console'un Bağlı Uygulamalar bölümünde oyununuz için ilişkili bir web uygulaması oluşturun. Bu akışta launch_url kullanılmadığını ve boş bırakılabileceğini unutmayın.
  2. Uygulamanızın kimlik bilgisine ulaşmak için aşağıdaki adımları uygulayın:
    1. Google Play Console'da oyununuzu açıp Oyun Ayrıntıları'nı tıklayın.
    2. API Konsolu Projesi bölümüne gidin ve API konsolu projesinin bağlantısını tıklayın.
    3. Google API Konsolu'ndaki API'ler ve Hizmetler > Kimlik Bilgileri ekranında web uygulamanızın client_secret.json dosyasını indirip sunucunuzun erişebileceği bir konuma kaydedin. Daha sonra başvurmak üzere kimlik bilgisinin istemci kimliğini kaydedin.
  3. Sunucu tarafı uygulamanızı, oyununuzun istemci uygulamasından gelen istekleri kabul etmeye hazır olacak şekilde yeniden başlatın.

İstemcide oturum açma işlemini gerçekleştirin

GoogleSignInClient sınıfı, şu anda oturum açmış oyuncunun hesabını almak ve daha önce cihazda uygulamanızda oturum açmamışsa oyuncunun oturumunu açmak için kullanılan ana giriş noktasıdır.

Oturum açma istemcisi oluşturmak için aşağıdaki adımları uygulayın:

  1. GoogleSignInOptions nesnesi aracılığıyla bir oturum açma istemcisi oluşturun. Oturum açma işleminizi yapılandırmak için GoogleSignInOptions.Builder bölümünde GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN belirtmeniz gerekir.
  2. Ayrıca, sunucunun istemci kimliğini parametre olarak kullanarak GoogleSignInOptions.Builder.requestServerAuthCode() yöntemini çağırarak oyununuzun arka uç sunucunuz için bir kimlik doğrulama kodu gerektirdiğini de belirtmeniz gerekir. Sunucu kimlik doğrulama kodunu alma bölümünde açıklandığı gibi, arka uç sunucunuzdaki erişim jetonları için yetkilendirme kodunu daha sonra alırsınız.
  3. GoogleSignIn.getClient() yöntemini çağırın ve daha önce yapılandırdığınız seçenekleri iletin. Çağrı başarılı olursa Google ile Oturum Açma API'si, GoogleSignInClient öğesinin bir örneğini döndürür.
  4. GoogleSignInClient örneğini aldıktan sonra, Sessiz oturum açma gerçekleştirme bölümünde açıklandığı gibi, oyuncunun oturumunu etkinliğin onResume() bölümünden sessizce açmaya devam etmeniz gerekir.

Aşağıda bununla ilgili bir örnek verilmiştir:

private static final int RC_SIGN_IN = 9001;
private GoogleSignInClient mGoogleSignInClient;

private void startSignInForAuthCode() {

  // Client ID for your backend server.
  String webClientId = getString(R.string.webclient_id);

  GoogleSignInOptions signInOption = new
      GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN)
      .requestServerAuthCode(webClientId)
      .build();

  GoogleSignInClient signInClient = GoogleSignIn.getClient(this, signInOption);
  Intent intent = signInClient.getSignInIntent();
  startActivityForResult(intent, RC_SIGN_IN);
}

Sunucu yetkilendirme kodunu alma

Oyununuzun arka uç sunucunuzdaki erişim jetonları için kullanabileceği bir sunucu yetkilendirme kodu almak üzere, Google ile oturum açma işleminin başarılı bir şekilde tamamlanması üzerine döndürdüğü getServerAuthCode() nesnesinde GoogleSignInAccount yöntemini çağırın.

Aşağıda bununla ilgili bir örnek verilmiştir:

// Auth code to send to backend server.
private String mServerAuthCode;

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
  if (requestCode == RC_SIGN_IN) {
    GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
    if (result.isSuccess()) {
      mServerAuthCode = result.getSignInAccount().getServerAuthCode();
    } else {
      String message = result.getStatus().getStatusMessage();
      if (message == null || message.isEmpty()) {
        message = getString(R.string.signin_other_error);
      }
      new AlertDialog.Builder(this).setMessage(message)
          .setNeutralButton(android.R.string.ok, null).show();
    }
  }
}

Sunucudaki sunucu yetkilendirme kodunu erişim jetonuyla değiştirme

Erişim ve yenileme jetonlarıyla değiştirmek için sunucu yetkilendirme kodunu arka uç sunucunuza gönderin. Google Play Games Hizmetleri API'sini oyuncu adına çağırmak için erişim jetonunu kullanın ve isteğe bağlı olarak, erişim jetonunun süresi dolduğunda yeni bir erişim jetonu almak için yenileme jetonunu saklayın.

Aşağıdaki kod snippet'inde, sunucu yetkilendirme kodunu erişim jetonlarıyla değiştirmek için sunucu tarafı kodunun Java programlama dilinde nasıl uygulanabileceği gösterilmektedir. clientserverskeleton örnek uygulamasını kullanıyorsanız:

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

Oturum açmış bir oyuncu adına arka uç sunucusundan Google API'lerine erişme hakkında daha fazla bilgi edinmek için Sunucu Tarafı Erişimi Etkinleştirme başlıklı makaleyi inceleyin.

Oyuncunun oturumunu kapatma işlemini gerçekleştirme

Oyuncuların oyununuzdaki oturumunu kapatmak için GoogleSignInClient üzerinde signOut() yöntemini çağırın. Örnek kod snippet'i için Oyuncunun oturumunu kapatma bölümüne bakın.

Sunucudan REST API'leri çağırma

Kullanılabilir API çağrılarıyla ilgili ayrıntılı açıklama için Google Play Games Hizmetleri için REST API'ler başlıklı makaleyi inceleyin.

Faydalı bulabileceğiniz REST API çağrılarına örnek olarak şunlar verilebilir:

Oyuncu

  • Oturum açmış oyuncunun kimliğini ve profil verilerini mi almak istiyorsunuz? Kimlik olarak 'me' ile Players.get'i arayın.

Arkadaşlar

Arkadaşlık özelliğini daha ayrıntılı bir şekilde açıklayan Arkadaşlar rehberini inceleyin.

Başarılar

Başarıları daha ayrıntılı bir şekilde açıklayan Başarılar kılavuzunu incelediğinizden emin olun.

  • Mevcut başarıların listesini almak mı istiyorsunuz? AchievementDefinitions.list'e çağrı yapabilirsiniz.
  • Oyuncunun kilidini açtığı başarıları öğrenmek için Achievements.list çağrısıyla birleştirin.
  • Oyuncu bir başarı kazandı mı? Kilidini açmak için Achievements.unlock'u kullanın.
  • Oyuncu, kısmi bir başarıya ulaşmak için ilerleme kaydetti mi? İlerlemeyi bildirmek (ve oyuncunun kilidini açıp açmadığını öğrenmek) için Achievements.increment'i kullanın.
  • Henüz üretimde olmayan bir oyunda hata ayıklama mı yapıyorsunuz? Başarıları orijinal durumlarına sıfırlamak için Management API'lerden Achievements.reset veya Achievements.resetAll işlevini çağırmayı deneyin.

Skor tabloları

Skor tablolarını daha ayrıntılı bir şekilde açıklayan Skor Tabloları kılavuzunu incelediğinizden emin olun.

  • Oyundaki tüm skor tablolarının listesini almak mı istiyorsunuz? Leaderboards.list'e çağrı yapın.
  • Oyuncu bir oyunu bitirdi mi? Puanlarını Scores.submit'e göndererek yeni bir rekor olup olmadığını öğrenebilirsiniz.
  • Skor tablosu göstermek mi istiyorsunuz? Scores.list'ten verileri alıp kullanıcıya göster.
  • Kullanıcının yüksek puanına yakın çeşitli puanları bulmak için Scores.listWindow'u kullanın.
  • Oyuncunun belirli bir skor tablosundaki puanı hakkında daha fazla bilgi edinmek için (örneğin, oyuncu tüm oyuncuların ilk% 12'sinde yer alıyorsa) Scores.get'i çağırın.
  • Bir oyunda hata ayıklama mı yapıyorsunuz? Belirli bir skor tablosundaki oyuncunun tüm skorlarını sıfırlamak için Yönetim API'lerinden Scores.reset işlevini çağırmayı deneyin.