Անցնել պարունակությանը

Ֆլեշ զանգ

Flash Call-ը հեռախոսի հաստատման մեթոդ է, որն օգտագործում է բաց թողնված զանգ SMS-ի փոխարեն հեռախոսահամարները ստուգելու համար: Այն ավելի արագ է, ավելի ապահով և ծախսարդյունավետ:

Տեսություն

Ֆլեշ զանգի ստուգումն աշխատում է՝

  1. Օգտագործողի հարցումների ստուգում
  2. Համակարգը սկսում է զանգ դեպի օգտվողի հեռախոս
  3. Զանգը ավտոմատ կերպով դադարեցվում է 1-2 զանգից հետո
  4. Օգտատիրոջ հավելվածը գրավում է զանգահարողի ID-ն
  5. Զանգահարողի ID-ն ստուգվում է ակնկալվող օրինակով
  6. Օգտագործողը վավերացված է

Առավելությունները

ծախսարդյունավետ

  • SMS-ից մինչև 10 անգամ ավելի էժան
  • Հաղորդագրությունների առաքման վճար չկա
  • Նվազեցված ծախսերը մեծածավալ ստուգման համար

Ավելի արագ

  • Ակնթարթային ստուգում (1-3 վայրկյան)
  • SMS առաքման սպասել չկա
  • Ավելի լավ օգտվողի փորձ

Ավելի ապահով

  • Ավելի դժվար է գաղտնալսել, քան SMS
  • Ծանուցումների մեջ OTP տեսանելի չէ
  • Դիմացկուն է SIM փոխանակման հարձակումներին

Համաշխարհային հասանելիություն

  • Աշխատում է SMS սահմանափակումներով երկրներում
  • SMS ֆիլտրման հետ կապված խնդիրներ չկան
  • Համընդհանուր հեռախոսի համատեղելիություն

Հիմնական ֆլեշ զանգ

հարցում

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

Պարամետրեր

Պարամետր Տեսակ Պահանջվում է Նկարագրություն
«ից» լարային Այո Ձեր ուղարկողի նույնացուցիչը
«դեպի» լարային Այո Ստացողի հեռախոսահամարը (E.164)
«տեսակ» լարային Այո Սահմանել «flashcall»՝
«callerId» լարային Այո Հեռախոսահամար, որը կզանգահարի օգտագործողին
«ttl» ամբողջ թիվ Ոչ Ապրելու ժամանակը վայրկյաններով (կանխադրված՝ 60)

Ինչպես է այն աշխատում

1. Օգտագործողը մուտքագրում է հեռախոսահամարը

Օգտագործողը տրամադրում է իր հեռախոսահամարը ձեր հավելվածում.

Phone: +380XXXXXXXXX

2. Պահանջել Flash Call

Ձեր սերվերը պահանջում է ֆլեշ զանգի ստուգում.

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. API-ի պատասխան

API-ն վերադարձնում է զանգահարողի ID-ի ակնկալվող օրինակը.

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

4. Սկսել զանգը

Համակարգը սկսում է զանգ օգտատիրոջ հեռախոսին և դադարեցնում է 1-2 զանգից հետո:

5. Գրեք զանգահարողի ID

Օգտատիրոջ հավելվածը գրավում է մուտքային զանգի զանգահարողի ID-ն.

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

6. Ստուգեք օրինակը

Համեմատեք գրավված զանգահարողի ID-ն ակնկալվող օրինակի հետ.

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

Իրականացման օրինակներ

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

Վեբ (սերվերի կողմ)

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

Պատասխանի ձևաչափ

Հաջողության պատասխան

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

Արձագանքման դաշտեր

Դաշտային Տեսակ Նկարագրություն
«messageId» լարային Ստուգման եզակի ID
«կարգավիճակ» լարային Կարգավիճակ՝ «ընդունված», «մերժված»
«callerId» լարային Ամբողջական զանգահարողի ID համարը
«օրինաչափություն» լարային Համապատասխանեցման ձևանմուշ (նիշ + աստղանիշ)
«դեպի» լարային Ստացողի հեռախոսահամարը
«ttl» ամբողջ թիվ Վավերականության ժամկետը վայրկյաններով

Կաղապարների համապատասխանեցում

API-ն վերադարձնում է մի նախշ՝ աստղանիշներով, որոնք քողարկում են որոշ թվանշաններ.

