Etapa 1: Inscreva-se e faça login
- Vá para a inscrição na Central de Mensagens
- Crie sua conta gratuita
- Use seus créditos gratuitos para testar e brincar com OTPs
Etapa 2: Integração de API (desenvolvedores, montagem!)
Mantivemos as coisas super simples. Copie alguns trechos de código e você estará testando rapidamente.
Prefere assistir à codificação? Nosso guia de vídeo rápido tem tudo o que você precisa.
Parâmetro da API para verificar agora
Os parâmetros a seguir precisam ser enviados ao usar as APIs VerifyNow.
RCS/SAUTH
URLs de base da API Rest
Todos os endpoints da API da plataforma abaixo devem ser prefixados com o seguinte URL:
https://cpaas.messagecentral.comGerar token
Ao usar a API de verificação de SMS do Verify Now para enviar códigos de verificação por SMS, a chamada inicial deve ser para a API de geração de token.
Essa API retorna um token que deve ser incluído em todas as chamadas subsequentes. É necessário um token de autenticação para validar o usuário e deve ser incluído na seção de cabeçalho de cada solicitação.
Caminho do URL da solicitação:
/auth/v1/authentication/tokencURL
1curl --location 'https://cpaas.messagecentral.com/auth/v1/authentication/token?
2customerId=%3CCustomerId%3E&key=%3CBase64%20Encrypted%20password%3E&scope=NEW&country=91
3&email=test%40messagecentral.com' \
4--header 'accept: */*'
OBSERVAÇÃO: Para converter um comando cURL em código usando o Postman, abra o Postman, importe o comando cURL por meio do botão “Importar” e gere o código no idioma de sua preferência clicando no botão “Código” no lado direito da solicitação.
Resposta JSON
1{
2 "status": Integer,
3 "token": "String"
4}Exemplo de código
OkHttpClient client = new OkHttpClient().newBuilder()
.build();
MediaType mediaType = MediaType.parse("text/plain");
RequestBody body = RequestBody.create(mediaType, "");
Request request = new Request.Builder()
.url("https://cpaas.messagecentral.com/auth/v1/authentication/token?customerId=<CustomerId>&key=<Base64 Encrypted password>&scope=NEW&country=91&email=test@messagecentral.com")
.method("GET", body)
.addHeader("accept", "*/*")
.build();
Response response = client.newCall(request).execute();var request = require('request');
var options = {
'method': 'GET',
'url': 'https://cpaas.messagecentral.com/auth/v1/authentication/token?customerId=<CustomerId>&key=<Base64 Encrypted password>&scope=NEW&country=91&email=test@messagecentral.com',
'headers': {
'accept': '*/*'
}
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://cpaas.messagecentral.com/auth/v1/authentication/token?customerId=<CustomerId>&key=<Base64 Encrypted password>&scope=NEW&country=91&email=test@messagecentral.com');
$request->setMethod(HTTP_Request2::METHOD_GET);
$request->setConfig(array(
'follow_redirects' => TRUE
));
$request->setHeader(array(
'accept' => '*/*'
));
try {
$response = $request->send();
if ($response->getStatus() == 200) {
echo $response->getBody();
}
else {
echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
$response->getReasonPhrase();
}
}
catch(HTTP_Request2_Exception $e) {
echo 'Error: ' . $e->getMessage();
}import requests
url = "https://cpaas.messagecentral.com/auth/v1/authentication/token?customerId=<CustomerId>&key=<Base64 Encrypted password>&scope=NEW&country=91&email=test@messagecentral.com"
payload = {}
headers = {
'accept': '*/*'
}
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)
require "uri"
require "net/http"
url = URI("https://cpaas.messagecentral.com/auth/v1/authentication/token?customerId=<CustomerId>&key=<Base64 Encrypted password>&scope=NEW&country=91&email=test@messagecentral.com")
https = Net::HTTP.new(url.host, url.port)
https.use_ssl = true
request = Net::HTTP::Get.new(url)
request["accept"] = "*/*"
response = https.request(request)
puts response.read_body
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://cpaas.messagecentral.com/auth/v1/authentication/token?customerId=<CustomerId>&key=<Base64 Encrypted password>&scope=NEW&country=91&email=test@messagecentral.com");
request.Headers.Add("accept", "*/*");
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());Enviar OTP
Para enviar OTP em um número de celular, abaixo estão os parâmetros da solicitação. O token de autenticação é necessário para enviar o OTP, que é gerado pela API do token gerado (que você pode encontrar acima na seção Introdução).
Caminho do URL da solicitação:
Uma resposta bem-sucedida retornará um código de status 200.
/verification/v3/sendParâmetros do URL da solicitação:
cURL
1curl --location --request POST 'https://cpaas.messagecentral.com/verification/v3/send?
2countryCode=91&flowType=SMS&mobileNumber=9999999999' \
3--header 'authToken:
4eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJDLTMzNDMyQTVGNDIGNzQwNCI6ImIhdCI6MTcxMjExOTA0MCwiZXhwIjo'
OBSERVAÇÃO: Para converter um comando cURL em código usando o Postman, abra o Postman, importe o comando cURL por meio do botão “Importar” e gere o código no idioma de sua preferência clicando no botão “Código” no lado direito da solicitação. Você pode alterar o FlowType com base no canal de sua escolha.
Resposta JSON
1{
2 "responseCode": 200,
3 "message": "SUCCESS",
4 "data": {
5 "verificationId": "xxxx",
6 "mobileNumber": "xxxx",
7 "responseCode": "200",
8 "errorMessage": null,
9 "timeout": "60",
10 "smCLI": null,
11 "transactionId": "xxxx"
12 }
13}Exemplo de código
OkHttpClient client = new OkHttpClient().newBuilder()
.build();
MediaType mediaType = MediaType.parse("text/plain");
RequestBody body = RequestBody.create(mediaType, "");
Request request = new Request.Builder()
.url("https://cpaas.messagecentral.com/verification/v3/send?countryCode=91&flowType=SMS&mobileNumber=9999999999")
.method("POST", body)
.addHeader("authToken", "eyJhbGciOiJIUzUxMiJ9.eyJzdWOiJDLTMzNDMyQTVGNDlGNzQwNCIsImlhdCI6MTcxMjExOTA0MCwiZXhw")
.build();
Response response = client.newCall(request).execute();
var request = require('request');
var options = {
'method': 'POST',
'url': 'https://cpaas.messagecentral.com/verification/v3/send?countryCode=91&flowType=SMS&mobileNumber=9999999999',
'headers': {
'authToken': 'eyJhbGciOiJIUzUxMiJ9.eyJzdWOiJDLTMzNDMyQTVGNDlGNzQwNCIsImlhdCI6MTcxMjExOTA0MCwiZXhw'
}
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://cpaas.messagecentral.com/verification/v3/send?countryCode=91&flowType=SMS&mobileNumber=9999999999');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
'follow_redirects' => TRUE
));
$request->setHeader(array(
'authToken' => 'eyJhbGciOiJIUzUxMiJ9.eyJzdWOiJDLTMzNDMyQTVGNDlGNzQwNCIsImlhdCI6MTcxMjExOTA0MCwiZXhw'
));
try {
$response = $request->send();
if ($response->getStatus() == 200) {
echo $response->getBody();
}
else {
echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
$response->getReasonPhrase();
}
}
catch(HTTP_Request2_Exception $e) {
echo 'Error: ' . $e->getMessage();
}import requests
url = "https://cpaas.messagecentral.com/verification/v3/send?countryCode=91&flowType=SMS&mobileNumber=9999999999"
payload = {}
headers = {
'authToken': 'eyJhbGciOiJIUzUxMiJ9.eyJzdWOiJDLTMzNDMyQTVGNDlGNzQwNCIsImlhdCI6MTcxMjExOTA0MCwiZXhw'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)require "uri"
require "net/http"
url = URI("https://cpaas.messagecentral.com/verification/v3/send?countryCode=91&flowType=SMS&mobileNumber=9999999999")
https = Net::HTTP.new(url.host, url.port)
https.use_ssl = true
request = Net::HTTP::Post.new(url)
request["authToken"] = "eyJhbGciOiJIUzUxMiJ9.eyJzdWOiJDLTMzNDMyQTVGNDlGNzQwNCIsImlhdCI6MTcxMjExOTA0MCwiZXhw"
response = https.request(request)
puts response.read_bodyvar client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, "https://cpaas.messagecentral.com/verification/v3/send?countryCode=91&flowType=SMS&mobileNumber=9999999999");
request.Headers.Add("authToken", "eyJhbGciOiJIUzUxMiJ9.eyJzdWOiJDLTMzNDMyQTVGNDlGNzQwNCIsImlhdCI6MTcxMjExOTA0MCwiZXhw");
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());Validar OTP
O método validateOTP é um endpoint da API REST para validar uma senha de uso único (OTP) para clientes.
Caminho do URL da solicitação:
Uma resposta bem-sucedida retornará um código de status 200.
/verification/v3/validateOtp/- Para suporte a vários idiomas
- por padrão é inglês
- Por enquanto, oferecemos suporte apenas em inglês
cURL
1curl --location 'https://cpaas.messagecentral.com/verification/v3/validateOtp?
2&verificationId=2949&code=1476' \
3--header 'authToken:
4eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJDLTMzNDMyQTVGNDIGNzQwNCI6ImIhdCI6MTcxMjExOTA0MC'
OBSERVAÇÃO: Para converter um comando cURL em código usando o Postman, abra o Postman, importe o comando cURL por meio do botão “Importar” e gere o código no idioma de sua preferência clicando no botão “Código” no lado direito da solicitação.
Resposta JSON
Uma resposta bem-sucedida retornará um código de status 200.
1{
2 "responseCode": 200,
3 "message": "SUCCESS",
4 "data": {
5 "verficationId": "xxxx",
6 "mobileNumber": "xxxx",
7 "responseCode": "200",
8 "errorMessage": null,
9 "verificationStatus": "VERIFICATION_COMPLETED",
10 "authToken": null,
11 "transactionId": "xxxx"
12 }
13}Exemplo de código
OkHttpClient client = new OkHttpClient().newBuilder()
.build();
MediaType mediaType = MediaType.parse("text/plain");
RequestBody body = RequestBody.create(mediaType, "");
Request request = new Request.Builder()
.url("https://cpaas.messagecentral.com/verification/v3/validateOtp?&verificationId=2949&code=1476")
.method("GET", body)
.addHeader("authToken", "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJDLTMzNDMyQTVGNDlGNzQwNCIsImlhdCI6MTcxMjExOT")
.build();
Response response = client.newCall(request).execute();var request = require('request');
var options = {
'method': 'GET',
'url': 'https://cpaas.messagecentral.com/verification/v3/validateOtp?&verificationId=2949&code=1476',
'headers': {
'authToken': 'eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJDLTMzNDMyQTVGNDlGNzQwNCIsImlhdCI6MTcxMjExOT'
}
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://cpaas.messagecentral.com/verification/v3/validateOtp?&verificationId=2949&code=1476');
$request->setMethod(HTTP_Request2::METHOD_GET);
$request->setConfig(array(
'follow_redirects' => TRUE
));
$request->setHeader(array(
'authToken' => 'eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJDLTMzNDMyQTVGNDlGNzQwNCIsImlhdCI6MTcxMjExOT'
));
try {
$response = $request->send();
if ($response->getStatus() == 200) {
echo $response->getBody();
}
else {
echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
$response->getReasonPhrase();
}
}
catch(HTTP_Request2_Exception $e) {
echo 'Error: ' . $e->getMessage();
}var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://cpaas.messagecentral.com/verification/v3/validateOtp?&verificationId=2949&code=1476");
request.Headers.Add("authToken", "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJDLTMzNDMyQTVGNDlGNzQwNCIsImlhdCI6MTcxMjExOT");
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
require "uri"
require "net/http"
url = URI("https://cpaas.messagecentral.com/verification/v3/send?countryCode=91&flowType=SMS&mobileNumber=9999999999")
https = Net::HTTP.new(url.host, url.port)
https.use_ssl = true
request = Net::HTTP::Post.new(url)
request["authToken"] = "eyJhbGciOiJIUzUxMiJ9.eyJzdWOiJDLTMzNDMyQTVGNDlGNzQwNCIsImlhdCI6MTcxMjExOTA0MCwiZXhw"
response = https.request(request)
puts response.read_bodyvar client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, "https://cpaas.messagecentral.com/verification/v3/send?countryCode=91&flowType=SMS&mobileNumber=9999999999");
request.Headers.Add("authToken", "eyJhbGciOiJIUzUxMiJ9.eyJzdWOiJDLTMzNDMyQTVGNDlGNzQwNCIsImlhdCI6MTcxMjExOTA0MCwiZXhw");
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());Códigos de resposta
Precisa de ajuda?
Precisa de uma mão? Nossos especialistas estão disponíveis 24 horas por dia, 7 dias por semana, para orientá-lo em qualquer coisa, a qualquer momento.
E-mail de suporte: support@messagecentral.com
Perguntas frequentes
Qual é a melhor API OTP de SMS para a Índia com base na confiabilidade e latência da entrega?
Procure um provedor de API SMS OTP que oferece rotas diretas do operador, emparelhamento de operadoras regionais, repetição/recuperação automatizada e SLAs de entrega mensuráveis. Os melhores fornecedores da categoria também oferecem suporte à conformidade com DLT, recibos de entrega (DLR), roteamento de baixa latência e Recurso de SMS e WhatsApp. Avalie medindo as taxas de entrega reais, a latência média (ms) e as falhas de erro nas principais operadoras indianas (Jio, Airtel, Vi).
Quão rápida deve ser a entrega de OTP para aplicativos indianos e o que afeta a latência?
Objetivo de menos de 2 segundos entrega para melhor UX (aceitáveis menos de 5 segundos). A latência é afetada pelo roteamento da operadora, filas durante picos de tráfego, congestionamento da rede, saltos agregadores de SMS e atrasos de DLT/template. Use rotas diretas, roteamento paralelo e SMS embutido e substituto do WhatsApp para minimizar a latência OTP de ponta a ponta e aumentar as taxas de conclusão.
Como faço para integrar uma API SMS OTP em meu aplicativo na Índia (Node.js, Python, PHP, Java)?
Fluxo básico: gerar OTP seguro → API Send-OTP do provedor de chamadas → armazenar hash OTP + expiração → verificar a entrada do usuário em relação ao hash armazenado por meio da API Verify-OTP/Webhook. A maioria dos provedores oferece endpoints REST e SDKs de verificação OTP. Exemplo (pseudo):
Node.js (buscar):
aguarde a busca ('https://api.provider/send', {
método: 'POST',
cabeçalhos: {'Autorização': 'CHAVE DO PORTADOR', 'Tipo de conteúdo': 'application/json'},
corpo: JSON.stringify ({para: '+91XXXXXXXXXX', modelo: 'OTP {{code}} ',
variáveis: {código:123456}})});
Use HTTPS, HMAC/assinatura, novas tentativas e webhooks para recibos de entrega (DLR).
Como faço para evitar o abuso de reenvio de OTP ou tentativas de força bruta no meu fluxo de autenticação?
Implemente proteções do lado do servidor:
- Limite as tentativas de reenvio por telefone por janela de tempo (por exemplo, 3 envios/10 minutos).
- A verificação do limite de taxa tenta adicionar atrasos progressivos ou bloqueios temporários após falhas.
- Usando o dispositivo StaginUse, impressão digital IP e CAPTCHAs para endpoint flows.g suspeitos em vez de produção
- Bloqueie a conta ou exija uma verificação secundária após N tentativas fracassadas. Registre tentativas e notifique as equipes de segurança.
O que causa falhas na entrega de OTP na Índia e como os desenvolvedores as corrigem?
Causas comuns: rejeição de DLT/modelo, filtragem de operadora (DND), roteamento incorreto, ID de remetente incorreta, problemas de formatação de números ou interrupções temporárias do operador. Correções: garanta a aprovação do DLT e do modelo, use o formato de telefone E.164 correto (+91), tente novamente com rotas alternativas, ative o recurso de SMS, monitore DLRs e use um provedor com relacionamentos diretos com operadoras.
Como faço para testar APIs OTP no modo sandbox sem enviar SMS reais?
Use a sandbox ou as chaves de teste do provedor para emular envios/recibos. Os recursos do Sandbox geralmente retornam DLRs simulados e respostas de verificação. Localmente, simule as respostas da API para testes unitários e use credenciais de teste para controle de qualidade de ponta a ponta. Sempre valide os webhooks na preparação (use ferramentas como o ngrok) e registre todos os eventos para serem reproduzidos nos testes.
Como implemento a limitação de taxa e a lógica de repetição para entrega de OTP?
Limitação de taxa: imponha limites por telefone e por IP no gateway da API (por exemplo, 3 envios por 10 min). Lógica de repetição: implemente um recuo exponencial para erros transitórios e uma nova tentativa imediata por meio de uma rota alternativa para falhas leves. Sempre limite as novas tentativas (por exemplo, 3 tentativas) e acompanhe os resultados das novas tentativas para evitar spam ou bloqueios de operadoras.
Posso usar o ID de remetente alfanumérico para OTP na Índia?
Não — A Índia exige IDs de remetente numéricos por meio de rotas aprovadas pela DLT para a maioria dos fluxos transacionais; o alfanumérico geralmente não é permitido para OTPs. Os OTPs devem seguir as regras de telecomunicação/DLT. Use um provedor compatível que gerencie o registro DLT e a configuração numérica da ID do remetente para você.
Qual é o tempo de expiração e o ciclo de repetição do OTP recomendados para usuários indianos?
Expiração: 3—5 minutos é padrão para TOPs transacionais (2FA). Ciclo de repetição: permita de 1 a 2 reenvios imediatos com limites antiabuso (por exemplo, máximo de 3 envios por 10 a 15 minutos). Vencimentos curtos reduzem fraudes; limites sensatos de reenvio reduzem a carga de suporte e a filtragem do operador.
Qual é a diferença entre rotas OTP transacionais e rotas OTP implícitas de serviço?
Transacional as rotas são para mensagens críticas e esperadas (OTP, atualizações de pedidos) que seguem uma conformidade mais rigorosa e geralmente têm maior prioridade de entrega. Serviço implícito (ou outras rotas de serviço) podem variar de acordo com a operadora e geralmente aplicam diferentes regras de modelo/consentimento. Verifique os documentos de roteamento do seu provedor — escolha rotas transacionais para Topos para maximizar a capacidade de entrega e a conformidade.
Como faço para migrar de outro provedor de SMS para uma nova API OTP sem tempo de inatividade?
Planeje uma transição em fases:
- Configure o novo provedor e provisione DLT/modelos em paralelo.
- Espelhe o tráfego (envie lotes de teste) e verifique as métricas de entrega.
- Implemente o envio duplo para uma pequena porcentagem do tráfego ao vivo (A/B) e monitore os resultados.
- Mude gradualmente o tráfego, mantendo o provedor antigo como substituto.
- Atualize os endpoints DNS/Webhook, revogue as chaves antigas quando estiverem estáveis. Monitore de perto os registros e as taxas de entrega.
