ފްލެޝް ކޯލް
ފްލެޝް ކޯލަކީ ފޯނު ނަންބަރުތައް ޔަގީންކުރުމަށް އެސްއެމްއެސްގެ ބަދަލުގައި މިސްޑް ކޯލެއް ބޭނުންކޮށްގެން ފޯނު ވެރިފިކޭޝަން މެތޯޑެކެވެ. އެއީ މާ އަވަސް، ރައްކާތެރި، އަދި ޚަރަދު ކުޑަ އެއްޗެކެވެ.
އޯވަރވިއު
ފްލެޝް ކޯލް ވެރިފިކޭޝަން މަސައްކަތް ކުރަނީ:
- ޔޫޒަރ ރިކުއެސްޓްސް ވެރިފިކޭޝަން
- ސިސްޓަމް އިން ޔޫޒަރުގެ ފޯނަށް ކޯލެއް އިނިޝިއޭޓް ކުރެއެވެ
- 1-2 ރިންގް ޖެހުމަށްފަހު އޮޓޮމެޓިކުން ކޯލް ޓާރމިނޭޓް ވެއެވެ
- ޔޫޒަރސް އެޕް އިން ކޯލަރ އައިޑީ ކެޕްޗާރ ކުރެއެވެ
- ކޯލަރ އައިޑީ ވެރިފައި ކުރެވިފައިވަނީ އުންމީދުކުރާ ގޮތާ އެއްގޮތަށެވެ
- ޔޫޒަރ އޮތެންޓިކޭޓް ކުރެވިފައިވުން
ފައިދާތައް
ޚަރަދު ކުޑަ
- އެސްއެމްއެސް އަށް ވުރެ 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
ތިބާގެ އެޕް ވާންޖެހޭނީ:
- އިންކަމް ކޯލަރ އައިޑީ ކެޕްޗަރ ކުރުން
- ކޯލަރ އައިޑީ އިން ޑިޖިޓް ނެގުން
- ޕެޓަރން އާއި އެއްގޮތްކުރުން (ތަރި = ކޮންމެ އަދަދެއް) .
- ޓީޓީއެލް މުއްދަތުގެ ތެރޭގައި މެޗް ވެރިފައިކުރުން
އެސްއެމްއެސް އަށް ފޯލްބެކް
ފްލެޝް ކޯލް ފޭލްވެއްޖެނަމަ އޮޓޮމެޓިކުން އަނބުރާ އެސްއެމްއެސް އަށް ވެއްޓޭނެ:
{
"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)
- ކެރިއަރ ރެސްޓްރިކްޝަންސް ޗެކްކުރުން
- އެސްއެމްއެސް ފޯލްބެކް ޓްރައި ކޮށްލައްވާ
ޕެޓަރން ނުގުޅޭ
- ރަނގަޅު ކޯލަރ އައިޑީ ކެޕްޗާރ ކުރެވޭތޯ ބެލުން
- ޑިޖިޓް ނޫން އަކުރުތައް ސްޓްރިޕްކުރުން
- ޕެޓަރން ފޯމެޓް ޗެކްކުރުން
- ޓީޓީއެލް މުއްދަތުގެ ތެރޭގައި ޔަގީންކުރުން
ހުއްދައަށް އިންކާރުކޮށްފި
- ހުއްދަ ހޯދުމަށް ރަނގަޅަށް އެދި ހުށަހެޅުން
- ހުއްދަތައް ބޭނުންވާ ސަބަބު ބަޔާންކުރުން
- އަލްޓަރނޭޓިވް (އެސްއެމްއެސް) ފޯރުކޮށްދިނުން
- ޝަރަފުވެރިކަމާއެކު ޙަވާލުކުރުން
ދެން އަޅަންޖެހޭ ފިޔަވަޅުތައް
- ވައިބަރ އޯޓީޕީ - ބަދަލު އޯޓީޕީ ޑެލިވަރީ
- އެސްއެމްއެސް މެސެޖުތައް - އެސްއެމްއެސް ފޯލްބެކް
- ޗެކް ސްޓޭޓަސް - ފްލެޝް ކޯލް ސްޓޭޓަސް ޓްރެކްކުރުން