ตรวจสอบสถานะการลงทะเบียนแอปด้วย Android Developer ID Status API

ใช้ Android Developer Status API เพื่อตรวจสอบว่าชื่อแพ็กเกจแอป Android ได้ลงทะเบียนกับนักพัฒนาแอปที่ผ่านการยืนยันแล้วหรือไม่ หากคุณสร้างเครื่องมือพัฒนาซอฟต์แวร์, IDE หรือเวิร์กโฟลว์ CI/CD อัตโนมัติ คุณสามารถผสานรวม API แบบเซิร์ฟเวอร์กับเซิร์ฟเวอร์นี้เพื่อทำสิ่งต่อไปนี้

  • ตรวจสอบว่าชื่อแพ็กเกจแอปได้ลงทะเบียนกับนักพัฒนาแอปที่ผ่านการยืนยันแล้วหรือไม่
  • ตรวจสอบว่าลายนิ้วมือ SHA-256 ของใบรับรองการลงนามของแอปตรงกับข้อมูลเข้าสู่ระบบในไฟล์สำหรับชื่อแพ็กเกจที่ลงทะเบียนหรือไม่
  • แจ้งให้นักพัฒนาแอปภายในอินเทอร์เฟซของเครื่องมือลงทะเบียนแอปที่ไม่รู้จักในโปรแกรมการยืนยันนักพัฒนาแอป Android

API นี้ออกแบบมาเพื่อรองรับเวิร์กโฟลว์ของนักพัฒนาแอปต่างๆ ดังนี้

กรณีการใช้งาน คำอธิบาย ปลายทาง API
การมีสิทธิ์ของชื่อแพ็กเกจ ตรวจสอบว่าชื่อแพ็กเกจได้ลงทะเบียนแล้วหรือไม่ แสดงผล REGISTERED หากชื่อแพ็กเกจลิงก์กับนักพัฒนาแอปที่ผ่านการยืนยัน หรือ NOT_REGISTERED ในกรณีอื่นๆ CheckPackageRegistrationStatus
แอปได้ลงทะเบียนแล้ว ตรวจสอบว่ามีการลงทะเบียนชื่อแพ็กเกจและลายนิ้วมือของใบรับรองคู่หนึ่งๆ หรือไม่ แสดงผล REGISTERED หากมีการลงทะเบียนชื่อแพ็กเกจและลายนิ้วมือของใบรับรองคู่หนึ่งๆ, NOT_REGISTERED หากไม่มีการลงทะเบียนชื่อแพ็กเกจและลายนิ้วมือของใบรับรองคู่หนึ่งๆ หรือ REGISTERED_WITH_ANOTHER_CERTIFICATE_FINGERPRINT หากมีการลงทะเบียนชื่อแพ็กเกจด้วยลายนิ้วมือของใบรับรองอื่น CheckPackageRegistrationStatus

คู่มือนี้อธิบายวิธีทำงานต่อไปนี้ให้เสร็จสมบูรณ์

  1. ตั้งค่าการเข้าถึงและตรวจสอบสิทธิ์ Google Cloud API
  2. ตรวจสอบว่านักพัฒนาแอปที่ผ่านการยืนยันได้ลงทะเบียนชื่อแพ็กเกจและลายนิ้วมือ SHA-256 ของใบรับรองสาธารณะของแอปกับโปรแกรมการยืนยันนักพัฒนาแอป Android แล้วหรือไม่ โดยใช้ลายนิ้วมือ SHA-256 ของใบรับรองสาธารณะที่ให้มาหรือลายนิ้วมือ SHA-256 ของใบรับรองสาธารณะอื่น
  3. จัดการสถานะการลงทะเบียน API ในเวิร์กโฟลว์ IDE หรือเครื่องมือสำหรับนักพัฒนาแอป

สิ่งที่ต้องมีก่อน