Full number: +380123456789
Pattern:     ***456789

Ձեր հավելվածը պետք է.

  1. Լուսանկարեք մուտքային զանգահարողի ID-ն
  2. Քաղեք թվեր զանգահարողի ID-ից
  3. Համընկնել օրինակին (աստղանիշ = ցանկացած թվանշան)
  4. Ստուգեք համընկնումը TTL ժամանակահատվածում

Հետադարձ SMS-ին

Եթե Flash Call-ը ձախողվի, ինքնաբերաբար վերադարձեք SMS.

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

Օգտագործման դեպքեր

Հաշվի գրանցում

Ստուգեք հեռախոսահամարները գրանցման ժամանակ առանց SMS-ի ծախսերի:

Մուտքի հաստատում

Երկու գործոնով նույնականացում ֆլեշ զանգի միջոցով:

Հեռախոսահամարի թարմացում

Հաստատեք նոր հեռախոսահամարը, երբ օգտատերը թարմացնում է պրոֆիլը:

Գործարքի հաստատում

Հաստատեք բարձրարժեք գործարքները ֆլեշ զանգով:

Լավագույն պրակտիկա

TTL

  • ✅ Սահմանել TTL 60-90 վայրկյան
  • ✅ Թույլատրել օգտվողին նորից փորձել ժամկետի ավարտից հետո
  • ❌ Մի օգտագործեք TTL-ը 120 վայրկյանից ավելի

Օգտագործողի փորձ

  • Ցույց տալ «Սպասում եմ զանգի...» հաղորդագրությունը
  • Ցուցադրել հետհաշվարկի ժամանակաչափ (60 վայրկյան)
  • Տրամադրել «Փոխարենը օգտագործել SMS» տարբերակը
  • Ավտոմատ հայտնաբերել և ստուգել զանգահարողի ID-ն

Սխալների կառավարում

  • Կառավարեք բացակայող հեռախոսի թույլտվությունները
  • Timeout TTL-ի ժամկետի ավարտից հետո
  • Տրամադրել SMS հետադարձ տարբերակ
  • Ցույց տալ հստակ սխալի հաղորդագրություններ

Թույլտվություններ

Ֆլեշ զանգից առաջ խնդրեք հեռախոսի թույլտվությունները.

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

Թեստավորում

  • Փորձարկում տարբեր սարքերի վրա
  • Փորձարկել տարբեր կրիչներով
  • Փորձարկել թույլտվության մերժման սցենարները
  • Փորձարկեք ցանցի ժամանակի սպառման սցենարները

Սահմանափակումներ

Պլատֆորմի աջակցություն

  • Աշխատում է բոլոր շարժական սարքերի վրա
  • Պահանջում է հեռախոսազանգերի հնարավորություն
  • Պահանջվում է READ_PHONE_STATE թույլտվություն
  • Կարող է չաշխատել պլանշետներում առանց հեռախոսի

Ցանց

  • Պահանջում է ակտիվ հեռախոսային կապ
  • Ցանցի վատ պայմաններում կարող է ձախողվել
  • Օպերատորի սահմանափակումները կարող են կիրառվել
  • Միջազգային գները կարող են տարբեր լինել

Գաղտնիություն

  • Օգտագործողները կարող են արգելափակել անհայտ համարները
  • Որոշ սարքեր ունեն զանգերի արգելափակում
  • Պահանջում է հստակ թույլտվություններ
  • Հաշվի առեք օգտվողների գաղտնիության հետ կապված խնդիրները

Անսարքությունների վերացում

Զանգ չի ստացվել

  • Ստուգեք հեռախոսի ազդանշանը
  • Ստուգեք համարի ձևաչափը (E.164)
  • Ստուգեք կրիչի սահմանափակումները
  • Փորձեք SMS վերադարձը

Չհամապատասխանող նախշը

  • Համոզվեք, որ ճիշտ զանգահարողի ID-ն է
  • Հեռացրեք ոչ թվային նիշերը
  • Ստուգեք օրինաչափության ձևաչափը
  • Ստուգեք TTL ժամանակահատվածում

Թույլտվությունը մերժված է

  • Խնդրեք թույլտվությունները պատշաճ կերպով
  • Բացատրեք, թե ինչու են անհրաժեշտ թույլտվությունները
  • Տրամադրել այլընտրանքային (SMS)
  • Նրբագեղորեն վարվեք

Հաջորդ քայլերը