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

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

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

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

يجب تنفيذ الخطوات التالية للوصول بلا اتصال بالإنترنت:

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

قبل البدء

يجب أولاً إضافة لعبتك إلى 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 لمشروع Google Cloud Platform المرتبط بلعبتك.
      3. املأ نموذج الصفحة وانقر على "إنشاء". تأكَّد من ضبط نوع التطبيق على تطبيق الويب.
      4. ارجع إلى قسم إضافة تفويض صفحة بيانات الاعتماد، واختر عميل OAuth الذي تم إنشاؤه حديثًا واحفظ التغييرات.

الحصول على رمز مصادقة الخادم

لاسترداد رمز مصادقة الخادم الذي يمكن للعبة استخدامه للوصول إلى رموز الدخول على الخادم الخلفي:

  1. اتصل بـ requestServerSideAccess من العميل.

    1. احرص على استخدام معرِّف عميل OAuth المُسجَّل لخادم اللعبة وليس معرِّف عميل OAuth لتطبيق Android.
    2. (اختياري) إذا كان خادم اللعبة يتطلب الوصول بلا اتصال بالإنترنت (الوصول الطويل الأمد باستخدام رمز مميز لإعادة التحميل) إلى "خدمات ألعاب Play"، يمكنك ضبط مَعلمة force RefreshToken على "صحيح".
    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 لتبادل رمز المصادقة على الخادم للوصول إلى الرموز المميّزة للوصول. يستخدِم التطبيق نموذج خادم Serverskeleton.

/**
 * 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 API التي قد تجدها مفيدة:

اللاعب

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

الأصدقاء

اطّلِع على دليل الأصدقاء للحصول على التفاصيل.

  • لاسترداد قائمة الأصدقاء في المشغّل، يمكنك طلب Players.list من خلال friends_all بوصفه collection.

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

الإنجازات

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

  • للحصول على قائمة بالإنجازات الحالية، اتصل بـ الإنجازاتmentlist.list.

  • ويمكنك الجمع بين هذا النوع من المكالمات من خلال إضافة عبارة إلى الإنجازات.list لمعرفة تلك التي فتحها اللاعب.

  • اتصل بـ Achievements.unlock لفتح إنجاز اللاعب.

  • في هذه الحالة، يمكنك التواصل مع الإنجازات

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

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

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

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

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

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

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

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

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