เอกสารนี้มีไว้สำหรับนักพัฒนาแอป Android หรือนักพัฒนาเครื่องมือพัฒนาซอฟต์แวร์ ก่อนเริ่มต้น คุณควรมีสิ่งต่อไปนี้

  • สิทธิ์เข้าถึงระดับผู้ดูแลระบบในโปรเจ็กต์ที่อยู่ในระบบคลาวด์ของ Google
  • ความเข้าใจพื้นฐานเกี่ยวกับ RESTful API, JSON และลายนิ้วมือ SHA-256 ของใบรับรอง

นอกจากนี้ คุณควรทำความคุ้นเคยกับคำศัพท์ต่อไปนี้

คำศัพท์ คำจำกัดความ
การยืนยันนักพัฒนาแอป Android การยืนยันนักพัฒนาแอป Android เป็นข้อกำหนดใหม่ที่ออกแบบมาเพื่อลิงก์เอนทิตีในโลกจริง (บุคคลและองค์กร) กับแอป Android Android จะกำหนดให้แอปทั้งหมดต้องลงทะเบียนโดยนักพัฒนาแอปที่ผ่านการยืนยันเพื่อให้ผู้ใช้ติดตั้งในอุปกรณ์ Android ที่ผ่านการรับรองได้
ลายนิ้วมือของใบรับรอง แฮช SHA-256 ของใบรับรองสาธารณะที่ใช้ลงนามแอป
สถานะการลงทะเบียน สถานะที่ API แสดงผลสำหรับชื่อแพ็กเกจของแอป หรือชื่อแพ็กเกจและลายนิ้วมือ SHA-256 ของใบรับรองสาธารณะของแอป สถานะนี้กำหนดการดำเนินการที่คุณต้องทำ (เช่น REGISTERED, NOT_REGISTERED)

ปลายทางบริการ

ปลายทางบริการคือ URL ฐานที่ระบุที่อยู่เครือข่าย ของบริการ API บริการนี้มีปลายทางบริการต่อไปนี้ และ URI ทั้งหมดจะเกี่ยวข้องกับปลายทางบริการนี้

https://androiddeveloperidstatus.googleapis.com

เปิดใช้ API

หากต้องการใช้ Android Developer ID Status API คุณต้องทำตามขั้นตอนการตั้งค่าเพื่อสร้างโปรเจ็กต์และเปิดใช้ API

สร้างโปรเจ็กต์ Google Cloud

  1. สร้างบัญชี Google Cloud หากคุณยังไม่มี
  2. เปิด คอนโซล Google Cloud
  3. สร้างโปรเจ็กต์ Google Cloud

เปิดใช้ API ในโปรเจ็กต์

  1. ในคอนโซล Google Cloud ให้ไปที่API และบริการ > คลัง
  2. เลือกโปรเจ็กต์จากเมนูแบบเลื่อนลง
  3. ค้นหา Android Developer ID Status API
  4. คลิกเปิดใช้

ตรวจสอบสิทธิ์

API รองรับข้อมูลเข้าสู่ระบบคีย์ API วิธีรับคีย์ API

  1. ในคอนโซล Google Cloud ให้ไปที่API และบริการ > ข้อมูลเข้าสู่ระบบ
  2. คลิก + สร้างข้อมูลเข้าสู่ระบบ แล้วเลือก คีย์ API
  3. กำหนดค่าคีย์แล้วคัดลอก ใช้คีย์นี้ในส่วนหัวของคำขอ

ตรวจสอบสถานะการลงทะเบียนแอป

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

ตรวจสอบชื่อแพ็กเกจ

หากต้องการตรวจสอบว่าชื่อแพ็กเกจแอปได้ลงทะเบียนโดยนักพัฒนาแอปที่ผ่านการยืนยันแล้วหรือไม่ ให้ส่งคำขอ GET ที่มีการตรวจสอบสิทธิ์ซึ่งมีชื่อแพ็กเกจของแอป Android (เช่น com.example.app) ไปยังปลายทาง packageRegistrationStatus:check โดยไม่มีพารามิเตอร์ที่ไม่บังคับ

คำขอ:

curl -X GET "https://androiddeveloperidstatus.googleapis.com/v1/packages/com.example.app/packageRegistrationStatus:check" \
  -H "X-Goog-Api-Key: [key]"

