ผสานรวม Play Integrity สำหรับ PC เข้ากับแอป

Play Integrity สำหรับ PC จะช่วยคุณตรวจสอบว่าเหตุการณ์ในเกมและคำขอของเซิร์ฟเวอร์มาจากอินสแตนซ์จริงของ Google Play Games สำหรับ PC ในอุปกรณ์ PC ของแท้ การตรวจจับอุปกรณ์ที่อาจมีความเสี่ยงและโปรแกรมจำลองที่ไม่รู้จักจะช่วยให้เซิร์ฟเวอร์แบ็กเอนด์ของเกมสามารถตอบสนองด้วยการดำเนินการที่เหมาะสมเพื่อป้องกันการโกง การเข้าถึงที่ไม่ได้รับอนุญาต การเข้าชมที่เป็นการฉ้อโกง และการละเมิด

สิ่งที่ต้องดำเนินการก่อน

ขั้นตอนที่ 1: เลือกวิธีใช้ Play Integrity สำหรับ PC ในเกม

ตัดสินใจว่าจะเรียกใช้ Play Integrity สำหรับ PC เมื่อใดเพื่อรับผลการตัดสินความสมบูรณ์ เกี่ยวกับสภาพแวดล้อม เช่น คุณขอผลการตัดสินได้เมื่อเกม เปิดขึ้น เมื่อผู้เล่นลงชื่อเข้าใช้ หรือเมื่อผู้เล่นเข้าร่วมเกมแบบผู้เล่นหลายคน จากนั้น ตัดสินใจวิธีจัดการการตอบกลับความสมบูรณ์ที่แตกต่างกัน ดังตัวอย่างต่อไปนี้

  • รวบรวมการตอบกลับโดยไม่มีการบังคับใช้ และวิเคราะห์ข้อมูลภายในเพื่อดูว่าการตอบกลับดังกล่าวเป็นสัญญาณการละเมิดที่มีประโยชน์หรือไม่
  • รวบรวมการตอบกลับและใช้ตรรกะในเซิร์ฟเวอร์แบ็กเอนด์เพื่ออนุญาตให้ อุปกรณ์ที่ผ่านการตัดสินความสมบูรณ์เล่นเกมได้ตามปกติ ขณะเดียวกันก็ ท้าทายหรือปฏิเสธการเข้าถึงการเข้าชมที่มาจากสภาพแวดล้อมที่น่าสงสัย
  • รวบรวมการตอบกลับและใช้ตรรกะในแบ็กเอนด์เพื่อจับคู่ผู้เล่นใน อุปกรณ์ที่ผ่านการตรวจสอบความสมบูรณ์เข้าด้วยกัน ขณะเดียวกันก็จับคู่การเข้าชมที่มาจาก สภาพแวดล้อมที่น่าสงสัยเข้าด้วยกัน

ขั้นตอนที่ 2: ขอโทเค็นความสมบูรณ์ในเกม

วอร์มอัป Play Integrity สำหรับ PC

เตรียม (หรือ "วอร์มอัพ") Play Integrity สำหรับ PC ซึ่งจะช่วยให้ Google Play แคชข้อมูลการรับรองบางส่วนอย่างชาญฉลาดในอุปกรณ์เพื่อ ลดเวลาในการตอบสนองในเส้นทางวิกฤตเมื่อคุณส่งคำขอ ผลการวินิจฉัยความสมบูรณ์ คุณสามารถทำแบบนี้แบบไม่พร้อมกันได้ทันทีที่เกมเปิดขึ้น เพื่อให้ส่งคำขอตรวจสอบความสมบูรณ์ตามต้องการได้เมื่อต้องการ

void PrepareIntegrityToken(
  const PrepareIntegrityTokenParams & params,
  PrepareIntegrityTokenContinuation continuation
)

เมื่อสำเร็จ ระบบจะเรียกใช้ Continuation พร้อมกับ PrepareIntegrityTokenResultValue ที่มี RequestTokenData ซึ่งควรใช้เพื่อขอโทเค็นความสมบูรณ์ ควรแคชข้อมูลนี้ในหน่วยความจำและนำกลับมาใช้ใหม่ใน ระยะเวลาของเซสชันแอปพลิเคชันสำหรับการเรียกใช้ RequestIntegrityToken

ระบบจะเรียกใช้ PrepareIntegrityToken ก็ต่อเมื่อแอปพลิเคชันของคุณพิจารณาแล้วว่าจำเป็นต้องประเมินผลการตัดสินด้านความสมบูรณ์อีกครั้งทั้งหมด

