Verifica el estado de registro de la app con la API de Android Developer ID Status

Usa la API de Android Developer Status para verificar si el nombre de paquete de una app para Android está registrado por un desarrollador verificado. Si compilas herramientas de desarrollo de software, IDE o flujos de trabajo de CI/CD automatizados, puedes integrar esta API de servidor a servidor para hacer lo siguiente:

  • Verificar si el nombre de paquete de una app está registrado por un desarrollador verificado
  • Validar si la huella digital SHA-256 del certificado de firma de una app coincide con las credenciales registradas para el nombre de paquete registrado
  • Solicitar a los desarrolladores dentro de la interfaz de tu herramienta que registren apps no reconocidas en el programa de verificación de desarrolladores de Android

Esta API está diseñada para admitir varios flujos de trabajo de desarrolladores:

Caso de uso Descripción Endpoint de API
Elegibilidad del nombre de paquete Verificar si ya se registró un nombre de paquete. Muestra REGISTERED si el nombre de paquete está vinculado a algún desarrollador verificado; de lo contrario, muestra NOT_REGISTERED. CheckPackageRegistrationStatus
Se registró la app Verificar si se registró un par específico de nombre de paquete y huella digital del certificado. Muestra REGISTERED si se registró el par de nombre de paquete y huella digital del certificado, NOT_REGISTERED si no se registró el par de nombre de paquete y huella digital del certificado o REGISTERED_WITH_ANOTHER_CERTIFICATE_FINGERPRINT si el nombre de paquete se registró con una huella digital del certificado diferente. CheckPackageRegistrationStatus

En esta guía, se explica cómo completar las siguientes tareas:

  1. Configurar la autenticación y el acceso a la API de Google Cloud
  2. Verificar si un desarrollador verificado registró el nombre de paquete y el par de huellas digitales SHA-256 del certificado público de una app en el programa de verificación de desarrolladores de Android, ya sea con la huella digital SHA-256 del certificado público proporcionada o con una huella digital SHA-256 del certificado público diferente
  3. Administrar los estados de registro de la API en tu IDE o flujo de trabajo de herramientas para desarrolladores

Requisitos previos

Este documento está destinado a desarrolladores de apps para Android o desarrolladores de herramientas de desarrollo de software. Antes de comenzar, debes tener lo siguiente:

  • Acceso administrativo a un proyecto de Google Cloud
  • Conocimientos básicos de las APIs de RESTful, JSON y las huellas digitales SHA-256 del certificado

También debes conocer los siguientes términos:

Término Definición
Verificación de desarrolladores de Android La verificación de desarrolladores de Android es un nuevo requisito diseñado para vincular entidades del mundo real (personas y organizaciones) con sus apps para Android. Android requerirá que todas las apps estén registradas por desarrolladores verificados para que los usuarios puedan instalarlas en dispositivos Android certificados.
Huella digital del certificado Es el hash SHA-256 del certificado público que se usa para firmar la app.
Estado de registro Es el estado que muestra la API para el nombre de paquete de una app o el par de nombre de paquete y huella digital SHA-256 del certificado público de una app. Este estado dicta la acción que debes realizar (por ejemplo, REGISTERED, NOT_REGISTERED).

Extremo de servicio

Un extremo de servicio es una URL base que especifica la dirección de red de un servicio de API. Este servicio tiene el siguiente extremo de servicio, y todos los URIs son relativos a este extremo de servicio:

https://androiddeveloperidstatus.googleapis.com

Habilita la API

Para usar la API de Android Developer ID Status, debes completar los pasos de configuración para crear un proyecto y habilitar la API.

Crea un proyecto de Google Cloud

  1. Crea una cuenta de Google Cloud si no tienes una.
  2. Abre la consola de Google Cloud.
  3. Crea un proyecto de Google Cloud.

Habilita la API en tu proyecto

  1. En la consola de Google Cloud, ve a APIs y servicios > Biblioteca.
  2. Selecciona tu proyecto en el menú desplegable.
  3. Busca API de Android Developer ID Status.
  4. Haz clic en Habilitar.

Autenticar

La API admite credenciales de clave de API. Para obtener una clave de API, haz lo siguiente:

  1. En la consola de Google Cloud, navega a APIs y servicios > Credenciales.
  2. Haz clic en + Crear credenciales y selecciona Clave de API.
  3. Configura la clave y cópiala. Usa esta clave en los encabezados de solicitud.

Verifica el estado de registro de la app

Puedes consultar el recurso PackageRegistrationStatus para verificar un nombre de paquete solo o verificar un nombre de paquete junto con una huella digital del certificado específica.

Verifica un nombre de paquete

Para verificar si algún desarrollador verificado registró el nombre de paquete de una app, realiza una solicitud GET autenticada que contenga el nombre de paquete de la app para Android (por ejemplo, com.example.app) al extremo packageRegistrationStatus:check sin parámetros opcionales:

Solicitud:

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

Resultados

Respuesta (registrada):

Si se registra el nombre de paquete, recibirás el siguiente cuerpo de respuesta HTTP con el código de respuesta HTTP 200:

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

Acción recomendada: Si realizas esta verificación en nombre de otro desarrollador, infórmale que se registró el nombre de paquete.

Respuesta (no registrada):

Si no se registra el nombre de paquete, recibirás el siguiente cuerpo de respuesta HTTP con el código de respuesta HTTP 200:

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

