အကြောင်းအရာသို့ ကရန်

Flash ခေါ်ဆိုမှု

Flash Call သည် ဖုန်းနံပါတ်များကို အတည်ပြုရန် SMS အစား လွတ်သွားသောခေါ်ဆိုမှုကို အသုံးပြုသည့် ဖုန်းအတည်ပြုနည်းလမ်းတစ်ခုဖြစ်သည်။ ၎င်းသည် ပိုမိုမြန်ဆန်၊ ပိုမိုလုံခြုံပြီး ကုန်ကျစရိတ်သက်သာသည်။

ခြုံငုံသုံးသပ်ချက်

Flash Call အတည်ပြုခြင်းမှာ အောက်ပါတို့ လုပ်ဆောင်သည်-

  1. အသုံးပြုသူတောင်းဆိုမှုများကို အတည်ပြုခြင်း။
  2. စနစ်သည် သုံးစွဲသူ၏ဖုန်းသို့ ခေါ်ဆိုမှုကို စတင်သည်။
  3. 1-2 မြည်ပြီးနောက် ခေါ်ဆိုမှုကို အလိုအလျောက် ရပ်ဆိုင်းပါသည်။
  4. အသုံးပြုသူ၏အက်ပ်သည် ခေါ်ဆိုသူ ID ကို ဖမ်းယူသည်။
  5. ခေါ်ဆိုသူ ID ကို မျှော်လင့်ထားသည့်ပုံစံနှင့် ကိုက်ညီကြောင်း အတည်ပြုထားသည်။
  6. အသုံးပြုသူသည် စစ်မှန်ကြောင်းသက်သေပြထားသည်။

အကျိုးကျေးဇူး

ကုန်ကျစရိတ်သက်သာခြင်း။

  • SMS ထက် 10 ဆအထိ စျေးသက်သာသည်။
  • မက်ဆေ့ချ်ပေးပို့ခမရှိပါ။
  • ပမာဏမြင့်မားစွာ အတည်ပြုခြင်းအတွက် ကုန်ကျစရိတ်ကို လျှော့ချပါ။

ပိုမြန်တယ်။

  • ချက်ချင်းအတည်ပြုခြင်း (1-3 စက္ကန့်)
  • SMS ပေးပို့ခြင်းကို စောင့်ဆိုင်းခြင်းမရှိပါ။
  • ပိုမိုကောင်းမွန်သောအသုံးပြုသူအတွေ့အကြုံ

ပိုလုံခြုံတယ်။

  • SMS ထက် ကြားဖြတ်ရခက်သည်။
  • အကြောင်းကြားချက်များတွင် OTP မတွေ့ပါ။
  • SIM လဲလှယ်တိုက်ခိုက်မှုများကိုခံနိုင်ရည်ရှိသည်။

ကမ္ဘာလုံးဆိုင်ရာ လက်လှမ်းမီမှု

  • SMS ကန့်သတ်ချက်များရှိသောနိုင်ငံများတွင်အလုပ်လုပ်သည်။
  • SMS စစ်ထုတ်ခြင်းတွင် ပြဿနာမရှိပါ။
  • Universal ဖုန်းနှင့်လိုက်ဖက်မှု

အခြေခံ Flash Call

တောင်းဆိုခြင်း။

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

ကန့်သတ်ချက်များ

ကန့်သတ်ချက် ရိုက် လိုအပ်သည် ဖော်ပြချက်
from string ဟုတ်တယ် သင့်ပေးပို့သူအမှတ်အသား
to string ဟုတ်တယ် လက်ခံသူဖုန်းနံပါတ် (E.164)
ရိုက် string ဟုတ်တယ် "flashcall"
callerId string ဟုတ်တယ် အသုံးပြုသူ
ttl ကိန်းပြည့် မရှိ စက္ကန့်အတွင်း တိုက်ရိုက်ထုတ်လွှင့်ရန် အချိန် (ပုံမှန်- 60)

ဘယ်လိုအလုပ်လုပ်လဲ။

1. အသုံးပြုသူသည် ဖုန်းနံပါတ်ကို ထည့်သွင်းပါ။

အသုံးပြုသူက သင့်အက်ပ်တွင် ၎င်းတို့၏ဖုန်းနံပါတ်ကို ပေးသည်-

Phone: +380XXXXXXXXX

2. Flash Call တောင်းဆိုပါ။

သင့်ဆာဗာသည် 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. 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. Pattern ကို အတည်ပြုပါ။

ဖမ်းယူထားသော ခေါ်ဆိုသူ 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 string သီးသန့်အတည်ပြု ID
အဆင့်အတန်း string အခြေအနေ- လက်ခံသည်ပယ်ချသည်
callerId string ခေါ်ဆိုသူ ID နံပါတ် အပြည့်အစုံ
ပုံစံ string ကိုက်ညီရန် ပုံစံ (ဂဏန်း + ကြယ်ပွင့်များ)
to string လက်ခံသူဖုန်းနံပါတ်
ttl ကိန်းပြည့် သက်တမ်း စက္ကန့်

Pattern ကိုက်ညီခြင်း။

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
}

Cases ကိုအသုံးပြုပါ။

အကောင့်မှတ်ပုံတင်ခြင်း။

SMS ကုန်ကျစရိတ်မပါဘဲ စာရင်းသွင်းစဉ်အတွင်း ဖုန်းနံပါတ်များကို အတည်ပြုပါ။

ဝင်ရောက်စစ်ဆေးခြင်း

flash call ကို အသုံးပြု၍ two-factor authentication

ဖုန်းနံပါတ်အပ်ဒိတ်

အသုံးပြုသူ ပရိုဖိုင်ကို အပ်ဒိတ်လုပ်သည့်အခါ ဖုန်းနံပါတ်အသစ်ကို အတည်ပြုပါ။