รายละเอียด
พารามิเตอร์ params: พารามิเตอร์ที่มีหมายเลขโปรเจ็กต์ Google Cloud
continuation: การเรียกกลับแบบไม่พร้อมกันเพื่อส่งคืนผู้ให้บริการโทเค็นความสมบูรณ์

ข้อมูลโค้ดที่แสดงวิธีเรียกใช้การดำเนินการ PrepareIntegrityToken มีดังนี้

google::play::integrity::IntegrityClient client_;

google::play::integrity::PrepareIntegrityTokenResult
IntegrityInterface::PrepareIntegrityToken(int64_t cloud_project_number) {
  google::play::integrity::PrepareIntegrityTokenParams params;
  params.cloud_project_number = cloud_project_number;

  auto promise = std::make_shared<
      std::promise<google::play::integrity::PrepareIntegrityTokenResult>>();
  client_.PrepareIntegrityToken(
      params,
      [promise](
          google::play::integrity::PrepareIntegrityTokenResult result) {
        promise->set_value(std::move(result));
      });

  return promise->get_future().get();
}

ขอโทเค็นความสมบูรณ์

โทเค็นความสมบูรณ์เป็นกลไกที่เกมใช้เพื่อยืนยันว่าอุปกรณ์ไม่มีการ ดัดแปลง เมื่อใดก็ตามที่เกมของคุณส่งคำขอไปยังเซิร์ฟเวอร์ที่คุณต้องการตรวจสอบ ว่าถูกต้องหรือไม่ คุณสามารถขอโทเค็นความสมบูรณ์แล้วส่งไปยังเซิร์ฟเวอร์แบ็กเอนด์ของเกม เพื่อถอดรหัสและยืนยันได้

เมื่อตรวจสอบการดำเนินการของผู้ใช้ในแอปด้วย Play Integrity API สำหรับ PC คุณสามารถใช้ฟิลด์ RequestIntegrityTokenParams::request_hash เพื่อลดการโจมตีด้วยการดัดแปลงได้ เช่น คุณอาจต้องการรายงานคะแนนของผู้เล่นไปยังเซิร์ฟเวอร์แบ็กเอนด์ของเกม และเซิร์ฟเวอร์ของคุณต้องการยืนยันว่าคะแนนนี้ไม่ได้ถูกดัดแปลงโดยเซิร์ฟเวอร์พร็อกซี Play Integrity สำหรับ PC สามารถแสดงค่าที่คุณตั้งไว้ในช่องนี้ภายในคำตอบความสมบูรณ์ ที่ลงนามแล้ว หากไม่มี requestHash โทเค็นความสมบูรณ์จะเชื่อมโยงกับ อุปกรณ์เท่านั้น แต่จะไม่เชื่อมโยงกับคำขอที่เฉพาะเจาะจง ซึ่งจะเปิดโอกาสให้เกิด การโจมตี

void RequestIntegrityToken(
  const RequestIntegrityTokenParams & params,
  RequestIntegrityTokenContinuation continuation
)

เมื่อขอผลการตัดสินความสมบูรณ์ ให้ทำดังนี้เพื่อลดโอกาสที่จะเกิดการโจมตี

  • คำนวณข้อมูลสรุปของพารามิเตอร์คำขอที่เกี่ยวข้องทั้งหมด (เช่น SHA256 ของการซีเรียลไลซ์คำขอที่เสถียร) จากการกระทำของผู้ใช้หรือคำขอของเซิร์ฟเวอร์ที่เกิดขึ้น
  • ตั้งค่าฟิลด์ RequestIntegrityTokenParams::request_hash เป็น ค่าแฮช
รายละเอียด
พารามิเตอร์ params: พารามิเตอร์ที่มี RequestTokenData ที่เตรียมไว้และแฮชคำขอตรวจสอบความสมบูรณ์
continuation: การเรียกกลับแบบไม่พร้อมกันเพื่อส่งคืนข้อมูล

ข้อมูลโค้ดที่แสดงวิธีเรียกใช้การดำเนินการ RequestIntegrityToken มีดังนี้

absl::StatusOr<google::play::integrity::RequestIntegrityTokenResult>
IntegrityInterface::RequestIntegrityToken(
    const google::play::integrity::PrepareIntegrityTokenResult&
        prepare_integrity_token_result,
    const std::string& request_hash) {
  // Check if the prepare_integrity_token_result is OK
  if (!prepare_integrity_token_result.ok()) {
    return absl::FailedPreconditionError(
        absl::StrCat("PrepareIntegrityTokenResult is not OK. Error code: ",
                     prepare_integrity_token_result.error_code));
  }

  google::play::integrity::RequestIntegrityTokenParams params{
      .request_token_data =
          prepare_integrity_token_result.request_token_data,
      .request_hash = request_hash};

  auto promise = std::make_shared<std::promise<
      google::play::integrity::RequestIntegrityTokenResult>>();
  client_.RequestIntegrityToken(
      params,
      [promise](google::play::integrity::RequestIntegrityTokenResult result) {
        promise->set_value(std::move(result));
      });

  return promise->get_future().get();
}