ผลลัพธ์

การตอบกลับ (ลงทะเบียนแล้ว):

หากมีการลงทะเบียนชื่อแพ็กเกจ คุณจะได้รับเนื้อหาการตอบกลับ HTTP ต่อไปนี้พร้อมโค้ดตอบกลับ HTTP 200

{
  "name": "packages/com.example.app/packageRegistrationStatus",
  "state": "REGISTERED"
}

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

การตอบกลับ (ไม่ได้ลงทะเบียน):

หากไม่มีการลงทะเบียนชื่อแพ็กเกจ คุณจะได้รับเนื้อหาการตอบกลับ HTTP ต่อไปนี้พร้อมโค้ดตอบกลับ HTTP 200

{
  "name": "packages/com.example.app/packageRegistrationStatus",
  "state": "NOT_REGISTERED"
}

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

ตัวอย่าง Java

ตัวอย่าง Java นี้เรียก API โดยไม่มีพารามิเตอร์การค้นหาเพื่อตรวจสอบว่ามีการลงทะเบียนชื่อแพ็กเกจหรือไม่

import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class CheckPackageNameClient {

  private static final String API_ENDPOINT = "https://androiddeveloperidstatus.googleapis.com";

  public static void main(String[] args) {
    String apiKey = "YOUR_API_KEY";
    String packageName = "com.example.app";

    try {
      String response = checkPackageRegistrationStatus(apiKey, packageName);
      System.out.println("Response: " + response);
    } catch (IOException | InterruptedException e) {
      e.printStackTrace();
    }
  }

  /**
   *   Checks the registration status of an Android package.
   */
  public static String checkPackageRegistrationStatus(String apiKey, String packageName)
      throws IOException, InterruptedException {

    String fullUrl = String.format("%s/v1/packages/%s/packageRegistrationStatus:check", API_ENDPOINT, packageName);

    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create(fullUrl))
        .header("Accept", "application/json")
        .header("X-Goog-Api-Key", apiKey)
        .GET()
        .build();

    HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

    if (response.statusCode() != 200) {
      throw new IOException("Unexpected response code: " + response.statusCode() + ", body: " + response.body());
    }

    return response.body();
  }
}

ยืนยันชื่อแพ็กเกจและลายนิ้วมือของใบรับรองคู่หนึ่งๆ

หากต้องการตรวจสอบว่ามีการลงทะเบียนชื่อแพ็กเกจแอปด้วยลายนิ้วมือ SHA-256 ของใบรับรองสาธารณะที่เฉพาะเจาะจงหรือไม่ ให้ส่งพารามิเตอร์การค้นหา certificateFingerprint

คำขอ:

curl -X GET "https://androiddeveloperidstatus.googleapis.com/v1/packages/com.example.app/packageRegistrationStatus:check?certificateFingerprint=d6ac89ed1d0a805aad4b087d06d5f41645b814480b133fbc867ef7498d069e06" \
  -H "X-Goog-Api-Key: [key]"

ผลลัพธ์

การตอบกลับ (ลงทะเบียนด้วยลายนิ้วมือของใบรับรองที่ตรงกัน):

หากมีการลงทะเบียนชื่อแพ็กเกจด้วยลายนิ้วมือ SHA-256 ของใบรับรองสาธารณะที่ให้มา คุณจะได้รับเนื้อหาการตอบกลับ HTTP ต่อไปนี้พร้อมโค้ดตอบกลับ HTTP 200

{
  "name": "packages/com.example.app/packageRegistrationStatus",
  "state": "REGISTERED"
}

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

การตอบกลับ (ลงทะเบียนด้วยลายนิ้วมือของใบรับรองอื่น):

หากมีการลงทะเบียนชื่อแพ็กเกจด้วยลายนิ้วมือ SHA-256 ของใบรับรองอื่นที่ไม่ใช่ที่ให้มา คุณจะได้รับเนื้อหาการตอบกลับ HTTP ต่อไปนี้พร้อมโค้ดตอบกลับ HTTP 200

