Help Center Flashcall

Flashcall

#Chamada Flash

Flash Call é um método de verificação de telefone que usa uma chamada perdida em vez de SMS para verificar números de telefone. É mais rápido, mais seguro e econômico.

Visão geral

A verificação de Flash Call funciona por:

  1. O usuário solicita verificação
  2. O sistema inicia uma chamada para o telefone do usuário
  3. A chamada é encerrada automaticamente após 1-2 toques
  4. O aplicativo do usuário captura o identificador de chamadas
  5. O identificador de chamadas é verificado em relação ao padrão esperado
  6. O usuário está autenticado

Benefícios

Econômico

  • Até 10x mais barato que SMS
  • Sem taxas de entrega de mensagens
  • Custos reduzidos para verificação de alto volume

Mais rápido

  • Verificação instantânea (1-3 segundos)
  • Sem espera pela entrega de SMS
  • Melhor experiência do usuário

Mais seguro

  • Mais difícil de interceptar do que SMS
  • Nenhum OTP visível nas notificações
  • Resistente a ataques de troca de SIM

Alcance global

  • Funciona em países com restrições de SMS
  • Sem problemas com filtragem de SMS
  • Compatibilidade universal com telefone

Chamada Flash Básica

Solicitação

{
  "from": "YourApp",
  "to": "+380XXXXXXXXX",
  "type": "flashcall",
  "messageData": {
    "callerId": "+380123456789"
  }
}

Parâmetros

ParâmetroTipoObrigatórioDescrição
decordaSimSeu identificador de remetente
paracordaSimNúmero de telefone do destinatário (E.164)
tipocordaSimDefina como "flashcall"
callerIdcordaSimNúmero de telefone que ligará para o usuário
ttlinteiroNãoTempo de vida em segundos (padrão: 60)

Como funciona

1. O usuário insere o número de telefone

O usuário fornece seu número de telefone no seu aplicativo:

Phone: +380XXXXXXXXX

2. Solicitar chamada flash

Seu servidor solicita verificação de chamada flash:

curl -X POST https://restapi.smsbat.com/bat/messagelist \
  -H "X-Authorization-Key: your-api-key" \
  -H "Content-Type: application/json" \
  -d '{
    "messages": [{
      "from": "YourApp",
      "to": "+380XXXXXXXXX",
      "type": "flashcall",
      "messageData": {
        "callerId": "+380123456789"
      },
      "ttl": 60
    }]
  }'

3. Resposta da API

A API retorna o padrão de identificação de chamada esperado:

CODE_BLOCO_3

4. Iniciar chamada

O sistema inicia uma chamada para o telefone do usuário e termina após 1 ou 2 toques.

5. Capturar ID do chamador

O aplicativo do usuário captura o identificador de chamadas da chamada recebida:

// Android example
val cursor = contentResolver.query(
    CallLog.Calls.CONTENT_URI,
    arrayOf(CallLog.Calls.NUMBER),
    null, null,
    CallLog.Calls.DATE + " DESC"
)

6. Verifique o padrão

Compare o identificador de chamadas capturado com o padrão esperado:

CODE_BLOCO_5

Exemplos de implementação

###Android

class FlashCallVerification {
    fun requestFlashCall(phoneNumber: String) {
        // 1. Request flash call from API
        val response = api.requestFlashCall(phoneNumber)
        val pattern = response.pattern

        // 2. Wait for incoming call
        val callReceiver = object : BroadcastReceiver() {
            override fun onReceive(context: Context, intent: Intent) {
                if (intent.action == TelephonyManager.ACTION_PHONE_STATE_CHANGED) {
                    val state = intent.getStringExtra(TelephonyManager.EXTRA_STATE)

                    if (state == TelephonyManager.EXTRA_STATE_RINGING) {
                        val callerId = intent.getStringExtra(
                            TelephonyManager.EXTRA_INCOMING_NUMBER
                        )

                        // 3. Verify caller ID against pattern
                        if (verifyPattern(callerId, pattern)) {
                            onVerificationSuccess()
                        }
                    }
                }
            }
        }

        // Register receiver
        context.registerReceiver(
            callReceiver,
            IntentFilter(TelephonyManager.ACTION_PHONE_STATE_CHANGED)
        )
    }

    private fun verifyPattern(callerId: String?, pattern: String): Boolean {
        if (callerId == null) return false

        val regex = pattern.replace("*", "\\d").toRegex()
        return regex.matches(callerId)
    }
}

###iOS

class FlashCallVerification {
    func requestFlashCall(phoneNumber: String) {
        // 1. Request flash call from API
        api.requestFlashCall(phoneNumber) { response in
            let pattern = response.pattern

            // 2. Use CallKit to detect incoming call
            let provider = CXProvider(configuration: providerConfiguration)
            provider.setDelegate(self, queue: nil)

            // Store pattern for verification
            self.expectedPattern = pattern
        }
    }

    // CallKit delegate
    func provider(_ provider: CXProvider, perform action: CXAnswerCallAction) {
        // Capture caller ID
        let callerId = action.callUUID.uuidString

        // Verify against pattern
        if verifyPattern(callerId: callerId, pattern: expectedPattern) {
            onVerificationSuccess()
        }

        action.fulfill()
    }

    private func verifyPattern(callerId: String, pattern: String) -> Bool {
        let regex = try! NSRegularExpression(
            pattern: pattern.replacingOccurrences(of: "*", with: "\\d")
        )
        let range = NSRange(location: 0, length: callerId.count)
        return regex.firstMatch(in: callerId, range: range) != nil
    }
}