ขั้นตอนที่ 3: ถอดรหัสและยืนยันโทเค็นความสมบูรณ์ในเซิร์ฟเวอร์แบ็กเอนด์ของเกมในขั้นตอนถัดไป

ถอดรหัสโทเค็นความสมบูรณ์

หลังจากที่คุณขอผลการตัดสินความสมบูรณ์แล้ว Play Integrity API จะให้โทเค็นการตอบกลับที่เข้ารหัส หากต้องการรับการตัดสินความสมบูรณ์ของอุปกรณ์ คุณต้อง ถอดรหัสโทเค็นความสมบูรณ์ในเซิร์ฟเวอร์ของ Google โดยทำดังนี้

  1. สร้างบัญชีบริการภายในโปรเจ็กต์ Google Cloud ที่ลิงก์กับแอป
  2. ในเซิร์ฟเวอร์ของแอป ให้ดึงโทเค็นการเข้าถึงจากข้อมูลเข้าสู่ระบบบัญชีบริการ โดยใช้ขอบเขต playintegrity แล้วส่งคำขอต่อไปนี้

    playintegrity.googleapis.com/v1/<var>PACKAGE_NAME</var>:decodePcIntegrityToken -d \
     '{ "integrity_token": "<var>INTEGRITY_TOKEN</var>" }'
    
  3. อ่านการตอบกลับ JSON

เพย์โหลดที่ได้คือโทเค็นข้อความธรรมดาที่มีผลการตัดสินความสมบูรณ์ และรายละเอียดพร้อมกับข้อมูลที่นักพัฒนาแอปให้ไว้ โทเค็นความสมบูรณ์ที่ถอดรหัสแล้ว จะมีลักษณะดังนี้

{
  "requestDetails": {
    "requestPackageName": "com.your.package.name",
    "requestTime": "2025-08-29T13:10:37.285Z",
    "requestHash": "your_request_hash_string"
  },
  "deviceIntegrity": {
    "deviceRecognitionVerdict": [
      "MEETS_PC_INTEGRITY"
    ]
  },
}

ยืนยันโทเค็นความสมบูรณ์

ฟิลด์ requestDetails ของโทเค็นความสมบูรณ์ที่ถอดรหัสแล้วมีข้อมูล เกี่ยวกับคำขอ รวมถึงข้อมูลที่นักพัฒนาแอปให้ไว้ใน requestHash

ฟิลด์ requestHash และ packageName ควรตรงกับฟิลด์ของคำขอเดิม ดังนั้น ให้ยืนยันส่วน requestDetails ของเพย์โหลด JSON โดย ตรวจสอบว่า requestPackageName และ requestHash ตรงกับสิ่งที่ส่ง ในคำขอเดิม ดังที่แสดงในข้อมูลโค้ดต่อไปนี้

const auto& request_details = json_payload["requestDetails"];

if (request_details.value("requestPackageName", "") != <YOUR_PACKAGE_NAME>) {
  // Don't trust the verdicts.
}

// Check for the existence of the request_hash.
// If you set a request hash in the request and it's not present, you shouldn't
// trust the verdicts.
if (!request_details.contains("requestHash")) {
    // Don't trust the verdicts.
}


// The requestHash from request_details needs to match the request hash your
// app provided.
if (request_details.value("requestHash", "") != <PROVIDED_REQUEST_HASH>) {
    // Don't trust the verdicts.
}

// You can read the rest of payload's fields.

ขั้นตอนที่ 4: ตัดสินใจว่าจะดำเนินการใดตามผลการตัดสินความสมบูรณ์

ฟิลด์ deviceIntegrity อาจมีค่าเดียว deviceRecognitionVerdict คุณใช้ค่านี้เพื่อพิจารณาว่าเกมกำลังทำงานบน PC ที่ผ่านการตรวจสอบความสมบูรณ์ของ Play (ซึ่งเป็นMEETS_PC_INTEGRITY การตอบกลับ) หรือไม่ เซิร์ฟเวอร์แบ็กเอนด์ของเกมสามารถรวบรวมข้อมูลนี้ และใช้เพื่อพิจารณาว่าเกมควรดำเนินการใด เช่น อนุญาตให้เหตุการณ์ในเกมดำเนินการต่อหรือปฏิเสธการเข้าถึงการเข้าชมที่มีความเสี่ยง

