Kalo te përmbajtja

Thirrje flash

Flash Call është një metodë verifikimi telefonik që përdor një telefonatë të humbur në vend të SMS për të verifikuar numrat e telefonit. Është më i shpejtë, më i sigurt dhe me kosto efektive.

Përmbledhje

Verifikimi i thirrjeve flash funksionon nga:

  1. Verifikimi i kërkesave të përdoruesit
  2. Sistemi fillon një telefonatë në telefonin e përdoruesit
  3. Telefonata ndërpritet automatikisht pas 1-2 zileve
  4. Aplikacioni i përdoruesit kap ID-në e telefonuesit
  5. ID-ja e telefonuesit verifikohet kundrejt modelit të pritur
  6. Përdoruesi është vërtetuar

Përfitimet

Me kosto efektive

  • Deri në 10 herë më lirë se SMS
  • Nuk ka tarifa për dërgimin e mesazheve
  • Ulja e kostove për verifikimin me volum të lartë

Më shpejt

  • Verifikimi i menjëhershëm (1-3 sekonda)
  • Nuk ka pritje për dërgimin e SMS
  • Përvojë më e mirë e përdoruesit

Më i sigurt

  • Më e vështirë për t'u përgjuar sesa SMS
  • Nuk ka OTP të dukshme në njoftime
  • Rezistent ndaj sulmeve të shkëmbimit të kartave SIM

Arritja globale

  • Punon në vendet me kufizime SMS
  • Nuk ka probleme me filtrimin e SMS
  • Pajtueshmëria universale e telefonit

Thirrje bazë flash

Kërkesë

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

Parametrat

Parametri Lloji Kërkohet Përshkrimi
"nga" varg Po Identifikuesi juaj i dërguesit
për varg Po Numri i telefonit të marrësit (E.164)
'lloj' varg Po Cakto në "flashcall"
Identifikimi i thirrësit varg Po Numri i telefonit që do të telefonojë përdoruesin
ttl numër i plotë Jo Koha për të jetuar në sekonda (parazgjedhja: 60)

Si funksionon

1. Përdoruesi fut numrin e telefonit

Përdoruesi jep numrin e tij të telefonit në aplikacionin tuaj:

KODI_BLOCK_1

2. Kërko Call Flash

Serveri juaj kërkon verifikimin e thirrjeve 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. Përgjigja në API

API kthen modelin e pritur të ID-së së thirrësit:

KODI_BLOCK_3

4. Filloni thirrjen

Sistemi fillon një telefonatë në telefonin e përdoruesit dhe përfundon pas 1-2 zileve.

5. Kapni ID-në e thirrësit

Aplikacioni i përdoruesit kap ID-në e telefonuesit të thirrjes hyrëse:

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

6. Verifiko modelin

Krahasoni ID-në e telefonuesit të kapur me modelin e pritur:

// JavaScript example
function verifyFlashCall(callerId, pattern) {
  // Remove non-digits
  const callerDigits = callerId.replace(/\D/g, '');
  const patternDigits = pattern.replace(/\*/g, '.');

  // Check if matches pattern
  const regex = new RegExp(patternDigits);
  return regex.test(callerDigits);
}

Shembuj zbatimi

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
    }
}

Ueb (në anën e serverit)

// 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' });
  }
});

Formati i përgjigjes

Përgjigja e suksesit

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

Fushat e përgjigjes

Fusha Lloji Përshkrimi
Id mesazhi varg ID unike e verifikimit
"statusi" varg Statusi: pranuar, refuzuar
Identifikimi i thirrësit varg Numri i plotë i identifikimit të thirrësit
"modeli" varg Modeli për t'u përputhur (shifra + yje)
për varg Numri i telefonit të marrësit
ttl numër i plotë Periudha e vlefshmërisë në sekonda

Përputhja e modelit

API kthen një model me yje që maskojnë disa shifra:

Full number: +380123456789
Pattern:     ***456789

Aplikacioni juaj duhet:

  1. Regjistroni ID-në e telefonuesit në hyrje
  2. Nxirrni shifrat nga ID-ja e telefonuesit
  3. Përputhja me modelin (yjet = çdo shifër)
  4. Verifikoni përputhjen brenda periudhës TTL

Rikthim në SMS

Nëse Flash Call dështon, kthehu automatikisht në SMS:

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

Rastet e përdorimit

Regjistrimi i llogarisë

Verifikoni numrat e telefonit gjatë regjistrimit pa kosto SMS.

Verifikimi i hyrjes

Autentifikimi me dy faktorë duke përdorur thirrje flash.

Përditësimi i numrit të telefonit

Verifiko numrin e ri të telefonit kur përdoruesi përditëson profilin.

Konfirmimi i transaksionit

Konfirmoni transaksionet me vlerë të lartë me thirrje flash.

Praktikat më të mira

TTL

  • ✅ Cakto TTL në 60-90 sekonda
  • ✅ Lejo përdoruesin të provojë sërish pas skadimit
  • ❌ Mos përdorni TTL më shumë se 120 sekonda

Përvoja e përdoruesit

  • Shfaq mesazhin "Në pritje të telefonatës...".
  • Shfaq kohëmatësin e numërimit mbrapsht (60 sekonda)
  • Jep opsionin "Përdor SMS në vend"
  • Zbuloni dhe verifikoni automatikisht ID-në e telefonuesit

Trajtimi i gabimeve

  • Trajtoni lejet e telefonit që mungojnë
  • Kohëzgjatja pas skadimit të TTL
  • Siguroni opsionin e kthimit të SMS
  • Trego mesazhe të qarta gabimi

Lejet

Kërkoni lejet e telefonit përpara thirrjes 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>

Testimi

  • Provoni në pajisje të ndryshme
  • Provoni me bartës të ndryshëm
  • Testoni skenarët e refuzimit të lejes
  • Testoni skenarët e skadimit të rrjetit

Kufizime

Mbështetje e platformës

  • Punon në të gjitha pajisjet celulare
  • Kërkon aftësi për thirrje telefonike
  • Ka nevojë për leje READ_PHONE_STATE
  • Mund të mos funksionojë në tableta pa telefon

Rrjeti

  • Kërkon lidhje aktive telefonike
  • Mund të dështojë në kushte të këqija të rrjetit
  • Mund të zbatohen kufizime të operatorit
  • Tarifat ndërkombëtare mund të ndryshojnë

Privatësia

  • Përdoruesit mund të bllokojnë numra të panjohur
  • Disa pajisje kanë bllokim të thirrjeve
  • Kërkon leje të qarta
  • Merrni parasysh shqetësimet e privatësisë së përdoruesit

Zgjidhja e problemeve

Telefonata nuk u mor

  • Kontrollo që telefoni ka sinjal
  • Verifiko formatin e numrit (E.164)
  • Kontrolloni kufizimet e operatorit
  • Provoni kthimin e SMS-ve

Modeli nuk përputhet

  • Siguroni kapjen e saktë të ID-së së telefonuesit
  • Zhduk karakteret joshifrore
  • Kontrolloni formatin e modelit
  • Verifiko brenda periudhës TTL

Leja u refuzua

  • Kërkoni lejet siç duhet
  • Shpjegoni pse nevojiten lejet
  • Jep alternativë (SMS)
  • Trajto me hijeshi

Hapat e ardhshëm