Usa la API de Android Developer Status para verificar si el nombre de un paquete de app para Android está registrado para 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 un paquete de app está registrado para 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 del paquete
- 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 del paquete | Verificar si ya se registró un nombre de paquete. Muestra REGISTERED si el nombre del 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 del paquete se registró con una huella digital del certificado diferente. |
CheckPackageRegistrationStatus |
En esta guía, se explica cómo completar las siguientes tareas:
- Configurar el acceso y la autenticación de la API de Google Cloud
- Verificar si un desarrollador verificado registró el nombre del paquete y el par de huellas digitales del certificado público SHA-256 de una app en el programa de verificación de desarrolladores de Android, ya sea con la huella digital del certificado público SHA-256 proporcionada o con una huella digital del certificado público SHA-256 diferente
- Administrar los estados de registro de la API en tu IDE o flujo de trabajo de la herramienta 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 del certificado SHA-256
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 del paquete de una app o el par de nombre del paquete y huella digital del certificado público SHA-256 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 están relacionados con él:
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
- Crea una cuenta de Google Cloud si no tienes una.
- Abre la consola de Google Cloud.
- Crea un proyecto de Google Cloud.
Habilita la API en tu proyecto
- En la consola de Google Cloud, ve a APIs y servicios > Biblioteca.
- Selecciona tu proyecto en el menú desplegable.
- Busca API de Android Developer ID Status.
- Haz clic en Habilitar.
Autenticar
La API admite credenciales de clave de API. Para obtener una clave de API, haz lo siguiente:
- En la consola de Google Cloud, navega a APIs y servicios > Credenciales.
- Haz clic en + Crear credenciales y selecciona Clave de API.
- 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 un paquete de app, realiza una solicitud GET autenticada que contenga el nombre del 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 del 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: Informa al desarrollador que el nombre del paquete ya está registrado.
Respuesta (no registrada):
Si no se registra el nombre del 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"
}
Verifica los pares de nombre de paquete y huella digital del certificado
Para verificar si el nombre de un paquete de app está registrado con una huella digital del certificado público SHA-256 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 del paquete está registrado con la huella digital del certificado público SHA-256 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"
}
Respuesta (registrada con una huella digital del certificado diferente):
Si el nombre del paquete está registrado con una huella digital del certificado SHA-256 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"
}
Respuesta (no registrada):
Si el nombre del paquete no está registrado con la huella digital del certificado público SHA-256 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"
}
Ejemplo de implementación en Java
En la siguiente clase de Java, se muestra cómo llamar a la API con el HttpClient estándar de Java 11.
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 DeveloperIdStatusClient {
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 = checkPackageRegistrationStatus(apiKey, packageName, certificateFingerprint);
System.out.println("Response: " + response);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
/**
* Checks the registration status of an Android package.
*
* @param apiKey The Google API key for authentication.
* @param packageName The fully-qualified Android package name (for example, "com.example.app").
* @param certificateFingerprint Optional SHA-256 certificate fingerprint. Pass null or empty to omit.
* @return The JSON response string from the API.
*/
public static String checkPackageRegistrationStatus(
String apiKey, String packageName, String certificateFingerprint)
throws IOException, InterruptedException {
// 1. Build the URL path (accepts dots directly)
// Format: /v1/packages/{package}/packageRegistrationStatus:check
String path = String.format("/v1/packages/%s/packageRegistrationStatus:check", packageName);
// 2. Build query parameters (only certificateFingerprint if provided)
StringBuilder queryBuilder = new StringBuilder();
if (certificateFingerprint != null && !certificateFingerprint.isEmpty()) {
queryBuilder.append("certificateFingerprint=")
.append(URLEncoder.encode(certificateFingerprint, StandardCharsets.UTF_8));
}
String fullUrl = API_ENDPOINT + path;
if (queryBuilder.length() > 0) {
fullUrl += "?" + queryBuilder.toString();
}
// 3. Create and send the HTTP GET request with API Key header
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, venció 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. | Sí |
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. | Sí |
503 Servicio no disponible |
UNAVAILABLE |
El servicio no está disponible temporalmente. | Vuelve a intentar la solicitud con una estrategia de retirada exponencial. | Sí |
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.
- Navega a la página APIs y servicios > Panel.
- Selecciona la API de Android Developer ID Status.
- Haz clic en la pestaña Cuotas.
Este panel proporciona un desglose detallado del volumen de solicitudes a lo largo del tiempo.