ငွေလွှဲအတည်ပြုခြင်း။

flash call ဖြင့် တန်ဖိုးမြင့် ငွေလွှဲမှုများကို အတည်ပြုပါ။

အကောင်းဆုံးအလေ့အကျင့်များ

TTL

  • ✅ TTL ကို 60-90 စက္ကန့်သတ်မှတ်ပါ။
  • ✅ သက်တမ်းကုန်ဆုံးပြီးနောက် ပြန်လည်ကြိုးစားရန် အသုံးပြုသူအား ခွင့်ပြုပါ။
  • ❌ TTL ကို စက္ကန့် 120 ထက် ပိုကြာအောင် မသုံးပါနဲ့။

အသုံးပြုသူအတွေ့အကြုံ

  • "ခေါ်ဆိုရန်စောင့်နေသည်..." မက်ဆေ့ချ်ကို ပြပါ။
  • နှစ်သစ်တိုင်တိုင်ပြသခြင်း (60 စက္ကန့်)
  • "အစား SMS ကိုသုံးပါ" ရန်ရွေးချယ်ခွင့်ပေးပါ။
  • ခေါ်ဆိုသူ ID ကို အလိုအလျောက်ရှာဖွေပြီး အတည်ပြုပါ။

မှားယွင်းကိုင်တွယ်ခြင်း။

  • ပျောက်ဆုံးနေသောဖုန်းခွင့်ပြုချက်များကိုကိုင်တွယ်ပါ။
  • TTL သက်တမ်းကုန်ဆုံးပြီးနောက် အချိန်ကုန်သွားသည်။
  • SMS အစားထိုးရွေးချယ်မှုကို ပေးပါ။
  • ရှင်းလင်းသောအမှားမက်ဆေ့ချ်များကိုပြသပါ။

ခွင့်ပြုချက်များ

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>

စမ်းသပ်ခြင်း။

  • မတူညီသောစက်ပစ္စည်းများတွင်စမ်းသပ်ပါ။
  • မတူညီသောသယ်ဆောင်သူနှင့်အတူစမ်းသပ်ပါ။
  • စမ်းသပ်ခွင့်ပြုချက်ငြင်းဆိုမှုအခြေအနေများ
  • ကွန်ရက် အချိန်ကုန်သည့် အခြေအနေများကို စမ်းသပ်ပါ။

ကန့်သတ်ချက်များ

ပလပ်ဖောင်းပံ့ပိုးမှု

  • မိုဘိုင်းကိရိယာအားလုံးတွင်အလုပ်လုပ်သည်။
  • ဖုန်းခေါ်ဆိုမှုစွမ်းရည်လိုအပ်သည်။
  • READ_PHONE_STATE ခွင့်ပြုချက် လိုအပ်ပါသည်။
  • ဖုန်းမပါဘဲ တက်ဘလက်များတွင် အလုပ်မလုပ်ရပါ။

ကွန်ရက်

  • တက်ကြွသောဖုန်းချိတ်ဆက်မှုလိုအပ်သည်။
  • ညံ့ဖျင်းသောကွန်ရက်အခြေအနေများတွင်ပျက်ကွက်နိုင်သည်။
  • ဝန်ဆောင်မှုပေးသူ ကန့်သတ်ချက်များ သက်ရောက်နိုင်သည်။
  • နိုင်ငံတကာနှုန်းထားများ ကွဲပြားနိုင်သည်။

ကိုယ်ရေးကိုယ်တာ

  • အသုံးပြုသူများသည် အမည်မသိနံပါတ်များကို ပိတ်ဆို့နိုင်သည်။
  • အချို့စက်ပစ္စည်းများတွင် ခေါ်ဆိုမှုပိတ်ဆို့ခြင်း ရှိသည်။
  • ပြတ်သားသောခွင့်ပြုချက်များလိုအပ်သည်။
  • သုံးစွဲသူ၏ ကိုယ်ရေးကိုယ်တာဆိုင်ရာ စိုးရိမ်မှုများကို ထည့်သွင်းစဉ်းစားပါ။

ပြဿနာဖြေရှင်းခြင်း။

ဖုန်းခေါ်ဆိုမှု လက်ခံမရပါ။

  • ဖုန်းတွင် signal ရှိသည်ကိုစစ်ဆေးပါ။
  • နံပါတ်ဖော်မတ် (E.164) အတည်ပြုပါ
  • ဝန်ဆောင်မှုပေးသူ၏ကန့်သတ်ချက်များကိုစစ်ဆေးပါ။
  • SMS အမှားကို စမ်းကြည့်ပါ။

ပုံစံက မကိုက်ညီပါ။

  • မှန်ကန်သောခေါ်ဆိုသူ ID ကိုဖမ်းယူကြောင်းသေချာပါစေ။
  • ဂဏန်းမဟုတ်သော အက္ခရာများကို ဖယ်ထုတ်ပါ။
  • ပုံစံဖော်မတ်စစ်ဆေးပါ။
  • TTL ကာလအတွင်း အတည်ပြုပါ။

ခွင့်ပြုချက် ငြင်းဆိုထားသည်။

  • ခွင့်ပြုချက်မှန်ကန်စွာတောင်းဆိုပါ။
  • အဘယ်ကြောင့်ခွင့်ပြုချက်လိုအပ်ကြောင်းရှင်းပြပါ။
  • အခြားရွေးချယ်စရာ (SMS) ပေးပါ။
  • သပ်ရပ်စွာ ကိုင်တွယ်ပါ။

နောက်အဆင့်များ

  • Viber OTP - အစားထိုး OTP ပေးပို့ခြင်း။
  • SMS Messages - SMS ပေးပို့မှု
  • Check Status - flash call status ကို ခြေရာခံပါ။