{
  "name": "packages/com.example.app/packageRegistrationStatus",
  "state": "REGISTERED_WITH_ANOTHER_CERTIFICATE_FINGERPRINT"
}

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

การตอบกลับ (ไม่ได้ลงทะเบียน):

หากไม่มีการลงทะเบียนชื่อแพ็กเกจด้วยลายนิ้วมือ SHA-256 ของใบรับรองสาธารณะที่ให้มา คุณจะได้รับเนื้อหาการตอบกลับ HTTP ต่อไปนี้พร้อมโค้ดตอบกลับ HTTP 200

{
  "name": "packages/com.example.app/packageRegistrationStatus",
  "state": "NOT_REGISTERED"
}

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

ตัวอย่าง Java

ตัวอย่าง Java นี้รวม certificateFingerprint เป็นพารามิเตอร์การค้นหาที่เข้ารหัส URL อย่างชัดเจนเพื่อยืนยันการจับคู่แพ็กเกจและลายนิ้วมือที่เฉพาะเจาะจง

import java.io.IOException;
import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;

public class CheckPackageAndFingerprintClient {

  private static final String API_ENDPOINT = "https://androiddeveloperidstatus.googleapis.com";

  public static void main(String[] args) {
    String apiKey = "YOUR_API_KEY";
    String packageName = "com.example.app";
    String certificateFingerprint = "d6ac89ed1d0a805aad4b087d06d5f41645b814480b133fbc867ef7498d069e06";

    try {
      String response = checkPackageAndFingerprintRegistrationStatus(apiKey, packageName, certificateFingerprint);
      System.out.println("Response: " + response);
    } catch (IOException | InterruptedException e) {
      e.printStackTrace();
    }
  }

  /**
   *   Checks the registration status of a specific Android package and certificate fingerprint pair.
   */
  public static String checkPackageAndFingerprintRegistrationStatus(
      String apiKey, String packageName, String certificateFingerprint)
      throws IOException, InterruptedException {

    String path = String.format("/v1/packages/%s/packageRegistrationStatus:check", packageName);

    String encodedFingerprint = URLEncoder.encode(certificateFingerprint, StandardCharsets.UTF_8);
    String fullUrl = API_ENDPOINT + path + "?certificateFingerprint=" + encodedFingerprint;

    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create(fullUrl))
        .header("Accept", "application/json")
        .header("X-Goog-Api-Key", apiKey)
        .GET()
        .build();

    HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

    if (response.statusCode() != 200) {
      throw new IOException("Unexpected response code: " + response.statusCode() + ", body: " + response.body());
    }

    return response.body();
  }
}

ทำความเข้าใจสถานะการลงทะเบียนและการจัดการข้อผิดพลาด

เมื่อคำขอ API ล้มเหลว Android Developer ID Status API จะแสดงผลออบเจ็กต์ข้อผิดพลาด JSON มาตรฐานของ Google Cloud ในเนื้อหาการตอบกลับ ออบเจ็กต์นี้มีโครงสร้างที่สอดคล้องกันเพื่อให้เข้าใจและจัดการข้อผิดพลาดได้

ตัวอย่างการตอบกลับข้อผิดพลาด

{
  "error": {
    "code": 400,
    "message": "Request contains an invalid argument.",
    "status": "INVALID_ARGUMENT"
  }
}

ออบเจ็กต์ข้อผิดพลาดมีฟิลด์คีย์ต่อไปนี้

  • code: รหัสสถานะ HTTP (เช่น 400, 403, 500)
  • message: คำอธิบายข้อผิดพลาดเป็นภาษาอังกฤษสำหรับนักพัฒนาแอป ข้อความนี้ไม่เสถียรและอาจมีการเปลี่ยนแปลง ดังนั้นอย่าสร้างตรรกะการแยกวิเคราะห์รอบๆ ข้อความนี้
  • status: โค้ดข้อผิดพลาด Canonical ที่ระบุประเภทข้อผิดพลาดโดยโปรแกรม (เช่น INVALID_ARGUMENT, PERMISSION_DENIED) ตรรกะการจัดการข้อผิดพลาดควรสร้างขึ้นจากตัวระบุที่เสถียรนี้

