Autopreenchimento de OTP por SMS: Android, iOS e Web
Como funciona o autopreenchimento de OTP no Android, iOS e web: hash do SMS Retriever, códigos vinculados ao domínio, WebOTP, formato único e WhatsApp.
Por OmniChannels.ai Editorial Team · Revisado por BroadNet Messaging Solutions Team
Integração
Resposta curta
O autopreenchimento de OTP combina três mecanismos distintos. Apps Android usam a SMS Retriever API, que exige um hash do app de 11 caracteres em uma mensagem de até 140 bytes, ou a SMS User Consent API, que dispensa o hash. O iOS sugere códigos a partir do próprio SMS, e códigos vinculados ao domínio terminam com uma linha como @example.com #123456. Sites usam autocomplete="one-time-code" e a WebOTP API, que leem essa mesma última linha.
Nesta página
- Como funciona o autopreenchimento de OTP em cada plataforma?
- Como funciona a SMS Retriever API do Android?
- Como o iOS e o iPadOS preenchem um código automaticamente?
- Como funciona o autopreenchimento de OTP na web?
- Um único SMS funciona no Android, no iOS e na web?
- E com texto em árabe e Unicode?
- Como os templates de autenticação do WhatsApp tratam o autopreenchimento?
- Exemplo prático: login em um app de transporte por aplicativo
- Quais são os erros mais comuns?
- Como a OmniChannels.ai ajuda
Pontos principais
- O Android tem duas APIs: SMS Retriever (mensagem de até 140 bytes com um código de uso único e um hash do app de 11 caracteres) e SMS User Consent (o usuário aprova o compartilhamento de uma mensagem).
- No iOS, defina o campo com o tipo de conteúdo one-time-code; códigos vinculados ao domínio terminam com uma última linha com @domínio, um espaço e #código, com suporte a partir do iOS 14.
- Na web, adicione autocomplete="one-time-code" ao input e chame navigator.credentials.get com o transporte sms no Chrome para Android; o Safari usa o atributo.
- Uma única mensagem pode atender aos três se o hash do app ficar acima de uma última linha com @domínio #código, mas teste em aparelhos e operadoras reais.
- Os templates de autenticação do WhatsApp oferecem os botões copiar código, um toque e zero toque; o zero toque é exclusivo do Android.
Este guia é para desenvolvedores e donos de produto que querem que o código de verificação seja preenchido sozinho no Android, no iPhone e na web. Ele explica o que cada plataforma exige do SMS, como escrever uma única mensagem que sirva às três, como os templates de autenticação do WhatsApp tratam o autopreenchimento e o que costuma dar errado.
Como funciona o autopreenchimento de OTP em cada plataforma?
Cada plataforma lê o SMS de um jeito, então não existe um único interruptor. O Android exige um hash do app ou o consentimento do usuário, o iOS detecta os códigos por conta própria e os navegadores leem uma última linha formatada.
| Plataforma | Mecanismo | O que o SMS precisa ter | Ação do usuário |
|---|---|---|---|
| App Android | SMS Retriever API | Até 140 bytes, um código de uso único e um hash do app de 11 caracteres | Nenhuma |
| App Android | SMS User Consent API | Uma mensagem com um código de uso único | Aprova o compartilhamento de uma mensagem |
| App iOS e iPadOS | Preenchimento automático de código de segurança | Um código que o iOS consiga detectar; formato vinculado ao domínio recomendado | Toca na sugestão |
| Web (Safari) | autocomplete="one-time-code" |
Última linha vinculada ao domínio | Toca na sugestão |
| Web (Chrome para Android) | WebOTP API | Última linha @host #code |
Confirma o aviso |
Tudo isso só ajuda se o SMS chegar. Se ele não chegar, veja OTP não recebido.
Como funciona a SMS Retriever API do Android?
Seu app pede ao Google Play Services que escute uma mensagem, e essa mensagem traz um hash que identifica o app. Não é preciso nenhuma permissão extra no app.
A documentação do Google lista três requisitos para a mensagem de verificação. Ela deve:
- ter no máximo 140 bytes;
- conter um código de uso único que o app devolve ao seu servidor para concluir a verificação;
- incluir uma string de hash de 11 caracteres que identifica o app.
Todo o resto da mensagem fica a seu critério. O fluxo é: o app inicia a API enquanto solicita o SMS, o seu servidor envia a mensagem, o Play Services a encaminha ao app, e o app extrai o código e o devolve ao servidor para validação. O servidor também deve verificar se o código é válido e não expirou.
Como obtenho o hash de 11 caracteres?
O Google informa que o hash são os 11 primeiros caracteres de um hash codificado em base64. Ele é calculado a partir do certificado de assinatura do app, seguindo os passos com keytool da documentação do Google. Se o Google Play gerencia a assinatura do app, importe esse certificado para o cálculo. Se você assina diretamente, use o keystore e o alias de certificado de produção.
Como o hash depende do certificado de assinatura, uma build assinada com outra chave terá outro hash. Considere isso ao testar builds de debug com mensagens de produção e confirme o hash de cada configuração de assinatura que você publicar.
E se eu preferir não gerenciar um hash?
Use a SMS User Consent API. A documentação do Google diz que o usuário é consultado antes de uma mensagem ser compartilhada, e a mensagem inteira passa a ficar disponível para o app, que extrai o código. Segundo a página do Google, a mensagem deve conter uma sequência alfanumérica de 4 a 10 caracteres com pelo menos um número, o listener cobre cinco minutos e você pode, opcionalmente, restringir a um remetente. Inicie a API antes de o SMS chegar: mensagens recebidas antes não são encaminhadas.
Como o iOS e o iPadOS preenchem um código automaticamente?
O iOS detecta um SMS com um código de uso único e o oferece em campos que se declaram como campos de código. A Apple documenta dois passos para você.
- Defina o tipo de conteúdo do campo. No UIKit, defina
textContentTypecomo.oneTimeCode. No SwiftUI, use o modificadortextContentTypecom o mesmo valor. Em um site, definaautocomplete="one-time-code"no input. - Se quiser, vincule o código ao seu domínio. A partir do iOS 14 e do macOS Big Sur, a Apple permite formatar o SMS para que o preenchimento automático sugira o código apenas quando o site no Safari ou o domínio associado do app corresponder. Isso dificulta enganar alguém para digitar um código em um site de phishing.
O formato, como a Apple o documenta: qualquer texto primeiro e, depois, uma última linha com o seu domínio precedido de @, um espaço e o código precedido de #.
Your Example code is 123456.
@example.com #123456
Em um app, adicione o domínio vinculado aos domínios associados do app, ou o preenchimento automático não vai sugerir o código. Códigos padrão sem vínculo continuam sendo detectados, mas a Apple recomenda o formato vinculado ao domínio.
Como funciona o autopreenchimento de OTP na web?
Adicione primeiro o atributo e depois o JavaScript para os navegadores que o suportam.
<input type="text" inputmode="numeric"
autocomplete="one-time-code" name="otp" />
A documentação do Chrome recomenda o atributo para compatibilidade entre navegadores e diz que o Safari o usa para sugerir o código de um SMS formatado corretamente, embora não tenha a API JavaScript WebOTP.
No Chrome para Android, chame o WebOTP com o transporte sms. A API exige uma origem segura (HTTPS), e um AbortController permite cancelar a solicitação pendente se o usuário digitar o código manualmente.
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
}
O SMS deve seguir o formato vinculado à origem da especificação WICG e do guia do Chrome: um código de quatro a dez caracteres alfanuméricos com pelo menos um número antes da última linha e, depois, uma última linha que começa com @, o host, um único espaço e # mais o código. O host não pode conter espaços em branco.
Um único SMS funciona no Android, no iOS e na web?
Muitas vezes sim, porque as regras são compatíveis. Coloque o texto legível primeiro, o hash do Android em uma linha acima do final e a linha vinculada ao domínio por último. Esse layout foi montado a partir das regras documentadas, não é uma garantia dos fornecedores, então teste.
Your Example code is 483921. Do not share it.
Ab3dE+9xYz1
@example.com #483921
Por que essa ordem: a Apple e a especificação web querem o domínio e o código na última linha. O Google exige o hash de 11 caracteres em algum ponto da mensagem, mas, na página que verificamos, não fixa a posição. O exemplo acima tem 78 bytes em caracteres latinos simples, bem dentro do limite de 140 bytes.
Checklist antes de publicar:
- O código é um único token, bem separado dos demais números do texto.
- O domínio da última linha corresponde ao site e ao domínio associado do app.
- O tamanho total fica dentro de 140 bytes na variante com Retriever.
- O hash corresponde à chave de assinatura da build em teste.
- Teste feito em um aparelho de cada plataforma, nas operadoras pelas quais você realmente envia.
E com texto em árabe e Unicode?
Mantenha o código e as duas partes legíveis por máquina em texto simples. O limite do Google é em bytes, e um SMS Unicode comporta bem menos caracteres que um GSM-7: 70 contra 160 em um único segmento (veja limites de caracteres do SMS e Unicode). Uma frase em árabe consome o orçamento rapidamente, e um único caractere fora do GSM converte a mensagem inteira para Unicode.
Abordagem segura: mantenha o código em dígitos latinos, @domínio #código em ASCII e o texto em árabe curto. Não encontramos documentação oficial sobre o autopreenchimento de códigos escritos em outros sistemas de dígitos, por isso deixamos esse ponto de fora e recomendamos testar antes de usar.
Como os templates de autenticação do WhatsApp tratam o autopreenchimento?
Os templates de autenticação da Meta vêm com três estilos de botão, cada um com um texto de corpo fixo no formato <code> is your verification code.
| Botão | O que faz | Observações |
|---|---|---|
| Copiar código | O usuário toca para copiar o código e depois o cola no app | Funciona sem mudanças no app |
| Autopreenchimento com um toque | No Android, um botão abre o app e entrega o código | Exige package_name e signature_hash em supported_apps |
| Zero toque | Sem botão; o cliente do WhatsApp transmite o código ao app | Somente Android; é preciso aceitar os termos de zero toque da Meta |
A documentação da Meta também observa que, no iOS 26 e posteriores, as sugestões do teclado oferecem o autopreenchimento sem integração, e que usuários de plataformas sem zero toque recebem um botão de copiar código. Você pode definir uma expiração com code_expiration_minutes, e a API de prévia aceita valores de 1 a 90 minutos. Compare os canais em OTP por WhatsApp vs OTP por SMS.
Exemplo prático: login em um app de transporte por aplicativo
A "Qafila Rides" (fictícia) tem um app Android, um app iOS e um site móvel em qafila.example.
- O app Android inicia o SMS Retriever quando o usuário toca em "Enviar código".
- O backend gera um código de seis dígitos, válido por alguns minutos, e envia a mensagem de três linhas acima pela API de SMS.
- O Android entrega a mensagem ao app. O iOS oferece o código acima do teclado. No site móvel, o Safari o sugere e o Chrome o preenche via WebOTP.
- O servidor valida o código uma única vez, rejeita reutilização e códigos expirados, e limita a taxa de solicitações.
- Se o SMS não for confirmado em um curto intervalo, o backend oferece um template de autenticação do WhatsApp como segundo caminho.
Quais são os erros mais comuns?
- Código misturado com outros números. Números extras (telefone, preço, data) ao lado do código confundem a detecção. Use um código por mensagem.
- Hash errado. O hash acompanha o certificado de assinatura. Um hash de uma chave de debug não corresponde a uma build de produção.
- Domínio diferente.
@example.comdeve corresponder ao site ou ao domínio associado; caso contrário, o iOS e o WebOTP não oferecem o código. - Última linha quebrada. Qualquer coisa depois de
#code, um espaço faltando ou espaços em branco dentro do domínio quebram o formato. - Mensagem longa demais ou carregada de Unicode, o que ultrapassa o limite de 140 bytes do Retriever.
- Escutar tarde demais. A User Consent API ignora mensagens recebidas antes de ser iniciada.
- Usar o autopreenchimento como segurança. O autopreenchimento é uma conveniência. Continue validando no servidor, expirando os códigos e limitando as tentativas, e fique atento à fraude de SMS pumping.
- Escopo. Este guia cobre o comportamento documentado no momento da redação. As regras das plataformas mudam, então confira as fontes linkadas antes do lançamento.
Para a redação da mensagem e a escolha da expiração, veja nosso guia de mensagens de OTP e autenticação.
Como a OmniChannels.ai ajuda
A OmniChannels.ai envia OTP por SMS e WhatsApp pela conectividade direta com operadoras da BroadNet, para que você controle o texto exato da mensagem de que o seu formato de autopreenchimento depende. Os templates do WhatsApp cobrem a autenticação com copiar código, um toque e zero toque. O fallback entre canais, por exemplo WhatsApp e depois SMS, é configurado por caso de uso, e os status de entrega chegam em um único formato de webhook. Veja a documentação da API de SMS, a documentação da API do WhatsApp e a solução de OTP.
Perguntas frequentes
Qual é o formato de mensagem da SMS Retriever API?
A documentação do Google diz que a mensagem não pode ter mais de 140 bytes, deve conter um código de uso único que o app devolve ao seu servidor e incluir um hash de 11 caracteres que identifica o app. O restante do conteúdo é livre. O hash permite que o Google Play Services encaminhe a mensagem ao app certo sem permissões extras.
Preciso de um hash do app para a SMS User Consent API?
A visão geral do Google sobre a SMS User Consent API não descreve um hash do app. Em vez disso, o usuário vê um aviso e decide se compartilha a mensagem com o seu app. O app precisa começar a escutar antes de o SMS chegar e depois extrai o código do próprio texto da mensagem.
O que é um código SMS vinculado ao domínio no iOS?
É um SMS cuja última linha vincula o código ao seu domínio: o domínio precedido de @, um espaço e o código precedido de #. A Apple documenta o recurso a partir do iOS 14. O preenchimento automático só sugere o código quando o site aberto no Safari, ou um domínio associado do app, corresponde ao domínio da mensagem.
Como o WebOTP lê o SMS?
A página chama navigator.credentials.get com a opção otp e o transporte sms. Quando chega uma mensagem cuja última linha é @host #código e o host corresponde à origem da página, o navegador pede confirmação ao usuário e devolve o código. É preciso HTTPS, e o navegador documentado é o Chrome para Android.
Por que o meu OTP não é preenchido automaticamente?
As causas mais comuns são um código que não se identifica com clareza, um hash do app errado ou ausente no Android, uma última linha fora do formato @domínio #código, um domínio diferente do da página ou um texto que ultrapassa o limite de bytes. Confira cada ponto com as regras de formato e teste em um aparelho real.
O WhatsApp oferece autopreenchimento de OTP?
Sim. Os templates de autenticação da Meta aceitam um botão de copiar código, um botão de autopreenchimento com um toque e a opção de zero toque. Um toque e zero toque exigem o nome do pacote Android e o hash de assinatura. O zero toque só funciona no Android; em outras plataformas o usuário recebe o botão de copiar código.
Fontes
- 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
Continue lendo
Mais guiasIntegração
Formato E.164 de telefone: como converter e validar números
Formato E.164 de telefone: regras, como converter números locais com tabela de exemplos, exigências das APIs de WhatsApp e SMS, regex e libphonenumber.
9 min de leitura
Integração
Enviar SMS por API: exemplos em Python, Node.js, PHP e cURL
Envie SMS por API em Python, Node.js, PHP e cURL: envio único e em massa, Unicode e árabe, contagem de segmentos, webhooks de entrega e tratamento de erros.
10 min de leitura
WhatsApp
OTP por WhatsApp vs OTP por SMS: custo, entrega e fallback
OTP por WhatsApp vs OTP por SMS: modelo de custo, entrega, experiência do usuário, templates de autenticação, fallback para SMS e controles de fraude.
10 min de leitura
