WappSync Phone Verify - API dokumentáció
Telefonos ellenőrzés, ahol a felhasználója kódot küld nekünk WhatsAppon keresztül - nincs OTP gépelés, egy koppintás, teljesen ellenőrizve.
Tartalom
Hogyan Működik
Ön kódot kér
A backendje meghívja az API-nkat a felhasználó telefonszámával. Visszaadunk egy egyedi kódot és a WhatsApp számot, amelyre elküldhető.
A felhasználó elküldi WhatsAppon
A felhasználója egy WhatsApp linkre koppint - a kód előre kitöltött. Nincs gépelés, nincs másolás-beillesztés. Csak elküldi.
Azonnal ellenőrizve
Megkapjuk az üzenetet, látjuk, melyik WhatsApp számról érkezett, és a lekérdezése auth=1 értéket ad vissza a hitelesített telefonszámmal. Kész!
Szerezze meg a hitelesítő adatait
Regisztráljon a wappsync.com/mybusiness oldalon, hogy megkapja:
| Hitelesítő adat | Leírás |
|---|---|
businessid | Az Ön numerikus üzleti ID-ja |
businesskey | A titkos kulcsa - soha ne ossza meg, és ne tegye kliensoldali kódba |
businesskey az HMAC-aláíráshoz szolgál, és soha nem jelenhet meg böngésző JavaScriptben, HTML-forrásban vagy mobilalkalmazás kódjában.Két ellenőrzési mód
A Phone Verify két módban működik, kérésenként választhatóan. Mindkettőben a felhasználója küldi a kódot nekünk WhatsAppon keresztül - az egyetlen különbség, hogy melyik telefonszám kerül hitelesítésre.
confirm_phone (default) | verify_sender | |
|---|---|---|
| Ön küld | egy N telefonszámot | semmit (nincs szám) |
| Mi kerül hitelesítésre | hogy a hívó kifejezetten a(z) N számot birtokolja | amelyik szám ténylegesen visszaküldi a kódot |
| Tipikus használat | bejelentkezés / helyreállítás nyilvántartott számon, SIM-csere elleni védelem | új regisztráció - „adj egy valódi, igazolt telefont ehhez az ügyfélhez” |
| Kód kézbesítése | WhatsAppon elküldve a(z) N számra, és megjelenítve a felületén (delivery: pushed_to_phone) | csak Önön keresztül (delivery: relay_by_business) - Ön adja át a kódot az ügyfelének |
| Lekérdezés eredménye | A sender_matches_intended megmutatja, hogy a küldő a(z) N szám-e | phoneEnc maga a hitelesített szám; a sender_matches_intended hiányzik |
confirm_phone egy adott megadott szám feletti kontrollt igazol; a verify_sender valamely szám feletti kontrollt igazol, és megmondja, melyiket. Ha a folyamatához az kell, hogy „a fiókon lévő szám valóban a felhasználóé”, maradjon a confirm_phone módnál on_mismatch: reject beállítással.Javított telefonszám (on_mismatch): gyakori eset, hogy az ügyfél A számot ad meg, de B számról küldi a kódot (elgépelés / dual-SIM). confirm_phone módban a reject (az alapértelmezett) sikertelen kísérletnek tekinti; az accept_sender ehelyett a tényleges B küldőt hitelesíti (sender_matches_intended: false, phoneEnc = B), és az Ön backendje dönti el, hogy elfogadja-e a javított B számot, vagy új OTP-t kér az A számhoz.
Fordított OTP kérése
Ezt a backendjéről hívja meg, amikor felhasználót kell ellenőriznie:
POSThttps://wappsync.com/phone-verify/api/getReverseOTP
Kérés törzse (JSON)
| Mező | Típus | Leírás |
|---|---|---|
businessid | int | Az Ön üzleti ID-ja |
businessref | string | Egyedi hivatkozás, amelyet ehhez a hitelesítési kéréshez generál (pl. bin2hex(random_bytes(4))) |
phone | string | A felhasználó telefonszáma nemzetközi formátumban (+40755123456). confirm_phone módban kötelező; verify_sender esetén hagyja el vagy üresen. |
mode | string | Opcionális - confirm_phone (alapértelmezett, ha telefonszámot ad meg) vagy verify_sender (alapértelmezett, ha nincs telefonszám) |
on_mismatch | string | Opcionális (csak confirm_phone) - reject (alapértelmezett) vagy accept_sender (a tényleges küldő hitelesítése, ha a kód más számról érkezik) |
ts | int | Aktuális Unix időbélyeg |
hmac | string | HMAC-SHA256 aláírás |
HMAC aláírás
Írja alá ezt a karaktersorozatot a businesskey értékével:
{businessid}|{businessref}|{phone}|{ts}
verify_sender módban nincs telefonszám, így az aláírt karaktersorozat {businessid}|{businessref}||{ts} (üres középső hely).
Példa:
$hmac = hash_hmac('sha256', "{$businessid}|{$businessref}|{$phone}|{$ts}", $businesskey);
Válasz
| Mező | Típus | Leírás |
|---|---|---|
status | string | "ok" or "error" |
reverseotp_display | string | A kód, amelyet a felhasználója küld, pl. "2FA-828161" |
waphone | string | A WhatsApp szám, AMELYRE a felhasználója a kódot küldi |
logincode | string | Belső kód a lekérdezéshez |
in_ts | int | Időbélyeg a lekérdezési kéréshez |
out_ts | int | Válasz időbélyege |
otp_valid_minutes | int | Mennyi ideig érvényes a kód (alapértelmezés: 10) |
mode | string | Az aktív mód: confirm_phone vagy verify_sender |
delivery | string | pushed_to_phone (confirm_phone: a kódot WhatsAppon a megadott telefonszámra is elküldjük) vagy relay_by_business (verify_sender: a kódot Önnek kell eljuttatnia az ügyfeléhez) |
hmac | string | A válasz HMAC-ja - ellenőrizze a businesskey értékével |
Ellenőrizze a válasz HMAC-ját against {businessid}|{businessref}|{logincode}|{reverseotp_display}|{waphone}|{out_ts}.
Mit mutasson a felhasználójának
Jelenítse meg a kódot és a telefonszámot. Használjon whatsapp://send linket, hogy a felhasználó egy koppintással elküldhesse:
<a href="whatsapp://send?phone=40725296320&text=2FA-828161">
💬 Send Code via WhatsApp
</a>
Lekérdezés az ellenőrzéshez
Kérdezze le 2-3 másodperc amíg a felhasználó ellenőrzésre nem kerül:
POSThttps://wappsync.com/phone-verify/api/getReverseOTPStatus
Kérés törzse (JSON)
| Mező | Típus | Leírás |
|---|---|---|
businessid | int | Az Ön üzleti ID-ja |
businessref | string | Ugyanaz a hivatkozás, mint az előző hívásban |
logincode | string | A logincode a getReverseOTP válaszából |
in_ts | int | Az eredeti ts a getReverseOTP kérésből |
hmac | string | HMAC-SHA256 értéke: {businessid}|{businessref}|{logincode}|{in_ts} |
Válasz
| Mező | Típus | Jelentés |
|---|---|---|
used | 0 | ⏳ Még várakozás - kérdezzen le újra |
used | 1 | ✅ Épp most ellenőrizve - az első ezt látó lekérdezés felhasználja |
used | 2 | 🔒 Egy korábbi lekérdezés már felhasználta |
auth | 1 | A felhasználó ellenőrizve - jelentkeztesse be! |
phoneEnc | string | AES-256-CBC titkosítású hitelesített telefonszám (csak auth=1 esetén) - a küldő, amikor kód érkezett (szigorú confirm_phone esetén megegyezik a megadott számával) |
tries | int | A sikertelen kísérleteket számoljuk (hibás kód vagy hibás telefon) |
expired | bool | true, ha túl sok sikertelen kísérlet történt (próbák ≥ 4) - kérjen új OTP-t |
mode | string | A kérés módja: confirm_phone vagy verify_sender |
sender_matches_intended | bool | confirm_phone esetén, kód beérkezése után - true = a küldő az a szám, amelyet ellenőrizni kért; false = egy javított küldő lett hitelesítve. verify_sender módban hiányzik. |
out_ts | int | Válasz időbélyege |
hmac | string | HMAC - ellenőrizze ezzel: {businessid}|{businessref}|{logincode}|{used}|{phoneEnc}|{out_ts} |
Amikor auth === 1, érvényes kód érkezett. Fejtse vissza a phoneEnc értéket a hitelesített telefonszám megszerzéséhez (ellenőrizze a sender_matches_intended értéket confirm_phone módban), majd jelentkeztesse be a felhasználót.
A telefonszám visszafejtése
Amikor auth=1, a phoneEnc tartalmazza a hitelesített telefonszámot (a küldőt, amely igazolta magát), AES-256-CBC-vel titkosítva a businesskey értékével:
function decryptPhoneAES($encryptedData, $businesskey) {
$method = 'AES-256-CBC';
$key = hash('sha256', $businesskey, true);
$enc = str_replace(['-', '_'], ['+', '/'], $encryptedData);
$enc = str_pad($enc, strlen($enc) % 4 === 0
? strlen($enc) : strlen($enc) + 4 - strlen($enc) % 4,
'=', STR_PAD_RIGHT);
$decoded = base64_decode($enc);
$iv = substr($decoded, 0, 16);
$ciphertext = substr($decoded, 16);
return openssl_decrypt($ciphertext, $method, $key, OPENSSL_RAW_DATA, $iv);
}
$phone = decryptPhoneAES($response['phoneEnc'], $businesskey);
// Store this phone - it's the user's verified identity
Frontend példa
Az egyetlen szükséges felület - jelenítse meg, miután a backendje meghívta a getReverseOTP végpontot:
<div style="text-align:center; max-width:400px; margin:auto;">
<p>Send this exact code via WhatsApp from your phone:</p>
<div style="font-size:28px; font-weight:bold; color:#25D366;
letter-spacing:3px;">
2FA-828161
</div>
<p>to <strong>+40 725 296 320</strong></p>
<a href="whatsapp://send?phone=40725296320&text=2FA-828161"
style="display:inline-block; padding:14px 30px; background:#25D366;
color:white; font-size:18px; font-weight:bold; border-radius:8px;
text-decoration:none; margin-top:12px;">
💬 Send via WhatsApp
</a>
<p style="color:#888; font-size:13px; margin-top:12px;">
⏱ Code expires in 10 minutes - no typing required!
</p>
</div>
Teljes PHP példa
Másolásra kész. Cserélje ki a YOUR_BUSINESS_ID és 'your-secret-key' értékeket a wappsync.com/mybusiness oldalon kapott értékekre.
<?php
$businessid = YOUR_BUSINESS_ID; // from wappsync.com/mybusiness
$businesskey = 'your-secret-key'; // from wappsync.com/mybusiness - keep server-side
// ── Step 1: Request reverse OTP ──
$businessref = bin2hex(random_bytes(4));
$phone = $_POST['phone']; // user's phone from your form
$ts = time();
$hmac = hash_hmac('sha256',
"{$businessid}|{$businessref}|{$phone}|{$ts}",
$businesskey
);
$response = callAPI('https://wappsync.com/phone-verify/api/getReverseOTP', [
'businessid' => $businessid,
'businessref' => $businessref,
'phone' => $phone,
'ts' => $ts,
'hmac' => $hmac,
]);
$data = json_decode($response, true);
$code = $data['reverseotp_display']; // "2FA-828161"
$waphone = $data['waphone']; // "+40725296320"
$logincode = $data['logincode'];
$in_ts = $data['in_ts'];
// ── Show the code to your user (render frontend example above) ──
// ── Step 2: Poll until verified ──
$maxAttempts = 40; // ~2 minutes at 3s intervals
$attempt = 0;
do {
sleep(3);
$attempt++;
$hmac = hash_hmac('sha256',
"{$businessid}|{$businessref}|{$logincode}|{$in_ts}",
$businesskey
);
$response = callAPI(
'https://wappsync.com/phone-verify/api/getReverseOTPStatus',
[
'businessid' => $businessid,
'businessref' => $businessref,
'logincode' => $logincode,
'in_ts' => $in_ts,
'hmac' => $hmac,
]
);
$data = json_decode($response, true);
} while (($data['auth'] ?? 0) !== 1 && $attempt < $maxAttempts);
if (($data['auth'] ?? 0) === 1) {
// ✅ Verified - log the user in!
$phone = decryptPhoneAES($data['phoneEnc'], $businesskey);
$_SESSION['user_phone'] = $phone;
header('Location: /dashboard');
exit;
} else {
echo "Verification timed out. Please try again.";
}
// ── Helper ──
function callAPI($url, $payload) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
return $response;
}
verify_sender: küldje a phone => '' értéket (és opcionálisan mode => 'verify_sender') - WhatsApp üzenet nem kerül kiküldésre, így a reverseotp_display kódot Önnek kell továbbadnia az ügyfelének. auth=1 esetén a phoneEnc visszafejtve a hitelesített küldő számát adja; nincs sender_matches_intended, amit ellenőrizni kellene.
accept_sender: confirm_phone módban adja hozzá a 'on_mismatch' => 'accept_sender' beállítást. Ha auth=1 és a sender_matches_intended értéke false, a hitelesített szám eltér a kérttől - fogadja el javított számként, vagy kérjen új OTP-t a valóban szükséges számhoz.
Hibakezelés
Az API "status": "error" értéket ad vissza egy olvasható message mezővel:
| HTTP | message | Mikor |
|---|---|---|
| 400 | Missing required parameters | Elfelejtett kitölteni egy kötelező mezőt |
| 400 | A phone is required in confirm_phone mode | confirm_phone kérés telefonszám nélkül |
| 400 | Invalid mode / Invalid on_mismatch | Ismeretlen enum érték |
| 400 | The phone number is invalid or not a mobile number. | Hibás telefonszámformátum |
| 403 | Unknown or invalid business ID | Hibás businessid |
| 403 | Invalid HMAC | Az aláírás nem egyezik - ellenőrizze az aláírandó karaktersorozatot |
| 409 | This request was already used. | Ismétlődő businessref+in_ts |
Biztonság
| 🔐 HMAC-signed | Minden kérést és választ a businesskey értékével ellenőrzünk |
| 📱 Módtól függő telefonszám-egyeztetés | confirm_phone ellenőrzi, hogy a küldő megegyezik a kért számmal; a verify_sender / accept_sender csak a tényleges küldőt hitelesíti - soha nem olyan számot, amely nem küldött üzenetet |
| 🎯 Egyedi élő kódok | Két függőben lévő kód nem azonos, így a beérkező kód egyértelműen egy kéréshez rendelhető |
| 🔂 Single-use | A kódok 0→1→2 állapotba kerülnek, soha nem használhatók újra |
| ⏱ Time-limited | A kódok 10 perc után lejárnak, legfeljebb 4 kézbesítési kísérlet |
| 🔒 Nincsenek kliens titkok | A businesskey a szerverén marad; soha nem kerül böngészőkódba |
| 🛡 AES-256 titkosítású | A válaszokban szereplő telefonszámok a businesskey értékével vannak titkosítva |
Próbálja ki élőben
🎮 Demó bejelentkezési folyamat - működő demó, amely bemutatja a teljes felhasználói élményt.
🧪 API teszteszköz - a saját businessid és businesskey értékeit igényli innen: wappsync.com/mybusiness.