Tim LessOTP

Inbound WhatsApp Authentication vs SMS OTP Tradisional

Bandingkan biaya, keamanan, dan UX inbound WhatsApp authentication dengan SMS OTP, lalu uji signed webhook LessOTP tanpa biaya.

WhatsAppAuthenticationSMS OTPWebhook
Inbound WhatsApp Authentication vs SMS OTP Tradisional
Bagikan artikel:XThreads

Mengapa SMS OTP menambah biaya dan friksi?

SMS OTP mengharuskan aplikasi mengirim kode, menunggu delivery provider, lalu meminta pengguna menyalin kode tersebut kembali. Biaya muncul pada setiap pengiriman, termasuk pesan yang terlambat atau tidak pernah selesai diverifikasi.

Inbound authentication membalik alurnya: pengguna membuka WhatsApp dan mengirim /START code ke nomor resmi LessOTP. Aplikasi menerima hasil melalui webhook yang ditandatangani, dan kredit hanya dipotong saat verifikasi production sukses.

Perbandingan alur

AspekSMS OTPInbound WhatsApp
Arah pesanPlatform → penggunaPengguna → platform
Input penggunaSalin dan ketik OTPKirim pesan yang sudah terisi
Billing LessOTPTidak berlakuHanya verifikasi production sukses
Hasil ke aplikasiCek kode via endpointWebhook HMAC + idempotency key

Coba request staging tanpa biaya

Buat App dengan mode staging, generate API key, lalu jalankan request berikut. Staging menggunakan verification engine dan client webhook yang sama, tetapi tidak mengirim pesan WhatsApp riil dan tidak memotong kredit.

curl -X POST https://lessotp.com/api/v1/staging/auth/request \
  -H "Authorization: Bearer YOUR_STAGING_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "channel": "whatsapp"
  }'

Response yang diharapkan:

{
  "status": "success",
  "data": {
    "request_id": "req_8f7d6c5b4a",
    "unique_code": "A7X92",
    "channel": "whatsapp",
    "wa_link": "https://wa.me/628999999999?text=/START+A7X92",
    "expires_in": 180,
    "mode": "frictionless"
  }
}

Setelah request dibuat, buka Dashboard → Simulator dan jalankan synthetic inbound. Webhook URL App Anda akan menerima payload seperti ini:

{
  "event": "verification.success",
  "channel": "whatsapp",
  "request_id": "req_8f7d6c5b4a",
  "phone_number": "6281234567890",
  "timestamp": "2026-08-24T10:00:00Z"
}

Verifikasi signature dan delivery duplikat

Hitung HMAC SHA-256 dari raw request body menggunakan signing secret App. Bandingkan secara constant-time, lalu simpan header Idempotency-Key agar retry tidak memproses login dua kali.

import { createHmac, timingSafeEqual } from "node:crypto";

function verifyLessOTPWebhook(rawBody: string, signature: string, secret: string) {
  const expected = createHmac("sha256", secret).update(rawBody).digest("hex");
  const received = Buffer.from(signature, "hex");
  const expectedBuffer = Buffer.from(expected, "hex");

  return received.length === expectedBuffer.length &&
    timingSafeEqual(received, expectedBuffer);
}

// Simpan Idempotency-Key dan abaikan delivery yang sudah pernah diproses.

Lihat kontrak payload, retry, dan error code lengkap di dokumentasi API LessOTP.

Lihat signed webhook dalam kurang dari 5 menit

Masuk dengan phone-first authentication, buat Staging App, lalu jalankan Simulator. Tidak ada pesan provider riil dan tidak ada debit kredit.

Mulai uji staging
Bagikan artikel:XThreads