Help Center Ֆլեշ զանգ

Ֆլեշ զանգ

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)
  • Նրբագեղորեն վարվեք

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