Ֆլեշ զանգ
Flash Call-ը հեռախոսի հաստատման մեթոդ է, որն օգտագործում է բաց թողնված զանգ SMS-ի փոխարեն հեռախոսահամարները ստուգելու համար: Այն ավելի արագ է, ավելի ապահով և ծախսարդյունավետ:
Տեսություն
Ֆլեշ զանգի ստուգումն աշխատում է՝
- Օգտագործողի հարցումների ստուգում
- Համակարգը սկսում է զանգ դեպի օգտվողի հեռախոս
- Զանգը ավտոմատ կերպով դադարեցվում է 1-2 զանգից հետո
- Օգտատիրոջ հավելվածը գրավում է զանգահարողի ID-ն
- Զանգահարողի ID-ն ստուգվում է ակնկալվող օրինակով
- Օգտագործողը վավերացված է
Առավելությունները
ծախսարդյունավետ
- 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. Օգտագործողը մուտքագրում է հեռախոսահամարը
Օգտագործողը տրամադրում է իր հեռախոսահամարը ձեր հավելվածում.
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-ն վերադարձնում է մի նախշ՝ աստղանիշներով, որոնք քողարկում են որոշ թվանշաններ.
Ձեր հավելվածը պետք է.
- Լուսանկարեք մուտքային զանգահարողի ID-ն
- Քաղեք թվեր զանգահարողի ID-ից
- Համընկնել օրինակին (աստղանիշ = ցանկացած թվանշան)
- Ստուգեք համընկնումը 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:**
Թեստավորում
- Փորձարկում տարբեր սարքերի վրա
- Փորձարկել տարբեր կրիչներով
- Փորձարկել թույլտվության մերժման սցենարները
- Փորձարկեք ցանցի ժամանակի սպառման սցենարները
Սահմանափակումներ
Պլատֆորմի աջակցություն
- Աշխատում է բոլոր շարժական սարքերի վրա
- Պահանջում է հեռախոսազանգերի հնարավորություն
- Պահանջվում է READ_PHONE_STATE թույլտվություն
- Կարող է չաշխատել պլանշետներում առանց հեռախոսի
Ցանց
- Պահանջում է ակտիվ հեռախոսային կապ
- Ցանցի վատ պայմաններում կարող է ձախողվել
- Օպերատորի սահմանափակումները կարող են կիրառվել
- Միջազգային գները կարող են տարբեր լինել
Գաղտնիություն
- Օգտագործողները կարող են արգելափակել անհայտ համարները
- Որոշ սարքեր ունեն զանգերի արգելափակում
- Պահանջում է հստակ թույլտվություններ
- Հաշվի առեք օգտվողների գաղտնիության հետ կապված խնդիրները
Անսարքությունների վերացում
Զանգ չի ստացվել
- Ստուգեք հեռախոսի ազդանշանը
- Ստուգեք համարի ձևաչափը (E.164)
- Ստուգեք կրիչի սահմանափակումները
- Փորձեք SMS վերադարձը
Չհամապատասխանող նախշը
- Համոզվեք, որ ճիշտ զանգահարողի ID-ն է
- Հեռացրեք ոչ թվային նիշերը
- Ստուգեք օրինաչափության ձևաչափը
- Ստուգեք TTL ժամանակահատվածում
Թույլտվությունը մերժված է
- Խնդրեք թույլտվությունները պատշաճ կերպով
- Բացատրեք, թե ինչու են անհրաժեշտ թույլտվությունները
- Տրամադրել այլընտրանքային (SMS)
- Նրբագեղորեն վարվեք
Հաջորդ քայլերը
- Viber OTP - Այլընտրանքային OTP առաքում
- SMS Messages - Հետադարձ SMS
- Ստուգեք կարգավիճակը - Հետևեք ֆլեշ զանգի կարգավիճակին