WappSync
A

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.

Hogyan Működik

1

Ö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ő.

2

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.

3

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ő adatLeírás
businessidAz Ön numerikus üzleti ID-ja
businesskeyA titkos kulcsa - soha ne ossza meg, és ne tegye kliensoldali kódba
Fontos: Minden API-hívásnak az Ön backendjéről kell érkeznie. A 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üldegy N telefonszámotsemmit (nincs szám)
Mi kerül hitelesítésrehogy a hívó kifejezetten a(z) N számot birtokoljaamelyik szám ténylegesen visszaküldi a kódot
Tipikus használatbejelentkezé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éseWhatsAppon 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ényeA sender_matches_intended megmutatja, hogy a küldő a(z) N szám-ephoneEnc maga a hitelesített szám; a sender_matches_intended hiányzik
Biztonság: A 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ípusLeírás
businessidintAz Ön üzleti ID-ja
businessrefstringEgyedi hivatkozás, amelyet ehhez a hitelesítési kéréshez generál (pl. bin2hex(random_bytes(4)))
phonestringA felhasználó telefonszáma nemzetközi formátumban (+40755123456). confirm_phone módban kötelező; verify_sender esetén hagyja el vagy üresen.
modestringOpcionális - confirm_phone (alapértelmezett, ha telefonszámot ad meg) vagy verify_sender (alapértelmezett, ha nincs telefonszám)
on_mismatchstringOpcioná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)
tsintAktuális Unix időbélyeg
hmacstringHMAC-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ípusLeírás
statusstring"ok" or "error"
reverseotp_displaystringA kód, amelyet a felhasználója küld, pl. "2FA-828161"
waphonestringA WhatsApp szám, AMELYRE a felhasználója a kódot küldi
logincodestringBelső kód a lekérdezéshez
in_tsintIdőbélyeg a lekérdezési kéréshez
out_tsintVálasz időbélyege
otp_valid_minutesintMennyi ideig érvényes a kód (alapértelmezés: 10)
modestringAz aktív mód: confirm_phone vagy verify_sender
deliverystringpushed_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)
hmacstringA 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ípusLeírás
businessidintAz Ön üzleti ID-ja
businessrefstringUgyanaz a hivatkozás, mint az előző hívásban
logincodestringA logincode a getReverseOTP válaszából
in_tsintAz eredeti ts a getReverseOTP kérésből
hmacstringHMAC-SHA256 értéke: {businessid}|{businessref}|{logincode}|{in_ts}

Válasz

MezőTípusJelentés
used0⏳ Még várakozás - kérdezzen le újra
used1✅ Épp most ellenőrizve - az első ezt látó lekérdezés felhasználja
used2🔒 Egy korábbi lekérdezés már felhasználta
auth1A felhasználó ellenőrizve - jelentkeztesse be!
phoneEncstringAES-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)
triesintA sikertelen kísérleteket számoljuk (hibás kód vagy hibás telefon)
expiredbooltrue, ha túl sok sikertelen kísérlet történt (próbák ≥ 4) - kérjen új OTP-t
modestringA kérés módja: confirm_phone vagy verify_sender
sender_matches_intendedboolconfirm_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_tsintVálasz időbélyege
hmacstringHMAC - 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:

HTTPmessageMikor
400Missing required parametersElfelejtett kitölteni egy kötelező mezőt
400A phone is required in confirm_phone modeconfirm_phone kérés telefonszám nélkül
400Invalid mode / Invalid on_mismatchIsmeretlen enum érték
400The phone number is invalid or not a mobile number.Hibás telefonszámformátum
403Unknown or invalid business IDHibás businessid
403Invalid HMACAz aláírás nem egyezik - ellenőrizze az aláírandó karaktersorozatot
409This request was already used.Ismétlődő businessref+in_ts

Biztonság

🔐 HMAC-signedMinden kérést és választ a businesskey értékével ellenőrzünk
📱 Módtól függő telefonszám-egyeztetésconfirm_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ódokKé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-useA kódok 0→1→2 állapotba kerülnek, soha nem használhatók újra
⏱ Time-limitedA kódok 10 perc után lejárnak, legfeljebb 4 kézbesítési kísérlet
🔒 Nincsenek kliens titkokA 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.