เราขอแนะนำให้คุณตรวจสอบสิทธิ์โปรแกรมเล่นและ ส่งข้อมูลประจำตัวของโปรแกรมเล่นไปยังเซิร์ฟเวอร์แบ็กเอนด์อย่างปลอดภัย วิธีนี้ช่วยให้ เกมของคุณเพื่อดึงข้อมูลตัวตนและข้อมูลอื่นๆ ของผู้เล่น และมีโอกาสถูกงัดแงะขณะผ่านอุปกรณ์
ในสถานการณ์นี้ เมื่อ โปรแกรมเล่นลงชื่อเข้าใช้สำเร็จ คุณสามารถขอรหัสพิเศษแบบใช้ครั้งเดียว (เรียกว่ารหัสการตรวจสอบสิทธิ์เซิร์ฟเวอร์) จาก SDK ของบริการเกมของ Play เวอร์ชัน 2 ซึ่งไคลเอ็นต์ส่งผ่านไปยังเซิร์ฟเวอร์ จากนั้น Exchange บนเซิร์ฟเวอร์ รหัสการตรวจสอบสิทธิ์เซิร์ฟเวอร์สำหรับโทเค็น OAuth 2.0 ที่เซิร์ฟเวอร์สามารถใช้ในการเรียกไปยัง API บริการเกมของ Google Play
ดูคำแนะนำเพิ่มเติมเกี่ยวกับการเพิ่มการลงชื่อเข้าใช้ในเกมได้ที่ ลงชื่อเข้าใช้ใน Android Games
โปรดทำตามขั้นตอนต่อไปนี้สำหรับการเข้าถึงแบบออฟไลน์
- ใน Google Play Console: สร้างข้อมูลเข้าสู่ระบบสำหรับเซิร์ฟเวอร์เกม ประเภทไคลเอ็นต์ OAuth ของข้อมูลเข้าสู่ระบบจะเป็น "เว็บ"
- ในแอป Android: ในการลงชื่อเข้าใช้ ให้ขอรหัสการตรวจสอบสิทธิ์เซิร์ฟเวอร์ ข้อมูลเข้าสู่ระบบของเซิร์ฟเวอร์ และส่งผ่านไปยังเซิร์ฟเวอร์ของคุณ
- ในเซิร์ฟเวอร์เกม: แลกเปลี่ยนรหัสการตรวจสอบสิทธิ์เซิร์ฟเวอร์สำหรับการเข้าถึง OAuth โดยใช้บริการการตรวจสอบสิทธิ์ของ Google จากนั้นใช้โทเค็นนี้เพื่อเรียกใช้ API ของ REST ในบริการเกมของ Play
ก่อนเริ่มต้น
ก่อนอื่น คุณต้องเพิ่มเกมใน Google Play Console ตามที่อธิบายไว้ใน ตั้งค่าบริการเกมของ Google Play และผสานรวมการลงชื่อเข้าใช้บริการเกมของ Play กับเกมของคุณ
สร้างเว็บแอปพลิเคชันฝั่งเซิร์ฟเวอร์ที่เชื่อมโยงกับเกมของคุณ
บริการเกมของ Google Play ไม่มีแบ็กเอนด์ ที่สนับสนุนเกมบนเว็บ แต่จะให้การสนับสนุนเซิร์ฟเวอร์แบ็กเอนด์ สำหรับเซิร์ฟเวอร์เกม Android ของคุณ
หากคุณต้องการใช้ REST API สำหรับบริการเกมของ Google Play ในแอปฝั่งเซิร์ฟเวอร์ ให้ทำตามขั้นตอนต่อไปนี้
- จากเกมใน Google Play Console ให้ไปที่บริการเกมของ Play > การตั้งค่าและการจัดการ > การกำหนดค่า
- เลือกเพิ่มข้อมูลเข้าสู่ระบบเพื่อเข้าสู่หน้าเพิ่มข้อมูลเข้าสู่ระบบ เลือกเซิร์ฟเวอร์เกมเป็นประเภทข้อมูลเข้าสู่ระบบ แล้วดำเนินการต่อในส่วนการให้สิทธิ์
- หากเซิร์ฟเวอร์เกมของคุณมีรหัสไคลเอ็นต์ OAuth อยู่แล้ว ให้เลือกรหัสไคลเอ็นต์จากเมนูแบบเลื่อนลง หลังจากบันทึกการเปลี่ยนแปลงแล้ว ให้ย้ายไปยังส่วนถัดไป
- หากไม่มีรหัสไคลเอ็นต์ OAuth ในเซิร์ฟเวอร์เกม คุณก็สร้างได้
- คลิกสร้างไคลเอ็นต์ OAuth และคลิกลิงก์สร้างรหัสไคลเอ็นต์ OAuth
- การดำเนินการนี้จะนำคุณไปยังหน้าสร้างรหัสไคลเอ็นต์ OAuth ของ Google Cloud Platform สำหรับโปรเจ็กต์ Cloud Platform ที่เชื่อมโยงกับเกม
- กรอกแบบฟอร์มของหน้าเว็บและคลิกสร้าง โปรดตรวจสอบว่าได้ตั้งค่าประเภทแอปพลิเคชันเป็นเว็บแอปพลิเคชัน
- กลับไปที่ส่วนเพิ่มการให้สิทธิ์ของหน้าข้อมูลเข้าสู่ระบบ เลือกไคลเอ็นต์ OAuth ที่สร้างใหม่และบันทึกการเปลี่ยนแปลงของคุณ
รับรหัสการตรวจสอบสิทธิ์ของเซิร์ฟเวอร์
วิธีเรียกรหัสการตรวจสอบสิทธิ์เซิร์ฟเวอร์ที่เกมสามารถใช้สำหรับโทเค็นเพื่อการเข้าถึงในเซิร์ฟเวอร์แบ็กเอนด์
โทรหา
requestServerSideAccess
จากไคลเอ็นต์- ตรวจสอบว่าคุณใช้รหัสไคลเอ็นต์ OAuth ที่ลงทะเบียนสำหรับเซิร์ฟเวอร์เกม ไม่ใช่รหัสไคลเอ็นต์ OAuth ของแอปพลิเคชัน Android
- (ไม่บังคับ) หากเซิร์ฟเวอร์เกมของคุณต้องมีสิทธิ์เข้าถึงแบบออฟไลน์ (การเข้าถึงระยะยาวโดยใช้โทเค็นการรีเฟรช) ไปยังบริการเกมของ Play คุณจะตั้งค่าพารามิเตอร์ forceRefreshToken เป็น "จริง" ได้
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. } });
ส่งโทเค็นรหัสการตรวจสอบสิทธิ์ OAuth ไปยังเซิร์ฟเวอร์แบ็กเอนด์ของคุณเพื่อแลกเปลี่ยน รหัสผู้เล่นที่ยืนยันกับ API ของ REST บริการเกมของ Play แล้วตรวจสอบสิทธิ์กับเกมของคุณ
แลกเปลี่ยนรหัสการตรวจสอบสิทธิ์เซิร์ฟเวอร์กับโทเค็นเพื่อการเข้าถึงบนเซิร์ฟเวอร์
ส่งรหัสการตรวจสอบสิทธิ์เซิร์ฟเวอร์ไปยังเซิร์ฟเวอร์แบ็กเอนด์ของคุณเพื่อแลกเปลี่ยนสำหรับการเข้าถึงและรีเฟรชโทเค็น ใช้โทเค็นเพื่อการเข้าถึงเพื่อเรียกใช้ API บริการเกมของ Google Play ในนามของผู้เล่น และหากต้องการ จัดเก็บโทเค็นการรีเฟรชเพื่อรับโทเค็นเพื่อการเข้าถึงใหม่เมื่อโทเค็นเพื่อการเข้าถึงหมดอายุ
ข้อมูลโค้ดต่อไปนี้แสดงวิธีการที่คุณสามารถติดตั้งโค้ดฝั่งเซิร์ฟเวอร์ใน Java ภาษาการเขียนโปรแกรมเพื่อแลกเปลี่ยนรหัสการตรวจสอบสิทธิ์ของเซิร์ฟเวอร์สำหรับโทเค็นเพื่อการเข้าถึง ใช่เลย โดยใช้ 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;
}
เรียก REST API จากเซิร์ฟเวอร์
โปรดดู REST API สำหรับบริการเกมของ Google Play สำหรับ คำอธิบายแบบเต็มของการเรียก API ที่ใช้ได้
ตัวอย่างการเรียก REST API ที่อาจเป็นประโยชน์กับคุณมีดังนี้
ผู้เล่น
- ต้องการขอรหัสและข้อมูลโปรไฟล์ผู้เล่นที่ลงชื่อเข้าใช้ไหม โทรหา Players.get
โดยมี
'me'
เป็นรหัส
เพื่อน
โปรดอ่านคู่มือเพื่อน ซึ่งจะอธิบายเกี่ยวกับเพื่อนได้ละเอียดยิ่งขึ้น
- ต้องการเรียกรายชื่อเพื่อนของผู้เล่นไหม เรียก Players.list ด้วย
'friends_all'
ในฐานะcollection
- ตรวจสอบว่าคุณมีสิทธิ์เข้าถึงรายชื่อเพื่อนหรือไม่ โทรหา Players.get สําหรับ
me
และ ดูที่ช่องprofileSettings.friendsListVisibility
ในคำตอบ
ความสำเร็จ
อย่าลืมอ่านคู่มือรางวัลพิเศษซึ่งอธิบายถึงรางวัลพิเศษ การใช้งานได้มากขึ้น
- ต้องการดูรายการรางวัลพิเศษในปัจจุบันไหม คุณสามารถโทรไปที่ AchievementDefinitions.list ได้
- ให้รวมข้อมูลดังกล่าวกับการเรียกไปที่ Achievements.list เพื่อดูว่าผู้เล่นปลดล็อกรายการใดบ้าง
- ผู้เล่นได้รับรางวัลพิเศษไหม ใช้ Achievements.unlock เพื่อปลดล็อก!
- ผู้เล่นเล่นเกมผ่านรางวัลพิเศษบางส่วนไหม ใช้ Achievements.increment เพื่อ ความคืบหน้าของรายงาน (และดูว่าโปรแกรมเล่นได้ปลดล็อกหน้าจอหรือไม่)
- คุณกำลังแก้ไขข้อบกพร่องของเกมที่ยังไม่เป็นเวอร์ชันที่ใช้งานจริงใช่ไหม ลองโทร Achievements.reset หรือ Achievements.resetAll จาก Management API เพื่อรีเซ็ตรางวัลพิเศษเป็นสถานะเดิม
ลีดเดอร์บอร์ด
อย่าลืมอ่านคู่มือลีดเดอร์บอร์ด ซึ่งอธิบายเกี่ยวกับลีดเดอร์บอร์ดโดยละเอียดมากขึ้น
- อยากดูตารางคะแนนทั้งหมดในเกมไหม โทรไปยัง Leaderboards.list
- ผู้เล่นเล่นเกมเสร็จแล้วไหม คุณสามารถส่งคะแนนไปที่ Scores.submit และดูว่า นี่คือคะแนนสูงสุดใหม่
- ต้องการแสดงลีดเดอร์บอร์ดใช่ไหม รับข้อมูลจาก Scores.list แล้วแสดงต่อผู้ใช้
- ใช้ Scores.listWindow เพื่อค้นหาการจัดประเภทคะแนนที่ใกล้เคียงกับคะแนนสูงสุดของผู้ใช้
- หากต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับคะแนนของผู้เล่นในลีดเดอร์บอร์ดหนึ่งๆ (ตัวอย่างเช่น หาก ผู้เล่นอยู่ใน 12% แรกของผู้เล่นทั้งหมด) ให้โทรหา Scores.get
- คุณจะแก้ไขข้อบกพร่องของเกมใช่ไหม ลองเรียก Scores.reset จากการจัดการ API สำหรับรีเซ็ตคะแนนทั้งหมดสำหรับผู้เล่นรายนั้นจากลีดเดอร์บอร์ดหนึ่งๆ