Google সাইন-ইন API বন্ধ করার পর, আমরা ২০২৬ সালে গেমস v1 SDK সরিয়ে ফেলছি। ২০২৫ সালের ফেব্রুয়ারির পর, আপনি Google Play তে গেমস v1 SDK-এর সাথে নতুনভাবে সংহত করা শিরোনাম প্রকাশ করতে পারবেন না। আমরা আপনাকে এর পরিবর্তে গেমস v2 SDK ব্যবহার করার পরামর্শ দিচ্ছি।
পূর্ববর্তী গেম v1 ইন্টিগ্রেশন সহ বিদ্যমান শিরোনামগুলি কয়েক বছর ধরে কাজ করলেও, আপনাকে জুন 2025 থেকে v2 তে স্থানান্তরিত হতে উৎসাহিত করা হচ্ছে।
এই নির্দেশিকাটি Play Games Services v1 SDK ব্যবহারের জন্য। সর্বশেষ SDK সংস্করণ সম্পর্কে তথ্যের জন্য, v2 ডকুমেন্টেশন দেখুন।
যদি আপনার গেমটি ব্যাকএন্ড সার্ভার ব্যবহার করে, তাহলে আমরা আপনাকে খেলোয়াড়দের প্রমাণীকরণ করতে এবং খেলোয়াড়ের পরিচয় নিরাপদে ব্যাকএন্ড সার্ভারে প্রেরণ করতে Google সাইন-ইন ব্যবহার করার পরামর্শ দিচ্ছি। এটি আপনার গেমটিকে ডিভাইসের মধ্য দিয়ে যাওয়ার সময় সম্ভাব্য টেম্পারিংয়ের সংস্পর্শে না এসে খেলোয়াড়ের পরিচয় এবং অন্যান্য ডেটা নিরাপদে পুনরুদ্ধার করতে সক্ষম করে।
এই পরিস্থিতিতে, আপনার গেমটি খেলোয়াড়কে যথারীতি Google Play Games Services-এ সাইন ইন করতে অনুরোধ করবে। খেলোয়াড় সফলভাবে সাইন ইন করলে, GoogleSignInAccount অবজেক্টে একটি বিশেষ একক-ব্যবহারের কোড থাকে (যাকে সার্ভার প্রমাণীকরণ কোড বলা হয়) যা ক্লায়েন্ট সার্ভারে পাঠায়। তারপর, সার্ভারে, সার্ভার প্রমাণীকরণ কোডটি একটি OAuth 2.0 টোকেনের সাথে বিনিময় করুন যা সার্ভার Google Play Games Services API-তে কল করতে ব্যবহার করতে পারে।
আপনার গেমগুলিতে সাইন-ইন যোগ করার বিষয়ে অতিরিক্ত নির্দেশিকা জানতে, Android গেমগুলিতে সাইন-ইন করুন দেখুন।
গুগল সাইন-ইন ব্যবহার করে প্লেয়ারদের প্রমাণীকরণের জন্য কীভাবে ব্যবহার করতে হয় তার একটি বিস্তারিত কোড নমুনা দেখতে, GitHub-এ clientserverskeleton নমুনাটি দেখুন।
অফলাইন অ্যাক্সেসের জন্য নিম্নলিখিত পদক্ষেপগুলি প্রয়োজন:
- গুগল প্লে কনসোলে: আপনার গেম সার্ভারের জন্য একটি শংসাপত্র তৈরি করুন। শংসাপত্রের OAuth ক্লায়েন্ট ধরণটি হবে "ওয়েব"।
- অ্যান্ড্রয়েড অ্যাপে: সাইন-ইনের অংশ হিসেবে, আপনার সার্ভারের শংসাপত্রের জন্য একটি সার্ভার প্রমাণীকরণ কোডের অনুরোধ করুন এবং এটি আপনার সার্ভারে পাঠান।
- আপনার গেম সার্ভারে: Google auth পরিষেবা ব্যবহার করে সার্ভার auth কোডটি OAuth অ্যাক্সেস টোকেনের সাথে বিনিময় করুন, এবং তারপর Play Games Services REST API গুলিতে কল করতে এটি ব্যবহার করুন।
শুরু করার আগে
আপনার গেমে Google সাইন-ইন ইন্টিগ্রেট করার আগে, আপনাকে প্রথমে Google Play Console- এ আপনার গেমটি যোগ করতে হবে, যেমনটি "Google Play Games Services সেট আপ করুন" বিভাগে বর্ণিত হয়েছে।
আপনার গেমের জন্য একটি সংশ্লিষ্ট সার্ভার-সাইড ওয়েব অ্যাপ্লিকেশন তৈরি করুন
গুগল প্লে গেম পরিষেবাগুলি ওয়েব গেমগুলির জন্য ব্যাক-এন্ড সাপোর্ট প্রদান করে না। তবে, এটি আপনার অ্যান্ড্রয়েড গেমের সার্ভারের জন্য ব্যাক-এন্ড সার্ভার সাপোর্ট প্রদান করে।
আপনার সার্ভার-সাইড অ্যাপে গুগল প্লে গেমস পরিষেবার জন্য REST API গুলি ব্যবহার করতে চাইলে, এই পদক্ষেপগুলি অনুসরণ করুন:
- Google Play Console এর Linked Apps বিভাগে আপনার গেমের জন্য একটি সংশ্লিষ্ট ওয়েব অ্যাপ তৈরি করুন। মনে রাখবেন যে
launch_urlএই ফ্লোটির জন্য ব্যবহার করা হয় না এবং এটি খালি রাখা যেতে পারে। - আপনার অ্যাপের জন্য শংসাপত্রের তথ্য পেতে, এই পদক্ষেপগুলি অনুসরণ করুন:
- গুগল প্লে কনসোলে আপনার গেম থেকে, গেমের বিবরণ -এ ক্লিক করুন।
- API কনসোল প্রজেক্ট বিভাগে স্ক্রোল করুন এবং API কনসোল প্রজেক্টের লিঙ্কে ক্লিক করুন।
- Google API কনসোলের APIs & Services > Credentials স্ক্রিন থেকে, আপনার ওয়েব অ্যাপের জন্য
client_secret.jsonফাইলটি ডাউনলোড করুন এবং এটি এমন একটি স্থানে সংরক্ষণ করুন যেখানে আপনার সার্ভার অ্যাক্সেস করতে পারে। পরবর্তী রেফারেন্সের জন্য ক্রেডেনশিয়ালের ক্লায়েন্ট আইডি রেকর্ড করুন।
- আপনার সার্ভার-সাইড অ্যাপটি পুনরায় চালু করুন যাতে এটি আপনার গেমের ক্লায়েন্ট অ্যাপ থেকে অনুরোধ গ্রহণ করতে প্রস্তুত হয়।
ক্লায়েন্টে সাইন-ইন করুন
GoogleSignInClient ক্লাস হল বর্তমানে সাইন-ইন করা প্লেয়ারের অ্যাকাউন্ট পুনরুদ্ধার করার জন্য এবং যদি তারা ডিভাইসে আপনার অ্যাপে আগে সাইন-ইন না করে থাকে তবে প্লেয়ারটিকে সাইন-ইন করার জন্য প্রধান এন্ট্রি পয়েন্ট।
একটি সাইন-ইন ক্লায়েন্ট তৈরি করতে, এই পদক্ষেপগুলি অনুসরণ করুন:
-
GoogleSignInOptionsঅবজেক্টের মাধ্যমে একটি সাইন-ইন ক্লায়েন্ট তৈরি করুন। আপনার সাইন-ইন কনফিগার করার জন্যGoogleSignInOptions.Builderএ, আপনাকেGoogleSignInOptions.DEFAULT_GAMES_SIGN_INউল্লেখ করতে হবে। - আপনার গেমের ব্যাকএন্ড সার্ভারের জন্য একটি প্রমাণীকরণ কোড প্রয়োজন তাও আপনাকে উল্লেখ করতে হবে
GoogleSignInOptions.Builder.requestServerAuthCode()সার্ভারের ক্লায়েন্ট আইডি প্যারামিটার হিসেবে ব্যবহার করে। আপনার ব্যাকএন্ড সার্ভারে অ্যাক্সেস টোকেনের জন্য আপনি পরে প্রমাণীকরণ কোডটি পুনরুদ্ধার করবেন, যেমনটি Get the server auth code এ বর্ণিত হয়েছে। -
GoogleSignIn.getClient()পদ্ধতিতে কল করুন এবং আপনার পূর্বে কনফিগার করা বিকল্পগুলি পাস করুন। যদি কলটি সফল হয়, তাহলে Google Sign-In APIGoogleSignInClientএর একটি উদাহরণ প্রদান করে। - একবার আপনি
GoogleSignInClientইনস্ট্যান্সটি পেয়ে গেলে, আপনার অ্যাক্টিভিটিরonResume()থেকে প্লেয়ারটিকে নীরবে সাইন ইন করতে এগিয়ে যাওয়া উচিত, যেমনটি Performing silent sign-in এ বর্ণিত হয়েছে।
এখানে একটি উদাহরণ:
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);
}সার্ভার প্রমাণীকরণ কোড পান
আপনার ব্যাকএন্ড সার্ভারে অ্যাক্সেস টোকেনের জন্য আপনার গেমটি ব্যবহার করতে পারে এমন একটি সার্ভার প্রমাণীকরণ কোড পুনরুদ্ধার করতে, GoogleSignInAccount অবজেক্টে getServerAuthCode() পদ্ধতিটি কল করুন যা Google সাইন-ইন সফলভাবে প্লেয়ার সাইন-ইন করলে ফেরত দেয়।
এখানে একটি উদাহরণ:
// 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(); } } }
সার্ভারে একটি অ্যাক্সেস টোকেনের জন্য সার্ভার প্রমাণীকরণ কোড বিনিময় করুন।
অ্যাক্সেস এবং রিফ্রেশ টোকেন বিনিময় করতে আপনার ব্যাকএন্ড সার্ভারে সার্ভার অথেন্টিকেশন কোডটি পাঠান। প্লেয়ারের পক্ষ থেকে Google Play Games Services API-এ কল করতে অ্যাক্সেস টোকেন ব্যবহার করুন এবং ঐচ্ছিকভাবে, অ্যাক্সেস টোকেনের মেয়াদ শেষ হয়ে গেলে একটি নতুন অ্যাক্সেস টোকেন অর্জন করতে রিফ্রেশ টোকেনটি সংরক্ষণ করুন।
নিম্নলিখিত কোড স্নিপেটটি দেখায় কিভাবে আপনি জাভা প্রোগ্রামিং ভাষায় সার্ভার-সাইড কোডটি বাস্তবায়ন করতে পারেন যাতে অ্যাক্সেস টোকেনের জন্য সার্ভার প্রমাণীকরণ কোড বিনিময় করা যায়। এটি 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;
}
সাইন-ইন করা প্লেয়ারের পক্ষ থেকে ব্যাকএন্ড সার্ভার থেকে Google API অ্যাক্সেস করার বিষয়ে আরও জানতে, সার্ভার-সাইড অ্যাক্সেস সক্ষম করা দেখুন।
প্লেয়ার সাইন-আউট পরিচালনা করুন
আপনার গেম থেকে খেলোয়াড়দের সাইন আউট করতে, GoogleSignInClient এ signOut() পদ্ধতিটি কল করুন। একটি উদাহরণ কোড স্নিপেটের জন্য, প্লেয়ারকে সাইন আউট করা দেখুন।
সার্ভার থেকে REST API গুলিতে কল করুন
উপলব্ধ API কলগুলির সম্পূর্ণ বিবরণের জন্য Google Play Games পরিষেবাগুলির জন্য REST API গুলি দেখুন।
REST API কলের উদাহরণ যা আপনার জন্য কার্যকর মনে হতে পারে সেগুলির মধ্যে রয়েছে:
খেলোয়াড়
- সাইন-ইন করা খেলোয়াড়ের আইডি এবং প্রোফাইল ডেটা পেতে চান? Players.Call করুন। আইডি হিসেবে
'me'ব্যবহার করুন।
বন্ধুরা
নিশ্চিত করুন যে আপনি "ফ্রেন্ডস" নির্দেশিকাটি পর্যালোচনা করেছেন, যেখানে "ফ্রেন্ডস" সম্পর্কে আরও বিস্তারিতভাবে ব্যাখ্যা করা হয়েছে।
- খেলোয়াড়ের বন্ধুদের তালিকা পুনরুদ্ধার করতে চান?
'friends_all'collectionহিসেবে রেখে Players.list এ কল করুন। - বন্ধুদের তালিকায় প্রবেশাধিকার আছে কিনা তা পরীক্ষা করে দেখুন? Players.get for
meকল করুন এবং প্রতিক্রিয়ারprofileSettings.friendsListVisibilityক্ষেত্রটি দেখুন।
অর্জনসমূহ
নিশ্চিত করুন যে আপনি "অ্যাচিভমেন্টস গাইড" পর্যালোচনা করেছেন, যেখানে কৃতিত্বগুলি আরও বিশদে ব্যাখ্যা করা হয়েছে।
- বর্তমান সাফল্যের একটি তালিকা পেতে চান? আপনি AchievementDefinitions.list এ কল করতে পারেন।
- প্লেয়ারটি কোনটি আনলক করেছে তা জানতে Achievements.list- এ কল করার সাথে এটি একত্রিত করুন।
- খেলোয়াড় কি কোন কৃতিত্ব অর্জন করেছে? এটি আনলক করতে Achievements.unlock ব্যবহার করুন!
- খেলোয়াড় কি আংশিক অর্জনের দিকে এগিয়েছে? অগ্রগতি রিপোর্ট করতে Achievements.increment ব্যবহার করুন (এবং খেলোয়াড় এটি আনলক করেছে কিনা তা খুঁজে বের করুন)।
- আপনি কি এমন একটি গেম ডিবাগ করছেন যা এখনও তৈরি হয়নি? কৃতিত্বগুলিকে তাদের আসল অবস্থায় রিসেট করতে Management API গুলি থেকে Achievements.reset অথবা Achievements.resetAll কল করার চেষ্টা করুন।
লিডারবোর্ড
লিডারবোর্ড নির্দেশিকাটি পর্যালোচনা করতে ভুলবেন না, যেখানে লিডারবোর্ড সম্পর্কে আরও বিস্তারিতভাবে ব্যাখ্যা করা হয়েছে।
- খেলার সকল স্কোরবোর্ডের তালিকা পেতে চান? Leaderboards.list এ কল করুন।
- খেলোয়াড়ের খেলা কি শেষ? আপনি Scores.submit- এ তাদের স্কোর জমা দিতে পারেন এবং জানতে পারেন এটি একটি নতুন উচ্চ স্কোর কিনা।
- লিডারবোর্ড প্রদর্শন করতে চান? Scores.list থেকে তথ্য সংগ্রহ করুন এবং ব্যবহারকারীকে দেখান।
- ব্যবহারকারীর সর্বোচ্চ স্কোরের কাছাকাছি বিভিন্ন ধরণের স্কোরের সন্ধান করতে Scores.listWindow ব্যবহার করুন।
- একটি নির্দিষ্ট লিডারবোর্ডে খেলোয়াড়ের স্কোর সম্পর্কে আরও তথ্য পেতে (উদাহরণস্বরূপ, যদি খেলোয়াড়টি সমস্ত খেলোয়াড়ের শীর্ষ ১২%-এর মধ্যে থাকে), Scores.get এ কল করুন।
- আপনি কি কোন গেম ডিবাগ করছেন? একটি নির্দিষ্ট লিডারবোর্ড থেকে সেই প্লেয়ারের জন্য সমস্ত স্কোর রিসেট করতে Management API থেকে Scores.reset কল করার চেষ্টা করুন।