Thirrje flash
Flash Call është një metodë verifikimi telefonik që përdor një telefonatë të humbur në vend të SMS për të verifikuar numrat e telefonit. Është më i shpejtë, më i sigurt dhe me kosto efektive.
Përmbledhje
Verifikimi i thirrjeve flash funksionon nga:
- Verifikimi i kërkesave të përdoruesit
- Sistemi fillon një telefonatë në telefonin e përdoruesit
- Telefonata ndërpritet automatikisht pas 1-2 zileve
- Aplikacioni i përdoruesit kap ID-në e telefonuesit
- ID-ja e telefonuesit verifikohet kundrejt modelit të pritur
- Përdoruesi është vërtetuar
Përfitimet
Me kosto efektive
- Deri në 10 herë më lirë se SMS
- Nuk ka tarifa për dërgimin e mesazheve
- Ulja e kostove për verifikimin me volum të lartë
Më shpejt
- Verifikimi i menjëhershëm (1-3 sekonda)
- Nuk ka pritje për dërgimin e SMS
- Përvojë më e mirë e përdoruesit
Më i sigurt
- Më e vështirë për t'u përgjuar sesa SMS
- Nuk ka OTP të dukshme në njoftime
- Rezistent ndaj sulmeve të shkëmbimit të kartave SIM
Arritja globale
- Punon në vendet me kufizime SMS
- Nuk ka probleme me filtrimin e SMS
- Pajtueshmëria universale e telefonit
Thirrje bazë flash
Kërkesë
{
"from": "YourApp",
"to": "+380XXXXXXXXX",
"type": "flashcall",
"messageData": {
"callerId": "+380123456789"
}
}
Parametrat
| Parametri | Lloji | Kërkohet | Përshkrimi |
|---|---|---|---|
| "nga" | varg | Po | Identifikuesi juaj i dërguesit |
për |
varg | Po | Numri i telefonit të marrësit (E.164) |
| 'lloj' | varg | Po | Cakto në "flashcall" |
Identifikimi i thirrësit |
varg | Po | Numri i telefonit që do të telefonojë përdoruesin |
ttl |
numër i plotë | Jo | Koha për të jetuar në sekonda (parazgjedhja: 60) |
Si funksionon
1. Përdoruesi fut numrin e telefonit
Përdoruesi jep numrin e tij të telefonit në aplikacionin tuaj:
KODI_BLOCK_1
2. Kërko Call Flash
Serveri juaj kërkon verifikimin e thirrjeve 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. Përgjigja në API
API kthen modelin e pritur të ID-së së thirrësit:
KODI_BLOCK_3
4. Filloni thirrjen
Sistemi fillon një telefonatë në telefonin e përdoruesit dhe përfundon pas 1-2 zileve.
5. Kapni ID-në e thirrësit
Aplikacioni i përdoruesit kap ID-në e telefonuesit të thirrjes hyrëse:
// Android example
val cursor = contentResolver.query(
CallLog.Calls.CONTENT_URI,
arrayOf(CallLog.Calls.NUMBER),
null, null,
CallLog.Calls.DATE + " DESC"
)
6. Verifiko modelin
Krahasoni ID-në e telefonuesit të kapur me modelin e pritur:
// 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);
}
Shembuj zbatimi
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
}
}
Ueb (në anën e serverit)
// 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' });
}
});
Formati i përgjigjes
Përgjigja e suksesit
{
"messagelistId": 123456,
"messages": [
{
"messageId": "abc123def456",
"status": "accepted",
"callerId": "+380123456789",
"pattern": "***456789",
"to": "+380XXXXXXXXX",
"ttl": 60
}
]
}
Fushat e përgjigjes
| Fusha | Lloji | Përshkrimi |
|---|---|---|
Id mesazhi |
varg | ID unike e verifikimit |
| "statusi" | varg | Statusi: pranuar, refuzuar |
Identifikimi i thirrësit |
varg | Numri i plotë i identifikimit të thirrësit |
| "modeli" | varg | Modeli për t'u përputhur (shifra + yje) |
për |
varg | Numri i telefonit të marrësit |
ttl |
numër i plotë | Periudha e vlefshmërisë në sekonda |
Përputhja e modelit
API kthen një model me yje që maskojnë disa shifra:
Aplikacioni juaj duhet:
- Regjistroni ID-në e telefonuesit në hyrje
- Nxirrni shifrat nga ID-ja e telefonuesit
- Përputhja me modelin (yjet = çdo shifër)
- Verifikoni përputhjen brenda periudhës TTL
Rikthim në SMS
Nëse Flash Call dështon, kthehu automatikisht në SMS:
{
"from": "YourApp",
"to": "+380XXXXXXXXX",
"type": "flashcall",
"messageData": {
"callerId": "+380123456789"
},
"fallback": {
"type": "sms",
"text": "Your verification code is: 123456"
},
"ttl": 60
}
Rastet e përdorimit
Regjistrimi i llogarisë
Verifikoni numrat e telefonit gjatë regjistrimit pa kosto SMS.
Verifikimi i hyrjes
Autentifikimi me dy faktorë duke përdorur thirrje flash.
Përditësimi i numrit të telefonit
Verifiko numrin e ri të telefonit kur përdoruesi përditëson profilin.
Konfirmimi i transaksionit
Konfirmoni transaksionet me vlerë të lartë me thirrje flash.
Praktikat më të mira
TTL
- ✅ Cakto TTL në 60-90 sekonda
- ✅ Lejo përdoruesin të provojë sërish pas skadimit
- ❌ Mos përdorni TTL më shumë se 120 sekonda
Përvoja e përdoruesit
- Shfaq mesazhin "Në pritje të telefonatës...".
- Shfaq kohëmatësin e numërimit mbrapsht (60 sekonda)
- Jep opsionin "Përdor SMS në vend"
- Zbuloni dhe verifikoni automatikisht ID-në e telefonuesit
Trajtimi i gabimeve
- Trajtoni lejet e telefonit që mungojnë
- Kohëzgjatja pas skadimit të TTL
- Siguroni opsionin e kthimit të SMS
- Trego mesazhe të qarta gabimi
Lejet
Kërkoni lejet e telefonit përpara thirrjes flash:
Android:
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_CALL_LOG" />
iOS:
Testimi
- Provoni në pajisje të ndryshme
- Provoni me bartës të ndryshëm
- Testoni skenarët e refuzimit të lejes
- Testoni skenarët e skadimit të rrjetit
Kufizime
Mbështetje e platformës
- Punon në të gjitha pajisjet celulare
- Kërkon aftësi për thirrje telefonike
- Ka nevojë për leje READ_PHONE_STATE
- Mund të mos funksionojë në tableta pa telefon
Rrjeti
- Kërkon lidhje aktive telefonike
- Mund të dështojë në kushte të këqija të rrjetit
- Mund të zbatohen kufizime të operatorit
- Tarifat ndërkombëtare mund të ndryshojnë
Privatësia
- Përdoruesit mund të bllokojnë numra të panjohur
- Disa pajisje kanë bllokim të thirrjeve
- Kërkon leje të qarta
- Merrni parasysh shqetësimet e privatësisë së përdoruesit
Zgjidhja e problemeve
Telefonata nuk u mor
- Kontrollo që telefoni ka sinjal
- Verifiko formatin e numrit (E.164)
- Kontrolloni kufizimet e operatorit
- Provoni kthimin e SMS-ve
Modeli nuk përputhet
- Siguroni kapjen e saktë të ID-së së telefonuesit
- Zhduk karakteret joshifrore
- Kontrolloni formatin e modelit
- Verifiko brenda periudhës TTL
Leja u refuzua
- Kërkoni lejet siç duhet
- Shpjegoni pse nevojiten lejet
- Jep alternativë (SMS)
- Trajto me hijeshi
Hapat e ardhshëm
- Viber OTP - Dorëzimi alternativ OTP
- Mesazhe SMS - kthim SMS
- Kontrollo statusin - Gjurmo statusin e telefonatës flash