ตารางต่อไปนี้แสดงข้อผิดพลาดที่พบบ่อยที่สุดที่ API แสดงผลและการดำเนินการที่แนะนำ

สถานะ HTTP โค้ดข้อผิดพลาด Canonical (status) ความหมายและสาเหตุที่พบบ่อย การดำเนินการที่แนะนำ ลองอีกครั้งได้ไหม
400 Bad Request INVALID_ARGUMENT คำขอมีรูปแบบไม่ถูกต้อง อย่าลองอีกครั้ง ตรวจสอบฟิลด์รายละเอียดในการตอบกลับข้อผิดพลาดเพื่อระบุการละเมิดฟิลด์ที่เฉพาะเจาะจง แก้ไขเพย์โหลดของคำขอแล้วส่งอีกครั้ง ไม่ได้
401 Unauthorized UNAUTHENTICATED โทเค็นเพื่อการเข้าถึงหายไป หมดอายุ หรือไม่ถูกต้อง อย่าลองอีกครั้งทันที ตรวจสอบว่าคุณใช้โทเค็นเพื่อการเข้าถึงหรือคีย์ที่ถูกต้อง ไม่ได้
403 Forbidden PERMISSION_DENIED คุณได้รับการตรวจสอบสิทธิ์แล้ว แต่โปรเจ็กต์ของคุณไม่มีสิทธิ์เข้าถึง API สาเหตุที่พบบ่อยที่สุดคือคุณไม่ได้เปิดใช้ API ในโปรเจ็กต์ Google Cloud อย่าลองอีกครั้ง ตรวจสอบว่าคุณใช้รหัสโปรเจ็กต์ที่ถูกต้องและเปิดใช้ API แล้ว ไม่ได้
429 Too Many Requests RESOURCE_EXHAUSTED คุณใช้โควต้า API สำหรับโปรเจ็กต์เกินแล้ว หยุดส่งคำขอและลองอีกครั้งหลังจากรอสักครู่ ตรวจสอบโควต้าของโปรเจ็กต์ในคอนโซล Google Cloud ได้
500 Internal Server Error INTERNAL เกิดข้อผิดพลาดที่ไม่คาดคิดในเซิร์ฟเวอร์ของ Google ข้อผิดพลาดนี้มักเป็นปัญหาชั่วคราว ลองส่งคำขออีกครั้งโดยใช้กลยุทธ์ Exponential Backoff หากข้อผิดพลาดยังคงอยู่ โปรดติดต่อทีมสนับสนุน ได้
503 Service Unavailable UNAVAILABLE ไม่สามารถใช้บริการได้ชั่วคราว ลองส่งคำขออีกครั้งโดยใช้กลยุทธ์ Exponential Backoff ได้

ขีดจำกัดโควต้า

ระบบจะบังคับใช้โควต้าการใช้งานตามโปรเจ็กต์เพื่อให้มั่นใจในความน่าเชื่อถือของบริการ

เมธอด API ขีดจำกัดเริ่มต้น (ต่อโปรเจ็กต์) หมายเหตุ
CheckPackageRegistrationStatus 1,000 คำขอต่อวัน ผู้เรียกต้องจัดการการจำกัดอัตราคำขอภายในเพื่อป้องกันการละเมิด

ตรวจสอบการใช้งาน

คุณสามารถตรวจสอบการใช้งาน API ปัจจุบันของโปรเจ็กต์และดูว่าใกล้ถึงขีดจำกัดโควต้าแล้วหรือยังได้โดยตรงใน Google Cloud Console

  1. ไปที่หน้า API และบริการ > แดชบอร์ด
  2. เลือก Android Developer ID Status API
  3. คลิกแท็บโควต้า

แดชบอร์ดนี้จะแสดงรายละเอียดปริมาณคำขอตามช่วงเวลา