Help Center ފްލެޝް ކޯލް

ފްލެޝް ކޯލް

ފްލެޝް ކޯލަކީ ފޯނު ނަންބަރުތައް ޔަގީންކުރުމަށް އެސްއެމްއެސްގެ ބަދަލުގައި މިސްޑް ކޯލެއް ބޭނުންކޮށްގެން ފޯނު ވެރިފިކޭޝަން މެތޯޑެކެވެ. އެއީ މާ އަވަސް، ރައްކާތެރި، އަދި ޚަރަދު ކުޑަ އެއްޗެކެވެ.

އޯވަރވިއު

ފްލެޝް ކޯލް ވެރިފިކޭޝަން މަސައްކަތް ކުރަނީ:

  1. ޔޫޒަރ ރިކުއެސްޓްސް ވެރިފިކޭޝަން
  2. ސިސްޓަމް އިން ޔޫޒަރުގެ ފޯނަށް ކޯލެއް އިނިޝިއޭޓް ކުރެއެވެ
  3. 1-2 ރިންގް ޖެހުމަށްފަހު އޮޓޮމެޓިކުން ކޯލް ޓާރމިނޭޓް ވެއެވެ
  4. ޔޫޒަރސް އެޕް އިން ކޯލަރ އައިޑީ ކެޕްޗާރ ކުރެއެވެ
  5. ކޯލަރ އައިޑީ ވެރިފައި ކުރެވިފައިވަނީ އުންމީދުކުރާ ގޮތާ އެއްގޮތަށެވެ
  6. ޔޫޒަރ އޮތެންޓިކޭޓް ކުރެވިފައިވުން

ފައިދާތައް

ޚަރަދު ކުޑަ

  • އެސްއެމްއެސް އަށް ވުރެ 10 ގުނަ އާއި ހަމައަށް އަގުހެޔޮ
  • މެސެޖް ޑެލިވަރީ ފީއެއް ނުނަގާ
  • ހައި ވޮލިއުމް ވެރިފިކޭޝަން އަށް ކުރާ ހަރަދު ކުޑަކުރުން

އަވަސް

  • ވަގުތުން ވެރިފިކޭޝަން (1-3 ސިކުންތު)
  • އެސްއެމްއެސް ޑެލިވަރީއަށް އިންތިޒާރު ނުކުރުން
  • ޔޫޒަރ އެކްސްޕީރިއަންސް ރަނގަޅުވުން

އިތުރަށް ރައްކާތެރި

  • އެސްއެމްއެސް އަށް ވުރެ އިންޓަސެޕްޓް ކުރަން އުނދަގޫ
  • ނޮޓިފިކޭޝަންތަކުގައި އޯޓީޕީ ނުފެންނާނެއެވެ
  • ސިމް ސްވޮޕް އެޓޭކްތަކަށް ދިފާޢުވުން

ގްލޯބަލް ރީޗް

  • އެސްއެމްއެސް ރެސްޓްރިކްޝަން ހުންނަ ޤައުމުތަކުގައި މަސައްކަތްކުރުން
  • އެސްއެމްއެސް ފިލްޓަރިންގ ގައި މައްސަލައެއް ނެތް
  • ޔުނިވާސަލް ފޯނު ކޮމްޕެޓިބިލިޓީ

އަސާސީ ފްލެޝް ކޯލް

ރިކުއެސްޓް

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

ޕެރެމިޓަރސް

ޕެރެމިޓަރވައްތަރުބޭނުންވާތަފްސީލު
އިންސްޓްރިންގްއާދެތިބާގެ ފޮނުވާ މީހާ އައިޑެންޓިފައިޓަރ
އަށްސްޓްރިންގްއާދެލިބޭ ފަރާތުގެ ފޯނު ނަންބަރު (E.164)
ވައްތަރުސްޓްރިންގްއާދެ"ފްލެޝްކޯލް" އަށް ސެޓްކުރުން
ކޯލަރއައިޑީސްޓްރިންގްއާދެފޯނު ނަންބަރަށް ގުޅާނެ ޔޫޒަރ
ttlއިންޓިޖަރނޫންޓައިމް-ޓު-ލައިވް ސިކުންތުކޮޅު (ޑިފޯލްޓް: 60)