"deviceIntegrity": {
  "deviceRecognitionVerdict": ["MEETS_PC_INTEGRITY"]
}

deviceRecognitionVerdict อาจมีค่าดังต่อไปนี้

MEETS_PC_INTEGRITY
เกมกำลังทำงานในสภาพแวดล้อม PC จริง ซึ่งไม่พบการดัดแปลงในอุปกรณ์
ว่าง (ค่าว่าง)
เกมกําลังทํางานในอุปกรณ์ที่มีสัญญาณการโจมตี (เช่น การฮุก API) หรือการบุกรุกระบบ (เช่น อุปกรณ์ที่ใช้ Google Desktop Services เวอร์ชันที่ดัดแปลง) หรือแอปไม่ทํางานในอุปกรณ์จริง (เช่น โปรแกรมจําลองที่ไม่ผ่านการตรวจสอบความน่าเชื่อถือของ Google Play)

ขั้นตอนที่ 5: จัดการรหัสข้อผิดพลาด

หากเกมของคุณส่งคำขอ Play Integrity สำหรับ PC และการเรียกใช้ล้มเหลว เกมจะ ได้รับรหัสข้อผิดพลาด ข้อผิดพลาดเหล่านี้อาจเกิดขึ้นได้จากหลายสาเหตุ เช่น ปัญหาด้านสภาพแวดล้อม เช่น การเชื่อมต่อเครือข่ายไม่ดี ปัญหาเกี่ยวกับการผสานรวม API หรือกิจกรรมที่เป็นอันตรายและการโจมตีที่ใช้งานอยู่

รหัสข้อผิดพลาดที่ลองอีกครั้งได้

สาเหตุของข้อผิดพลาดเหล่านี้บางครั้งเกิดจากสภาวะชั่วคราว ดังนั้นคุณ ควรลองเรียกอีกครั้งโดยใช้กลยุทธ์ Exponential Backoff

IntegrityError คำอธิบายข้อผิดพลาด รหัสข้อผิดพลาด
kNetworkError ปัญหาการเชื่อมต่อเครือข่ายในอุปกรณ์ 5
kTooManyRequests มีการส่งคำขอจากอุปกรณ์มากเกินไป 6
kClientTransientError ปัญหาชั่วคราวเกี่ยวกับไคลเอ็นต์ 7

ดูคําแนะนําเพิ่มเติมเกี่ยวกับกลยุทธ์การลองใหม่ได้ที่นี่

รหัสข้อผิดพลาดที่ลองอีกครั้งไม่ได้

การลองใหม่โดยอัตโนมัติไม่น่าจะช่วยได้ในกรณีเหล่านี้ อย่างไรก็ตาม การลองอีกครั้งด้วยตนเอง อาจช่วยได้หากผู้ใช้แก้ไขเงื่อนไขที่ทำให้เกิดปัญหา

IntegrityError คำอธิบายข้อผิดพลาด รหัสข้อผิดพลาด การดำเนินการที่แนะนำ
kError เกิดข้อผิดพลาดร้ายแรงระหว่างการดำเนินการ SDK 1 ยืนยันการติดตั้งใช้งาน API ก่อนลองอีกครั้ง
kCloudProjectNumberIsInvalid หมายเลขโปรเจ็กต์ที่อยู่ในระบบคลาวด์ไม่ถูกต้อง 2 ตรวจสอบว่าได้กำหนดค่าหมายเลขโปรเจ็กต์ระบบคลาวด์ใน Google Cloud Console อย่างถูกต้อง และส่งคำขอด้วยหมายเลขโปรเจ็กต์ระบบคลาวด์ที่ถูกต้อง
kRequestHashTooLong แฮชคำขอยาวเกินไป 3 แฮชคำขอที่สร้างยาวเกินไป โปรดตรวจสอบว่ามีความยาวน้อยกว่า 500 อักขระ
kNoValidPreparedTokenFound ไม่มีโทเค็นที่เตรียมไว้ก่อนส่งคำขอโทเค็น 4 เรียกใช้การดำเนินการ [PrepareIntegrityToken][prepare-token] ก่อนที่จะทำการเรียก [RequestIntegrityToken][request-integrity-token]
kSdkRuntimeUpdateRequired ต้องอัปเดต Play for Native SDK 8 ตรวจสอบว่าไคลเอ็นต์บริการ Google Play ในอุปกรณ์เป็นเวอร์ชันล่าสุด และคุณกำลังใช้ Play สำหรับ Native PC SDK เวอร์ชันล่าสุด