Acción recomendada: Si realizas esta verificación en nombre de otro desarrollador, infórmale que no se registró el nombre de paquete.

Ejemplo de Java

En este ejemplo de Java, se llama a la API sin ningún parámetro de consulta para verificar si se registró el nombre de paquete.

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();
  }
}

Verifica los pares de nombre de paquete y huella digital del certificado

Para verificar si el nombre de paquete de una app está registrado con una huella digital SHA-256 del certificado público específica, pasa el parámetro de consulta certificateFingerprint:

Solicitud:

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

Resultados

Respuesta (registrada con la huella digital del certificado coincidente):

Si el nombre de paquete está registrado con la huella digital SHA-256 del certificado público proporcionada, recibirás el siguiente cuerpo de respuesta HTTP con el código de respuesta HTTP 200:

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

Acción recomendada: Si realizas esta verificación en nombre de otro desarrollador, infórmale que se registró el nombre de paquete con la huella digital del certificado proporcionada.

Respuesta (registrada con una huella digital del certificado diferente):

Si el nombre de paquete está registrado con una huella digital SHA-256 del certificado diferente a la proporcionada, recibirás el siguiente cuerpo de respuesta HTTP con el código de respuesta HTTP 200:

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

Acción recomendada: Si realizas esta verificación en nombre de otro desarrollador, infórmale que se registró el nombre de paquete, pero con una huella digital del certificado diferente a la proporcionada.

Respuesta (no registrada):

Si el nombre de paquete no está registrado con la huella digital SHA-256 del certificado público proporcionada, recibirás el siguiente cuerpo de respuesta HTTP con el código de respuesta HTTP 200:

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

Acción recomendada: Si realizas esta verificación en nombre de otro desarrollador, infórmale que no se registró el nombre de paquete con la huella digital del certificado proporcionada.

Ejemplo de Java

En este ejemplo de Java, se incluye explícitamente certificateFingerprint como un parámetro de consulta codificado en URL para verificar un paquete específico y una combinación de huellas digitales.

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();
  }
}

Comprende los estados de registro y el manejo de errores

Cuando falla una solicitud a la API, la API de Android Developer ID Status muestra un objeto de error JSON estándar de Google Cloud en el cuerpo de la respuesta. Este objeto proporciona una estructura coherente para comprender y controlar el error.

Ejemplo de respuesta de error:

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

El objeto de error contiene los siguientes campos clave:

  • code: Es el código de estado HTTP (por ejemplo, 400, 403, 500).
  • message: Es una descripción en inglés del error que se muestra a los desarrolladores. Este mensaje no es estable y puede cambiar, por lo que no debes compilar una lógica de análisis en torno a él.
  • status: Es un código de error canónico que identifica de forma programática el tipo de error (por ejemplo, INVALID_ARGUMENT, PERMISSION_DENIED). Tu lógica de control de errores debe basarse en este identificador estable.

En la siguiente tabla, se enumeran los errores más comunes que muestra la API y el curso de acción recomendado.

Estado HTTP Código de error canónico (status) Significado y causa común Acción recomendada ¿Se puede volver a intentar?
400 Solicitud incorrecta INVALID_ARGUMENT La solicitud estaba incorrecta. No volver a intentar. Inspecciona el campo de detalles en la respuesta de error para identificar la violación de campo específica. Corrige la carga útil de la solicitud y vuelve a enviarla. No
401 Sin autorización UNAUTHENTICATED Falta el token de acceso, expiró o no es válido. No volver a intentar de inmediato. Asegúrate de usar el token o la clave de acceso correctos. No
403 Prohibido PERMISSION_DENIED Estás autenticado, pero tu proyecto no tiene permiso para acceder a la API. La causa más común es que no habilitaste la API en tu proyecto de Google Cloud. No volver a intentar. Verifica que estés usando el ID del proyecto correcto y que la API esté habilitada. No
429 Demasiadas solicitudes RESOURCE_EXHAUSTED Superaste la cuota de API para tu proyecto. Deja de enviar solicitudes y vuelve a intentarlo después de un tiempo. Verifica las cuotas de tu proyecto en la consola de Google Cloud.
500 Error interno del servidor INTERNAL Se produjo un error inesperado en los servidores de Google. Es probable que se trate de un problema transitorio. Vuelve a intentar la solicitud con una estrategia de retirada exponencial. Si el error persiste, comunícate con el equipo de asistencia.
503 Servicio no disponible UNAVAILABLE El servicio no está disponible temporalmente. Vuelve a intentar la solicitud con una estrategia de retirada exponencial.

Límites de cuota

Las cuotas de uso se aplican por proyecto para garantizar la confiabilidad del servicio.

Método de la API Límite predeterminado (por proyecto) Notas
CheckPackageRegistrationStatus 1,000 solicitudes por día Los llamadores deben administrar el límite de frecuencia interno para evitar el abuso.

Supervisa el uso

Puedes supervisar el uso actual de la API de tu proyecto y ver qué tan cerca estás de los límites de cuota directamente en la consola de Google Cloud.

  1. Navega a la página APIs y servicios > Panel.
  2. Selecciona la API de Android Developer ID Status.
  3. Haz clic en la pestaña Cuotas.

Este panel proporciona un desglose detallado del volumen de solicitudes a lo largo del tiempo.