އެކަން ކުރާ ގޮތް

1. ޔޫޒަރ ފޯނު ނަންބަރު އެންޓަރ ކުރުން

ޔޫޒަރ ތިބާގެ އެޕްގައި އެމީހުންގެ ފޯނު ނަންބަރު ފޯރުކޮށްދެއެވެ:

Phone: +380XXXXXXXXX

2. ފްލެޝް ކޯލް އަށް ރިކުއެސްޓް ކުރުން

ތިބާގެ ސަރވަރ އިން ފްލެޝް ކޯލް ވެރިފިކޭޝަން އަށް އެދެއެވެ:

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. އެޕީއައި ރެސްޕޮންސް

އެޕީއައި އިން އުންމީދުކުރާ ކޯލަރ އައިޑީ ޕެޓަރން ރިޓަރން ކުރާނެއެވެ:

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

4. ކޯލް އިނިޝިއޭޓްކުރުން

ސިސްޓަމް ޔޫޒަރުގެ ފޯނަށް ކޯލެއް އިނިޝިއޭޓްކޮށް 1-2 ރިންގް ކުރުމުން ޓާމިނޭޓް ވެއެވެ.

5. ކޯލަރ އައިޑީ ކެޕްޗަރ ކުރުން

ޔޫޒަރސް އެޕް އިން އިންކަމް ކޯލްގެ ކޯލަރ އައިޑީ ކެޕްޗާރ ކުރެއެވެ:

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

6. ޕެޓަރން ޔަގީންކުރުން

ކެޕްޗާރޑް ކޯލަރ އައިޑީ އާއި އުންމީދު ކުރެވޭ ގޮތަށް އަޅާކިޔުން:

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

ތަންފީޒުކުރުމުގެ މިސާލުތައް

އެންޑްރޮއިޑް

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

އައިއޯއެސް

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

ޖަވާބުދާރީވުމުގެ ދާއިރާތައް

ދަނޑުވައްތަރުތަފްސީލު
މެސެޖްއައިޑީސްޓްރިންގްޔުނިކް ވެރިފިކޭޝަން އައިޑީ
ސްޓޭޓަސްސްޓްރިންގްސްޓޭޓަސް: ގަބޫލުކުރެވިއްޖެ، ދޮގުކުރެވިއްޖެ
ކޯލަރއައިޑީސްޓްރިންގްފުލް ކޯލަރ އައިޑީ ނަންބަރު
ޕެޓަރންސްޓްރިންގްޕެޓަރން ޓު މެޗް (ޑިޖިޓްސް + އެސްޓިރިސްކް)
އަށްސްޓްރިންގްލިބޭ ފަރާތުގެ ފޯނު ނަންބަރު
ttlއިންޓިޖަރސައްހަ މުއްދަތު ސިކުންތުން

ޕެޓަރން މެޗިންގ

އެޕީއައި އިން ބައެއް އަދަދުތައް މާސްކް ކުރާ ތަރިތަކާއެކު ޕެޓަރންއެއް ރިޓަރން ކުރެއެވެ:

Full number: +380123456789
Pattern:     ***456789

ތިބާގެ އެޕް ވާންޖެހޭނީ:

  1. އިންކަމް ކޯލަރ އައިޑީ ކެޕްޗަރ ކުރުން
  2. ކޯލަރ އައިޑީ އިން ޑިޖިޓް ނެގުން
  3. ޕެޓަރން އާއި އެއްގޮތްކުރުން (ތަރި = ކޮންމެ އަދަދެއް) .
  4. ޓީޓީއެލް މުއްދަތުގެ ތެރޭގައި މެޗް ވެރިފައިކުރުން

