Autorrelleno de OTP por SMS: formatos para Android, iOS y web
Cómo funciona el autorrelleno de OTP en Android, iOS y la web: hash de SMS Retriever, códigos vinculados al dominio, WebOTP, un solo formato de SMS y WhatsApp.
Por OmniChannels.ai Editorial Team · Revisado por BroadNet Messaging Solutions Team
Integración
Respuesta breve
El autorrelleno de OTP usa tres mecanismos distintos. Android emplea la API SMS Retriever, con un hash de la app de 11 caracteres en un mensaje de 140 bytes como máximo, o la API SMS User Consent, sin hash. iOS ofrece los códigos a partir del propio SMS, y los vinculados al dominio terminan con una línea como @example.com #123456. Los sitios web usan autocomplete="one-time-code" y la API WebOTP, que leen esa última línea.
En esta página
- ¿Cómo funciona el autorrelleno de OTP en cada plataforma?
- ¿Cómo funciona la API SMS Retriever de Android?
- ¿Cómo autorrellenan un código iOS y iPadOS?
- ¿Cómo funciona el autorrelleno de OTP en la web?
- ¿Puede un solo SMS funcionar en Android, iOS y la web?
- ¿Qué ocurre con el árabe y el texto Unicode?
- ¿Cómo gestionan el autorrelleno las plantillas de autenticación de WhatsApp?
- Ejemplo práctico: el inicio de sesión de una app de transporte con conductor
- ¿Cuáles son los errores habituales?
- Cómo ayuda OmniChannels.ai
Puntos clave
- Android tiene dos API: SMS Retriever (mensaje de 140 bytes como máximo con un código de un solo uso y un hash de la app de 11 caracteres) y SMS User Consent (el usuario aprueba compartir un mensaje).
- En iOS, configure el campo con el tipo de contenido one-time-code; los códigos vinculados al dominio terminan con una última línea con @dominio, un espacio y #código, compatible desde iOS 14.
- En la web, añada autocomplete="one-time-code" al campo y llame a navigator.credentials.get con el transporte sms para Chrome en Android; Safari usa el atributo.
- Un solo mensaje puede servir para las tres plataformas si el hash de la app va encima de una última línea @dominio #código, pero pruébelo en dispositivos y operadores reales.
- Las plantillas de autenticación de WhatsApp ofrecen los botones copiar código, one-tap y zero-tap; zero-tap solo existe en Android.
Esta guía es para desarrolladores y responsables de producto que quieren que un código de verificación se rellene solo en Android, iPhone y la web. Explica qué exige cada plataforma al SMS, cómo redactar un único mensaje válido para las tres, cómo gestionan el autorrelleno las plantillas de autenticación de WhatsApp y qué suele fallar.
¿Cómo funciona el autorrelleno de OTP en cada plataforma?
Cada plataforma lee el SMS a su manera, así que no existe un interruptor único. Android necesita un hash de la app o el consentimiento del usuario, iOS detecta los códigos por sí mismo y los navegadores leen una última línea con formato.
| Plataforma | Mecanismo | Qué necesita el SMS | Acción del usuario |
|---|---|---|---|
| App de Android | API SMS Retriever | 140 bytes como máximo, un código de un solo uso y un hash de la app de 11 caracteres | Ninguna |
| App de Android | API SMS User Consent | Un mensaje con un código de un solo uso | Aprueba compartir un mensaje |
| App de iOS y iPadOS | Autorrelleno de códigos de seguridad | Un código que iOS pueda detectar; se recomienda el formato vinculado al dominio | Toca la sugerencia |
| Web (Safari) | autocomplete="one-time-code" |
Última línea vinculada al dominio | Toca la sugerencia |
| Web (Chrome en Android) | API WebOTP | Última línea @host #código |
Confirma el aviso |
Todo esto solo sirve si su SMS llega. Si no llega, consulte OTP no recibido.
¿Cómo funciona la API SMS Retriever de Android?
Su app pide a Google Play services que escuche un único mensaje, y ese mensaje lleva un hash que identifica a su app. No hace falta ningún permiso adicional de la app.
La documentación de Google enumera tres requisitos para el mensaje de verificación. Debe:
- no superar los 140 bytes;
- contener un código de un solo uso que su app devuelve a su servidor para completar la verificación;
- incluir una cadena hash de 11 caracteres que identifique a su app.
Todo lo demás del mensaje es libre. El flujo es: la app inicia la API mientras solicita el SMS, su servidor envía el mensaje, Play services lo dirige a su app, y la app extrae el código y lo devuelve a su servidor para validarlo. Su servidor debe comprobar además que el código es válido y no ha caducado.
¿Cómo obtengo el hash de 11 caracteres?
Google indica que el hash son los primeros 11 caracteres de un hash codificado en base64. Se calcula a partir del certificado de firma de su app, con los pasos de keytool de la documentación de Google. Si Google Play gestiona la firma de su app, importe ese certificado para el cálculo. Si firma usted directamente, use su keystore de producción y el alias del certificado.
Como el hash depende del certificado de firma, una compilación firmada con otra clave tendrá un hash distinto. Téngalo en cuenta al probar compilaciones de depuración con mensajes de producción, y confirme el hash de cada configuración de firma que publique.
¿Y si prefiero no gestionar un hash?
Use la API SMS User Consent. Según la documentación de Google, se pregunta al usuario antes de compartir un mensaje y entonces todo el mensaje queda disponible para su app, que extrae el código. Según la página de Google, el mensaje debe contener una cadena alfanumérica de 4 a 10 caracteres con al menos un número, el receptor escucha durante cinco minutos y, opcionalmente, puede limitarse a un remitente. Inicie la API antes de que llegue el SMS: los mensajes recibidos antes no se reenvían.
¿Cómo autorrellenan un código iOS y iPadOS?
iOS detecta un SMS que contiene un código de un solo uso y lo ofrece en los campos que se declaran como campos de código. Apple documenta dos pasos por su parte.
- Defina el tipo de contenido del campo. En UIKit, asigne
.oneTimeCodeatextContentType. En SwiftUI, use el modificadortextContentTypecon el mismo valor. En un sitio web, añadaautocomplete="one-time-code"al campo. - De forma opcional, vincule el código a su dominio. Desde iOS 14 y macOS Big Sur, Apple permite dar formato al SMS para que el autorrelleno sugiera el código solo cuando coincida el sitio de Safari o el dominio asociado de la app. Así es más difícil engañar a alguien para que introduzca un código en un sitio de phishing.
El formato, tal como lo documenta Apple: primero cualquier texto, después una última línea con su dominio precedido de @, un espacio y el código precedido de #.
Your Example code is 123456.
@example.com #123456
En una app, añada el dominio vinculado a los dominios asociados de la app, o el autorrelleno no lo sugerirá. Los códigos estándar sin vinculación se siguen detectando, pero Apple recomienda el formato vinculado al dominio.
¿Cómo funciona el autorrelleno de OTP en la web?
Añada primero el atributo y después el JavaScript para los navegadores que lo admitan.
<input type="text" inputmode="numeric"
autocomplete="one-time-code" name="otp" />
La documentación de Chrome recomienda el atributo por compatibilidad entre navegadores, y señala que Safari lo usa para sugerir el código de un SMS con el formato correcto aunque no tenga la API de JavaScript WebOTP.
Para Chrome en Android, llame a WebOTP con el transporte sms. La API requiere un origen seguro (HTTPS), y un AbortController permite cancelar la solicitud pendiente si el usuario escribe el código a mano.
if ("OTPCredential" in window) {
const ac = new AbortController();
const form = document.querySelector("form");
const input = document.querySelector("input[autocomplete=one-time-code]");
form.addEventListener("submit", () => ac.abort());
navigator.credentials
.get({ otp: { transport: ["sms"] }, signal: ac.signal })
.then((otp) => {
input.value = otp.code;
form.submit();
})
.catch(() => {}); // user dismissed, or no matching SMS
}
El SMS debe seguir el formato vinculado al origen de la especificación WICG y la guía de Chrome: un código de cuatro a diez caracteres alfanuméricos con al menos un número antes de la última línea, y una última línea que empieza por @, el host, un solo espacio y # más el código. El host no debe contener espacios en blanco.
¿Puede un solo SMS funcionar en Android, iOS y la web?
A menudo sí, porque las reglas son compatibles. Ponga primero el texto legible, el hash de Android en una línea por encima del final y la línea vinculada al dominio en último lugar. Esta disposición se deduce de las reglas documentadas, no es una garantía de ningún proveedor: pruébela.
Your Example code is 483921. Do not share it.
Ab3dE+9xYz1
@example.com #483921
Por qué este orden: Apple y la especificación web piden el dominio y el código en la última línea. Google exige el hash de 11 caracteres en algún lugar del mensaje pero, en la página que consultamos, no fija su posición. El ejemplo anterior ocupa 78 bytes en caracteres latinos simples, muy por debajo del límite de 140 bytes.
Lista de comprobación antes de publicar:
- El código es un único elemento, claramente separado de otros dígitos del texto.
- El dominio de la última línea coincide con el sitio y con el dominio asociado de la app.
- La longitud total está dentro de los 140 bytes en la variante Retriever.
- El hash corresponde a la clave de firma de la compilación que se prueba.
- Probado en un móvil de cada plataforma, con los operadores por los que realmente envía.
¿Qué ocurre con el árabe y el texto Unicode?
Mantenga el código y las dos partes legibles por máquina en texto simple. El límite de Google está en bytes, y un SMS Unicode admite muchos menos caracteres que uno GSM-7: 70 frente a 160 en un solo segmento (consulte límites de caracteres del SMS y Unicode). Una frase en árabe consume enseguida el margen, y un solo carácter fuera de GSM convierte todo el mensaje a Unicode.
Enfoque seguro: el código en dígitos latinos, @dominio #código en ASCII y el texto en árabe breve. No hemos encontrado documentación oficial que describa el autorrelleno de códigos escritos con otros sistemas de dígitos, así que no lo tratamos y recomendamos probar antes de usarlo.
¿Cómo gestionan el autorrelleno las plantillas de autenticación de WhatsApp?
Las plantillas de autenticación de Meta incluyen tres estilos de botón, cada uno con un texto de cuerpo fijo con la forma <code> is your verification code.
| Botón | Qué hace | Notas |
|---|---|---|
| Copiar código | El usuario toca para copiar el código y luego lo pega en su app | Funciona sin cambios en la app |
| Autorrelleno one-tap | En Android, un botón abre su app y le entrega el código | Requiere package_name y signature_hash en supported_apps |
| Zero-tap | Sin botón; el cliente de WhatsApp difunde el código a su app | Solo Android; debe aceptar los términos zero-tap de Meta |
La documentación de Meta señala también que, en iOS 26 y posteriores, las sugerencias del teclado ofrecen autorrelleno sin integración, y que los usuarios de plataformas sin zero-tap reciben un botón de copiar código. Puede fijar una caducidad con code_expiration_minutes, y la API de vista previa acepta valores de 1 a 90 minutos. Compare los canales en OTP por WhatsApp frente a OTP por SMS.
Ejemplo práctico: el inicio de sesión de una app de transporte con conductor
«Qafila Rides» (ficticia) tiene una app de Android, una app de iOS y un sitio móvil en qafila.example.
- La app de Android inicia SMS Retriever cuando el usuario toca «Enviar código».
- El backend genera un código de seis dígitos, válido unos minutos, y envía el mensaje de tres líneas anterior mediante la API de SMS.
- Android entrega el mensaje a la app. iOS ofrece el código sobre el teclado. En el sitio móvil, Safari lo sugiere y Chrome lo rellena mediante WebOTP.
- El servidor valida el código una sola vez, rechaza la reutilización y los códigos caducados, y limita la frecuencia de las solicitudes.
- Si el SMS no se confirma en un tiempo breve, el backend ofrece una plantilla de autenticación de WhatsApp como segunda vía.
¿Cuáles son los errores habituales?
- Código que no va solo. Otros números (teléfono, precio, fecha) junto al código confunden la detección. Un código por mensaje.
- Hash incorrecto. El hash sigue al certificado de firma. Un hash de una clave de depuración no coincidirá con una compilación de producción.
- Dominio que no coincide.
@example.comdebe coincidir con el sitio o el dominio asociado; si no, iOS y WebOTP no ofrecerán el código. - Última línea rota. Cualquier cosa después de
#código, un espacio ausente o un espacio en blanco dentro del dominio rompen el formato. - Mensaje demasiado largo o con mucho Unicode, que supera el límite de 140 bytes de Retriever.
- Escuchar demasiado tarde. La API User Consent ignora los mensajes recibidos antes de iniciarse.
- Usar el autorrelleno como seguridad. El autorrelleno es comodidad. Valide siempre en el servidor, haga caducar los códigos, limite los intentos y vigile el fraude de SMS pumping.
- Alcance. Esta guía recoge el comportamiento documentado en el momento de redactarla. Las reglas de las plataformas cambian, así que revise las fuentes enlazadas antes de publicar.
Para la redacción de los mensajes y la elección de la caducidad, consulte nuestra guía de mensajes OTP y de autenticación.
Cómo ayuda OmniChannels.ai
OmniChannels.ai envía OTP por SMS y WhatsApp mediante la conectividad directa con operadores de BroadNet, de modo que usted controla el texto exacto del mensaje del que depende su formato de autorrelleno. Las plantillas de WhatsApp cubren la autenticación con copiar código, one-tap y zero-tap. La conmutación entre canales, por ejemplo WhatsApp y después SMS, se configura por caso de uso, y los estados de entrega llegan en un único formato de webhook. Consulte la documentación de la API de SMS, la documentación de la API de WhatsApp y la solución OTP.
Preguntas frecuentes
¿Cuál es el formato de mensaje de la API SMS Retriever?
La documentación de Google indica que el mensaje no debe superar los 140 bytes, debe contener un código de un solo uso que su app devuelve a su servidor e incluir un hash de 11 caracteres que identifica su app. Lo demás es libre. El hash permite a Google Play services encaminar el mensaje a la app correcta sin permisos adicionales.
¿Necesito un hash de la app para la API SMS User Consent?
La descripción de Google de la API SMS User Consent no menciona ningún hash de la app. En su lugar, el usuario ve un aviso y decide si comparte el mensaje con su app. Su app debe empezar a escuchar antes de que llegue el SMS y después extrae el código del propio texto del mensaje.
¿Qué es un código SMS vinculado al dominio en iOS?
Es un SMS cuya última línea vincula el código a su dominio: el dominio precedido de @, un espacio y el código precedido de #. Apple lo documenta para iOS 14 y posteriores. El autorrelleno solo sugiere el código si el sitio abierto en Safari, o un dominio asociado de la app, coincide con el dominio del mensaje.
¿Cómo lee WebOTP el SMS?
La página llama a navigator.credentials.get con la opción otp y el transporte sms. Cuando llega un mensaje cuya última línea es @host #código y el host coincide con el origen de la página, el navegador pide confirmación al usuario y devuelve el código. Requiere HTTPS, y Chrome en Android es el navegador documentado.
¿Por qué no se autorrellena mi OTP?
Las causas habituales son un código que no se identifica con claridad, un hash de la app incorrecto o ausente en Android, una última línea que no sigue el formato @dominio #código, un dominio que no coincide con la página o un texto que supera el límite de bytes. Compruebe cada punto con las reglas de formato y pruebe después con un móvil real.
¿Admite WhatsApp el autorrelleno de OTP?
Sí. Las plantillas de autenticación de Meta admiten un botón de copiar código, un botón de autorrelleno one-tap y una opción zero-tap. One-tap y zero-tap requieren el nombre del paquete y el hash de firma de su app Android. Zero-tap solo funciona en Android; los usuarios de otras plataformas reciben un botón de copiar código.
Fuentes
- SMS Retriever API: perform SMS verification — Google for Developers
- SMS User Consent API: request a one-time code — Google for Developers
- Enabling AutoFill for domain-bound SMS codes — Apple Developer
- Verify phone numbers on the web with the WebOTP API — Chrome for Developers
- WebOTP API — WICG specification
- Authentication templates — WhatsApp Business Platform, Meta for Developers
Siga leyendo
Más guíasIntegración
Formato E.164 de números de teléfono: conversión y validación
Formato E.164 explicado: reglas, cómo convertir números locales con una tabla de ejemplos, requisitos de las API de WhatsApp y SMS, regex y libphonenumber.
9 min de lectura
Integración
Enviar SMS por API: ejemplos en Python, Node.js, PHP y cURL
Envíe SMS por API en Python, Node.js, PHP y cURL: envíos individuales y masivos, Unicode y árabe, conteo de segmentos, webhooks de entrega y errores.
10 min de lectura
WhatsApp
OTP por WhatsApp o por SMS: costo, entrega y respaldo
OTP por WhatsApp o por SMS: modelo de costos, entrega, experiencia de usuario, plantillas de autenticación, respaldo a SMS y controles contra el fraude.
10 min de lectura