Web (lado do servidor)

// Node.js example
const express = require('express');
const app = express();

app.post('/request-verification', async (req, res) => {
  const { phoneNumber } = req.body;

  // 1. Request flash call
  const response = await fetch('https://restapi.smsbat.com/bat/messagelist', {
    method: 'POST',
    headers: {
      'X-Authorization-Key': process.env.SMSBAT_API_KEY,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      messages: [{
        from: 'YourApp',
        to: phoneNumber,
        type: 'flashcall',
        messageData: {
          callerId: process.env.FLASH_CALL_NUMBER
        },
        ttl: 60
      }]
    })
  });

  const data = await response.json();
  const { messageId, pattern } = data.messages[0];

  // 2. Store pattern for verification
  await redis.setex(`flashcall:${messageId}`, 60, pattern);

  // 3. Return pattern to client
  res.json({ messageId, pattern });
});

app.post('/verify-flashcall', async (req, res) => {
  const { messageId, callerId } = req.body;

  // 1. Get expected pattern
  const pattern = await redis.get(`flashcall:${messageId}`);

  if (!pattern) {
    return res.status(400).json({ error: 'Verification expired' });
  }

  // 2. Verify caller ID
  const regex = new RegExp(pattern.replace(/\*/g, '\\d'));
  const isValid = regex.test(callerId);

  if (isValid) {
    // Mark phone as verified
    await markPhoneVerified(callerId);
    res.json({ verified: true });
  } else {
    res.status(400).json({ error: 'Invalid caller ID' });
  }
});

Formato de resposta

Resposta de sucesso

CODE_BLOCO_9

Campos de resposta

CampoTipoDescrição
mensagemIdcordaID de verificação exclusivo
estadocordaStatus: aceito, rejeitado
callerIdcordaNúmero completo de identificação de chamadas
padrãocordaPadrão a combinar (dígitos + asteriscos)
paracordaNúmero de telefone do destinatário
ttlinteiroPeríodo de validade em segundos

Correspondência de padrões

A API retorna um padrão com asteriscos mascarando alguns dígitos:

Full number: +380123456789
Pattern:     ***456789

Seu aplicativo deve:

  1. Capture o identificador de chamadas recebidas
  2. Extraia dígitos do identificador de chamadas
  3. Combine com o padrão (asteriscos = qualquer dígito)
  4. Verifique a correspondência dentro do período TTL

Alternativa para SMS

Se a Flash Call falhar, volte automaticamente para SMS:

{
  "from": "YourApp",
  "to": "+380XXXXXXXXX",
  "type": "flashcall",
  "messageData": {
    "callerId": "+380123456789"
  },
  "fallback": {
    "type": "sms",
    "text": "Your verification code is: 123456"
  },
  "ttl": 60
}

Casos de uso

Registro de conta

Verifique os números de telefone durante a inscrição sem custos de SMS.

Verificação de login

Autenticação de dois fatores usando chamada flash.

Atualização do número de telefone

Verifique o novo número de telefone quando o usuário atualizar o perfil.

Confirmação de transação

Confirme transações de alto valor com chamada flash.

Melhores práticas

###TTL

  • ✅ Defina TTL para 60-90 segundos
  • ✅ Permitir que o usuário tente novamente após a expiração
  • ❌ Não use TTL por mais de 120 segundos

Experiência do usuário

  • Mostrar mensagem “Aguardando chamada…”
  • Exibir temporizador de contagem regressiva (60 segundos)
  • Fornece a opção “Usar SMS em vez disso”
  • Detectar e verificar automaticamente o identificador de chamadas

Tratamento de erros

  • Lidar com permissões de telefone ausentes
  • Tempo limite após TTL expirar
  • Fornece opção de retorno de SMS
  • Mostrar mensagens de erro claras

Permissões

Solicite permissões de telefone antes da chamada flash:

Android:

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_CALL_LOG" />

iOS:

<key>NSPhoneCallUsageDescription</key>
<string>We need phone access to verify your number</string>

Teste

  • Teste em diferentes dispositivos
  • Teste com diferentes operadoras
  • Testar cenários de negação de permissão
  • Testar cenários de tempo limite da rede

Limitações

Suporte à plataforma

  • Funciona em todos os dispositivos móveis
  • Requer capacidade de chamada telefônica
  • Precisa de permissão READ_PHONE_STATE
  • Pode não funcionar em tablets sem telefone

Rede

  • Requer conexão telefônica ativa
  • Pode falhar em más condições de rede
  • Restrições da operadora podem ser aplicadas
  • As tarifas internacionais podem variar

Privacidade

  • Os usuários podem bloquear números desconhecidos
  • Alguns dispositivos possuem bloqueio de chamadas
  • Requer permissões explícitas
  • Considere as preocupações com a privacidade do usuário

Solução de problemas

Chamada não recebida

  • Verifique se o telefone tem sinal
  • Verifique o formato do número (E.164)
  • Verifique as restrições da operadora
  • Experimente o substituto de SMS

Padrão não correspondente

  • Certifique-se de capturar o identificador de chamadas correto
  • Tira caracteres não numéricos
  • Verifique o formato do padrão
  • Verifique dentro do período TTL

Permissão negada

  • Solicite permissões corretamente
  • Explique por que as permissões são necessárias
  • Fornecer alternativa (SMS)
  • Manuseie graciosamente

Próximas etapas