އެސްއެމްއެސް އަށް ފޯލްބެކް

ފްލެޝް ކޯލް ފޭލްވެއްޖެނަމަ އޮޓޮމެޓިކުން އަނބުރާ އެސްއެމްއެސް އަށް ވެއްޓޭނެ:

{
  "messages": [
    {
      "from": "ALPHANAME",
      "to": "380936670003",
      "type": "flashcall",
      "text": 321,
      "ttl": 30,
      "fallbacks": [
        {
          "from": "ALPHANAME",
          "to": "380936670003",
          "type": "viber_otp",
          "text": "",
          "ttl": 90,
          "messageData": {
            "templateId": "6c929cef-29b4-4349-bc9d-2a07bdbb6e43",
            "templateLang": "uk",
            "templateParams": {
              "pin": 321,
              "business_platform_name": "SMSBAT",
              "code_validity_time": 7
            }
          }
        },
        {
          "from": "ALPHANAME",
          "to": "380936670003",
          "type": "sms",
          "text": "Your SMS code: 321"
        }
      ]
    }
  ]
}

ޔޫސް ކޭސްސް

އެކައުންޓް ރަޖިސްޓްރީ ކުރުން

އެސްއެމްއެސް ހަރަދެއް ނުކޮށް ސައިންއަޕް ކުރާއިރު ފޯނު ނަންބަރުތައް ޔަގީންކުރުން.

ލޮގިން ވެރިފިކޭޝަން

ފްލެޝް ކޯލް ބޭނުންކޮށްގެން ޓޫ ފެކްޓަރ އޮތެންޓިކޭޝަން.

ފޯނު ނަންބަރު އަޕްޑޭޓް

ޔޫޒަރ ޕްރޮފައިލް އަޕްޑޭޓް ކުރާއިރު އާ ފޯނު ނަންބަރު ޔަގީންކުރުން.

މުއާމަލާތް ކަށަވަރުކުރުން

ފްލެޝް ކޯލުން މަތީ އަގުހުރި މުއާމަލާތްތައް ކަށަވަރުކުރުން.

އެންމެ ރަނގަޅު އުސޫލުތައް

ޓީޓީއެލް

  • ✅ ޓީޓީއެލް 60-90 ސިކުންތަށް ސެޓްކުރުން
  • ✅ މުއްދަތު ހަމަވުމަށްފަހު އަލުން މަސައްކަތް ކުރުމުގެ ހުއްދަ ދިނުން
  • ❌ 120 ސިކުންތަށްވުރެ ގިނައިރު ޓީޓީއެލް ބޭނުން ނުކުރުން

ޔޫޒަރ އެކްސްޕީރިއަންސް

  • “ވެއިޓިންގ ފޯ ކޯލް…” މެސެޖު ދައްކާށެވެ
  • ޑިސްޕްލޭ ކައުންޓްޑައުން ޓައިމަރ (60 ސިކުންތު)
  • “އޭގެ ބަދަލުގައި އެސްއެމްއެސް ބޭނުންކުރުން” ގެ އިޚްތިޔާރު ދިނުން.
  • ކޯލަރ އައިޑީ އޮޓޯ ޑިޓެކްޓްކޮށް ވެރިފައިކުރުން

އެރަރ ހެންޑްލިންގ

  • ގެއްލިފައިވާ ފޯނުގެ ހުއްދަތައް ޙައްލުކުރުން
  • ޓީޓީއެލް މުއްދަތު ހަމަވުމަށްފަހު ޓައިމްއައުޓް
  • އެސްއެމްއެސް ފޯލްބެކް އޮޕްޝަން ފޯރުކޮށްދިނުން
  • ސާފު އެރަރ މެސެޖުތައް ދައްކާށެވެ

ހުއްދަތައް

