Vai al contenuto

Chiamata flash

Flash Call è un metodo di verifica telefonica che utilizza una chiamata persa anziché un SMS per verificare i numeri di telefono. È più veloce, più sicuro e conveniente.

Panoramica

La verifica delle chiamate flash funziona in base a:

  1. L'utente richiede la verifica
  2. Il sistema avvia una chiamata al telefono dell'utente
  3. La chiamata viene terminata automaticamente dopo 1-2 squilli
  4. L'app dell'utente acquisisce l'ID chiamante
  5. L'ID chiamante viene verificato rispetto al modello previsto
  6. L'utente è autenticato

Vantaggi

Conveniente

  • Fino a 10 volte più economico degli SMS
  • Nessun costo per la consegna dei messaggi
  • Costi ridotti per la verifica di volumi elevati

Più veloce

  • Verifica istantanea (1-3 secondi)
  • Nessuna attesa per la consegna degli SMS
  • Migliore esperienza utente

Più sicuro

  • Più difficile da intercettare rispetto agli SMS
  • Nessun OTP visibile nelle notifiche
  • Resistente agli attacchi SIM swap

Portata globale

  • Funziona nei paesi con restrizioni SMS
  • Nessun problema con il filtraggio degli SMS
  • Compatibilità telefonica universale

Chiamata Flash di base

Richiesta

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

Parametri

Parametro Digitare Obbligatorio Descrizione
"da" stringa Il tuo identificatore mittente
"a" stringa Numero di telefono del destinatario (E.164)
"tipo" stringa Imposta su "flashcall"
ID chiamante stringa Numero di telefono che chiamerà l'utente
ttl intero No Durata in secondi (impostazione predefinita: 60)

Come funziona

1. L'utente inserisce il numero di telefono

L'utente fornisce il proprio numero di telefono nella tua app:

Phone: +380XXXXXXXXX

2. Richiedi chiamata flash

Il tuo server richiede la verifica della chiamata flash:

CODICE_BLOCCO_2

3. Risposta API

L'API restituisce il modello ID chiamante previsto:

{
  "messagelistId": 123456,
  "messages": [
    {
      "messageId": "abc123def456",
      "status": "accepted",
      "callerId": "+380123456789",
      "pattern": "***456789",
      "to": "+380XXXXXXXXX"
    }
  ]
}

4. Avviare la chiamata

Il sistema avvia una chiamata al telefono dell'utente e termina dopo 1-2 squilli.

5. Cattura l'ID chiamante

L'app dell'utente acquisisce l'ID chiamante della chiamata in arrivo:

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

6. Verifica modello

Confronta l'ID chiamante acquisito con il modello previsto:

CODICE_BLOCCO_5

Esempi di implementazione

Android

CODICE_BLOCCO_6

iOS

CODICE_BLOCCO_7

Web (lato server)

// 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 della risposta

Risposta riuscita

{
  "messagelistId": 123456,
  "messages": [
    {
      "messageId": "abc123def456",
      "status": "accepted",
      "callerId": "+380123456789",
      "pattern": "***456789",
      "to": "+380XXXXXXXXX",
      "ttl": 60
    }
  ]
}

Campi di risposta

Campo Digitare Descrizione
messaggioId stringa ID di verifica univoco
stato stringa Stato: accettato, rifiutato
ID chiamante stringa Numero ID chiamante completo
"modello" stringa Modello da abbinare (cifre + asterischi)
"a" stringa Numero di telefono del destinatario
ttl intero Periodo di validità in secondi

Corrispondenza modello

L'API restituisce uno schema con asterischi che mascherano alcune cifre:

Full number: +380123456789
Pattern:     ***456789

La tua app dovrebbe:

  1. Cattura l'ID del chiamante in entrata
  2. Estrarre le cifre dall'ID chiamante
  3. Confronta con il modello (asterischi = qualsiasi cifra)
  4. Verificare la corrispondenza entro il periodo TTL

Fallback agli SMS

Se la chiamata Flash fallisce, torna automaticamente agli SMS:

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

Casi d'uso

Registrazione dell'account

Verifica i numeri di telefono durante la registrazione senza costi SMS.

Verifica dell'accesso

Autenticazione a due fattori tramite chiamata flash.

Aggiornamento del numero di telefono

Verifica il nuovo numero di telefono quando l'utente aggiorna il profilo.

Conferma della transazione

Conferma le transazioni di alto valore con la chiamata flash.

Migliori pratiche

TTL

  • ✅ Imposta TTL su 60-90 secondi
  • ✅ Consenti all'utente di riprovare dopo la scadenza
  • ❌ Non utilizzare TTL per più di 120 secondi

Esperienza utente

  • Mostra il messaggio "In attesa di chiamata...".
  • Visualizza il conto alla rovescia (60 secondi)
  • Fornire l'opzione "Utilizza invece SMS"
  • Rileva e verifica automaticamente l'ID chiamante

Gestione degli errori

  • Gestire le autorizzazioni telefoniche mancanti
  • Timeout dopo la scadenza del TTL
  • Fornire l'opzione di fallback SMS
  • Mostra messaggi di errore chiari

Autorizzazioni

Richiedi le autorizzazioni telefoniche prima della chiamata flash:

Android: CODICE_BLOCCO_12

iOS:

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

Test

  • Prova su diversi dispositivi
  • Test con diversi operatori
  • Testare gli scenari di negazione dell'autorizzazione
  • Testare gli scenari di timeout della rete

Limitazioni

Supporto della piattaforma

  • Funziona su tutti i dispositivi mobili
  • Richiede la funzionalità di chiamata telefonica
  • Richiede l'autorizzazione READ_PHONE_STATE
  • Potrebbe non funzionare su tablet senza telefono

Rete

  • Richiede una connessione telefonica attiva
  • Potrebbe non funzionare in condizioni di rete scadenti
  • Potrebbero essere applicate restrizioni da parte del vettore
  • Le tariffe internazionali possono variare

Privacy

  • Gli utenti possono bloccare numeri sconosciuti
  • Alcuni dispositivi dispongono del blocco delle chiamate
  • Richiede autorizzazioni esplicite
  • Considerare le preoccupazioni sulla privacy degli utenti

Risoluzione dei problemi

Chiamata non ricevuta

  • Controlla che il telefono abbia segnale
  • Verifica formato numero (E.164)
  • Controlla le restrizioni del corriere
  • Prova il fallback SMS

Modello non corrispondente

  • Assicurati di acquisire l'ID chiamante corretto
  • Elimina i caratteri non numerici
  • Controllare il formato del modello
  • Verificare entro il periodo TTL

Autorizzazione negata

  • Richiedere le autorizzazioni correttamente
  • Spiegare perché sono necessarie le autorizzazioni
  • Fornire alternative (SMS)
  • Maneggiare con grazia

Passaggi successivi