الوصول من جهة الخادم إلى "خدمات ألعاب Google Play"

ننصحك بمصادقة اللاعبين وتمرير هوية اللاعب بأمان إلى خادم الخلفية. يمكّن هذا الإجراء لعبتك من استرداد هوية اللاعب وبياناته الأخرى بشكل آمن بدون التعرض لأي تلاعب محتمل أثناء المرور بالجهاز.

في هذا السيناريو، بعد تسجيل دخول اللاعب بنجاح، يمكنك طلب رمز خاص يُستخدم لمرة واحدة (يُعرف باسم رمز مصادقة الخادم) من حزمة SDK للإصدار 2 من "خدمات ألعاب Play"، ويمررها العميل إلى الخادم. بعد ذلك، على الخادم، استبدِل رمز مصادقة OAuth 2.0 المميز الذي يمكن للخادم استخدامه لإجراء مكالمات بواجهة برمجة التطبيقات لخدمات ألعاب Google Play.

للحصول على إرشادات إضافية حول إضافة ميزة تسجيل الدخول في ألعابك، يمكنك مراجعة مقالة تسجيل الدخول إلى ألعاب Android.

الخطوات التالية مطلوبة للدخول في وضع عدم الاتصال:

  1. في Google Play Console: أنشِئ بيانات اعتماد لخادم اللعبة. سيكون نوع عميل OAuth لبيانات الاعتماد هو "الويب".
  2. في تطبيق Android: كجزء من تسجيل الدخول، اطلب رمز مصادقة الخادم لبيانات اعتماد الخادم، ومرر ذلك إلى خادمك.
  3. في خادم اللعبة: يمكنك استبدال رمز المصادقة الخاص بالخادم برمز مميز للدخول إلى OAuth باستخدام خدمات المصادقة من Google، ثم استخدام هذا الرمز لطلب بيانات واجهات برمجة تطبيقات REST لخدمات ألعاب Play.

قبل البدء

يجب أولاً إضافة لعبتك في Google Play Console على النحو الموضَّح في إعداد "خدمات ألعاب Google Play" ودمج ميزة تسجيل الدخول إلى "خدمات ألعاب Play" في لعبتك.

إنشاء تطبيق ويب من جهة الخادم

لا توفر خدمات ألعاب Google Play دعمًا في الخلفية لألعاب الويب. إلا أنه يوفر دعم خادم الخلفية لخادم لعبة Android الخاص بك.

إذا أردت استخدام واجهات برمجة تطبيقات REST لخدمات "ألعاب 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" بلا اتصال بالإنترنت (الوصول الطويل الأمد باستخدام رمز مميّز لإعادة التحميل) إلى "خدمات ألعاب Play"، يمكنك ضبط مَعلمة forceجزToken على 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 إلى خادم الخلفية حتى يتم تبادله، كما تم التحقّق من "معرّف اللاعب" مقابل واجهات برمجة تطبيقات REST في "خدمات ألعاب Play"، ثم تمت مصادقته مع لعبتك.

إرسال رمز المصادقة الخاص بالخادم

أرسِل رمز مصادقة الخادم إلى خادم الخلفية للحصول على رموز الوصول وإعادة التحميل. استخدِم رمز الدخول لطلب واجهة برمجة التطبيقات لخدمات ألعاب Play نيابةً عن اللاعب، ويمكنك اختياريًا تخزين رمز إعادة التحميل للحصول على رمز دخول جديد عند انتهاء صلاحية رمز الدخول.

يعرض مقتطف الرمز التالي كيفية تنفيذ الرمز من جهة الخادم في لغة برمجة Java لاستبدال رمز المصادقة الخاص بالخادم بالرموز المميّزة للوصول. وهو يستخدم نموذج تطبيق clientserverskileton.

/**
 * 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 من الخادم

راجِع واجهات برمجة تطبيقات REST لخدمات "ألعاب Google Play" للحصول على وصف كامل لطلبات البيانات من واجهة برمجة التطبيقات المتاحة.

في ما يلي أمثلة على طلبات البيانات من واجهة برمجة تطبيقات REST التي قد تكون مفيدة لك:

اللاعب

هل تريد الحصول على رقم تعريف اللاعب الذي سجّل الدخول وبيانات الملف الشخصي؟ الاتصال بـ [Players.get][] واستخدام 'me' كمعرّف.

الأصدقاء

يمكنك مراجعة دليل الأصدقاء للحصول على التفاصيل.

  • لاسترداد قائمة أصدقاء اللاعب، اتصل بـ Players.list وباستخدام friends_all كـ collection.

  • للتحقق مما إذا كان بإمكانك الوصول إلى قائمة الأصدقاء، اتصل بالعنوان Players.get وباستخدام me باعتباره playerID، واعرض الحقل profileSettings.friendsListVisibility في الرد.

الإنجازات

يُرجى الاطّلاع على دليل الإنجازات للحصول على التفاصيل.

  • للحصول على قائمة بالإنجازات الحالية، يُرجى الاتصال على بخلافificationment Information.list.

  • يمكنك دمج ذلك مع دعوة إلى Performancements.list للاطّلاع على الاقتراحات التي فتحها اللاعب.

  • يمكنك استدعاء الإنجازات.unlock لتحقيق أحد إنجازات اللاعبين.

  • اتصل بـ الإنجازات.increment للإبلاغ عن مستوى التقدُّم في إنجاز ومعرفة ما إذا كان اللاعب قد تمكّن من تحقيقه.

  • إذا كنت تصحح الأخطاء في لعبة لم تصل إلى مرحلة الإنتاج، يمكنك الاتصال بـ Hangoutments.reset أو Foundments.resetAll من واجهات برمجة تطبيقات الإدارة لإعادة ضبط الإنجازات إلى حالتها الأصلية.

لوحات الصدارة

راجِع دليل لوحات الصدارة للحصول على التفاصيل.

  • هل تريد الحصول على قائمة بجميع لوحات النتائج في اللعبة؟ اتصِل برقم Leaderboards.list.

  • إذا أكمل لاعب مباراة ما، يمكنك إرسال نتيجته إلى Scores.submit ومعرفة ما إذا كانت هذه النتيجة أعلى جديدة.

  • لعرض ليدربورد، احصل على البيانات من Scores.list واعرضها للمستخدم.

  • استخدِم Scores.listWindow للعثور على مجموعة من النتائج القريبة من أعلى نتيجة للمستخدم.

  • للاطّلاع على مزيد من المعلومات حول نتيجة اللاعب في لوحة صدارة معيّنة (على سبيل المثال، إذا كان اللاعب ضمن أفضل 12% من جميع اللاعبين)، اتصل على Scores.get.

  • عند تصحيح الأخطاء في لعبة، يمكنك طلب Scores.reset من واجهات برمجة تطبيقات الإدارة لإعادة ضبط كل النتائج لهذا اللاعب من لوحة صدارة معيّنة.