ފްލެޝް ކޯލް ކުރުމުގެ ކުރިން ފޯނުގެ ހުއްދަ ހޯދުމަށް އެދި:

އެންޑްރޮއިޑް:

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_CALL_LOG" />

އައިއޯއެސް:

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

ޓެސްޓްކުރުން

  • އެކި ޑިވައިސްތަކުގައި ޓެސްޓްކުރުން
  • އެކި ކެރިއަރުންނާއެކު ޓެސްޓްކުރުން
  • ޓެސްޓް ހުއްދަ ނުދިނުމުގެ މަންޒަރުތައް
  • ނެޓްވޯކް ޓައިމްއައުޓް މަންޒަރުތައް ޓެސްޓްކުރުން

ލިމިޓެޝަންސް

ޕްލެޓްފޯމް ސަޕޯޓް

  • ހުރިހާ މޯބައިލް ޑިވައިސްތަކެއްގައި މަސައްކަތް ކުރެއެވެ
  • ފޯނު ކޯލް ކުރުމުގެ ޤާބިލުކަން ބޭނުންވެއެވެ
  • READ_PHONE_STATE ހުއްދަ ބޭނުންވެއެވެ
  • ފޯނު ނެތި ޓެބްލެޓްތަކުގައި މަސައްކަތް ނުކުރެވިދާނެއެވެ

ނެޓްވަރކް

  • އެކްޓިވް ފޯން ކަނެކްޝަން ބޭނުންވެއެވެ
  • ނެޓްވޯކްގެ ހާލަތު ދަށްވުމުން ފެއިލްވެދާނެއެވެ
  • ކެރިއަރ ރެސްޓްރިކްޝަންތައް ކަނޑައެޅިދާނެއެވެ
  • ބައިނަލްއަޤްވާމީ ރޭޓްތައް ތަފާތުވެދާނެއެވެ

އަމިއްލަ

  • ޔޫޒަރުންނަށް ނޭނގޭ ނަންބަރުތައް ބްލޮކް ކުރެވިދާނެއެވެ
  • ބައެއް ޑިވައިސްތަކުގައި ކޯލް ބްލޮކިންގ ހުރެއެވެ
  • ސާފު ހުއްދަތަކެއް ބޭނުންވެއެވެ
  • ޔޫޒަރުންގެ ޕްރައިވެސީގެ ކަންބޮޑުވުންތަކަށް ވިސްނުން

މައްސަލަ ހައްލުކުރުން

ކޯލް ނުލިބޭ

  • ފޯނުގައި ސިގްނަލް ހުރިތޯ ބަލާށެވެ
  • ނަންބަރު ފޯމެޓް ޔަގީންކުރުން (E.164)
  • ކެރިއަރ ރެސްޓްރިކްޝަންސް ޗެކްކުރުން
  • އެސްއެމްއެސް ފޯލްބެކް ޓްރައި ކޮށްލައްވާ

ޕެޓަރން ނުގުޅޭ

  • ރަނގަޅު ކޯލަރ އައިޑީ ކެޕްޗާރ ކުރެވޭތޯ ބެލުން
  • ޑިޖިޓް ނޫން އަކުރުތައް ސްޓްރިޕްކުރުން
  • ޕެޓަރން ފޯމެޓް ޗެކްކުރުން
  • ޓީޓީއެލް މުއްދަތުގެ ތެރޭގައި ޔަގީންކުރުން

ހުއްދައަށް އިންކާރުކޮށްފި

  • ހުއްދަ ހޯދުމަށް ރަނގަޅަށް އެދި ހުށަހެޅުން
  • ހުއްދަތައް ބޭނުންވާ ސަބަބު ބަޔާންކުރުން
  • އަލްޓަރނޭޓިވް (އެސްއެމްއެސް) ފޯރުކޮށްދިނުން
  • ޝަރަފުވެރިކަމާއެކު ޙަވާލުކުރުން

ދެން އަޅަންޖެހޭ ފިޔަވަޅުތައް