Key Takeways
- Setiap Integrasi API OTP turun ke dua titik akhir REST: mengirim (mengembalikan ID verifikasi) dan memvalidasi (menerima ID dan kode, mengembalikan status terverifikasi).
- Integrasi kualitas produksi menangani 5 kategori kesalahan spesifik: nomor tidak valid, ketidakcocokan kode, kedaluwarsa, tarif terbatas, terdeteksi penipuan.
- Gunakan webhook untuk status pengiriman asinkron daripada polling, dan selalu verifikasi header tanda tangan.
- Daftar periksa produksi 12 item sebelum membalik bendera fitur: rahasia, libphonenumber, SMS Retriever, WebOTP, dropdown negara, pengatur waktu kirim ulang, fallback multi-saluran, webhook yang ditandatangani, peringatan, batas kecepatan lapisan aplikasi, penanganan STOP, runbook.
- Pilih bahasa yang digunakan layanan autentikasi Anda — REST adalah REST, SDK sebagian besar kosmetik.
Jika Anda seorang pengembang yang mengevaluasi API OTP untuk aplikasi yang ditargetkan AS pada tahun 2026, Anda tidak menginginkan halaman pemasaran lain, Anda ingin kode yang berfungsi. Panduan ini adalah panduan langsung untuk mengintegrasikan API verifikasi nomor telepon ke dalam aplikasi produksi: referensi titik akhir REST, sampel kode kerja di Node.js, Python, PHP, dan Java, penanganan kesalahan, penanganan webhook, pengujian kotak pasir, dan daftar periksa produksi sebelum Anda membalik flag fitur.
Semua contoh menggunakan titik akhir REST VerifyNow, tetapi polanya ditransfer ke sebagian besar API OTP modern (Verifikasi Twilio, Verifikasi Vonage, Verifikasi Sinch) dengan sedikit perubahan. Jika masalah khusus AS berlaku (perutean 10DLC, opt-in TCPA, perlindungan penipuan), kami akan menyebutnya secara sebaris.
Dua Titik Akhir yang Anda Butuhkan
Setiap aliran verifikasi OTP bermuara pada dua panggilan REST, terlepas dari penyedia:
- POST/verifikasi/kirim: menghasilkan OTP, memilih saluran optimal (SMS, WhatsApp, suara), dan mengirim kode ke ponsel pengguna. Mengembalikan ID verifikasi untuk panggilan berikutnya.
- POST/verifikasi/validasi: menerima ID verifikasi dan kode yang dimasukkan pengguna. Mengembalikan sukses/kegagalan ditambah kode kesalahan pada kegagalan.
Segala sesuatu yang lain (preferensi saluran, kebijakan coba ulang, alihan perlindungan penipuan) adalah konfigurasi pada panggilan kirim. Sebagian besar penyedia mengekspos 8-12 parameter opsional; defaultnya masuk akal untuk ~ 80% kasus penggunaan.
Node.js: Kirim dan Verifikasi OTP
//Instal: npm instal axios
const axios = membutuhkan ('axios');
const API_BASE = 'https://cpaas.messagecentral.com/verification/v3';
const API_KEY = Proses.env.mc_API_KEY;
fungsi async sendOTP (PhoneNumber, saluran = 'SMS') {
respons const = menunggu axios.post (`$ {API_BASE} /send`, {
Kode Negara: '1',
Nomor Ponsel: Nomor Telepon,
FlowType: saluran,//'SMS' | 'WHATSAPP' | 'SUARA'
Panjang OTPl: 6,
}, {
header: {'AuthToken': API_KEY}
});
mengembalikan response.data.data.verificationId;
}
fungsi asinkron verifyOTP (VerificationId, kode) {
respons const = menunggu axios.post (`$ {API_BASE} /validate`, {
ID Verifikasi,
kode,
}, {
header: {'AuthToken': API_KEY}
});
mengembalikan response.data.data.verificationStatus === 'DIVERIFIKASI';
}
//Penggunaan dalam aliran autentikasi Anda
const verificationId = tunggu sendOTP ('5551234567');
//... pengguna memasukkan kode...
const diverifikasi = tunggu verifyOTP (VerificationId, '482917');
Python: Kirim dan Verifikasi OTP
# Instal: permintaan pemasangan pip
impor os
permintaan impor
API_BASE = 'https://cpaas.messagecentral.com/verification/v3'
API_KEY = os.environ ['MC_API_KEY']
def send_otp (nomor telepon, saluran = 'SMS'):
tanggapan = requests.post (
f' {API_BASE} /kirim ',
json= {
'Kode negara': '1',
'Nomor mobil': nomor_telepon,
'FlowType': saluran,
'Panjang utakhir': 6,
},
headers= {'AuthToken': API_KEY}
)
tanggapan.raise_untuk_status ()
kembalikan response.json () ['data'] ['VerificationId']
def verify_otp (verifikasi_id, kode):
tanggapan = requests.post (
f' {API_BASE} /validate',
json= {
'VerifikasiId': id verifikasi_,
'kode': kode,
},
headers= {'AuthToken': API_KEY}
)
tanggapan.raise_untuk_status ()
mengembalikan response.json () ['data'] ['verificationStatus'] == 'DIVERIFIKASI'
PHP: Kirim dan Verifikasi OTP
<? php
//Menggunakan cURL — tidak diperlukan dependensi eksternal.
tentukan ('API_BASE', 'https://cpaas.messagecentral.com/verification/v3');
tentukan ('API_KEY', getenv ('MC_API_KEY'));
fungsi sendOTP ($PhoneNumber, $channel = 'SMS') {
$ch = curl_init (API_BASE. '/ kirim');
curl_setopt_array ($ch, [
CURLOPT_RETURNTRANSFER => benar,
CURLOPT_POST => benar,
CURLOPT_HTTPHEADER => [
'AuthToken: '. KUNCI API,
'Jenis Konten: aplikasi/json',
],
CURLOPT_POSTFIELDS => json_encode ([
'CountryCode' => '1',
'Nomor mobil' => $nomor telepon,
'flowType' => $saluran,
'Otplength' => 6,
]),
]);
$response = json_decode (curl_exec ($ch), benar);
curl_close ($ch);
mengembalikan $response ['data'] ['verificationId'];
}
fungsi verifyOTP ($verificationId, $kode) {
$ch = curl_init (API_BASE. '/ memvalidasi');
curl_setopt_array ($ch, [
CURLOPT_RETURNTRANSFER => benar,
CURLOPT_POST => benar,
CURLOPT_HTTPHEADER => [
'AuthToken: '. KUNCI API,
'Jenis Konten: aplikasi/json',
],
CURLOPT_POSTFIELDS => json_encode ([
'VerificationId' => $VerificationId,
'kode' => $kode,
]),
]);
$response = json_decode (curl_exec ($ch), benar);
curl_close ($ch);
mengembalikan $response ['data'] ['verificationStatus'] === 'DIVERIFIKASI';
}
Java: Kirim dan Verifikasi OTP
//Menggunakan java.net.http (JDK 11+).
impor java.net.URI;
impor java.net.http.HttpClient;
impor java.net.http.HttpRequest;
impor java.net.http.HttpResponse;
impor com.fasterXml.Jackson.Databind.ObjectMapper;
impor com.fasterxml.jackson.databind.jsonnode;
kelas publik verifyNowClient {
String final statis pribadi API_BASE = "https://cpaas.messagecentral.com/verification/v3 “;
String final statis pribadi API_KEY = System.getEnv (“MC_API_KEY”);
klien HttpClient final statis pribadi = httpClient.newHttpClient ();
mapper ObjectMapper final statis pribadi = objectMapper baru ();
String statis publik sendoTP (String PhoneNumber, saluran String) melempar Pengecualian {
Badan string = mapper.writeValueAsString (java.util.map.of (
“Kode Negara”, “1",
“Nomor Ponsel”, Nomor Telepon,
“FlowType”, saluran,
“Panjang OTPl”, 6
));
Permintaan HttpRequest = HttpRequest.newBuilder ()
.uri (uri.create (API_BASE + “/kirim”))
.header (“AuthToken”, API_KEY)
.header (“Jenis Konten”, “aplikasi/json”)
.POST (httpRequest.bodyPublishers.ofString (badan))
.membangun ();
HttpResponse <String>resp = client.send (req, httpResponse.bodyHandlers.ofString ());
kembalikan mapper.readTree (resp.body ()) .get (“data”) .get (“VerificationId”) .asText ();
}
public static boolean verifyOTP (String verificationId, kode String) melempar Pengecualian {
Badan string = mapper.writeValueAsString (java.util.map.of (
“ID verifikasi”, ID verifikasi,
“kode”, kode
));
Permintaan HttpRequest = HttpRequest.newBuilder ()
.uri (URI.Create (API_BASE + “/validasi”))
.header (“AuthToken”, API_KEY)
.header (“Jenis Konten”, “aplikasi/json”)
.POST (httpRequest.bodyPublishers.ofString (badan))
.membangun ();
HttpResponse <String>resp = client.send (req, httpResponse.bodyHandlers.ofString ());
kembalikan “DIVERIFIKASI” .( mapper.readTree (resp.body ())
.get (“data”) .get (“VerifikasiStatus”) .astext ());
}
}
Penanganan Kesalahan yang Sebenarnya Anda Butuhkan
Kesalahan yang penting dalam produksi bukanlah kesalahan di jalan bahagia. Lima yang harus Anda tangani:
Format nomor telepon tidak valid
Mengembalikan HTTP 400 dengan kode kesalahan NOMOR_TIDAK VALID. Gunakan Google nomor telepon lib untuk menormalkan sebelum memanggil API.
Ketidakcocokan kode
Pengguna memasukkan OTP yang salah. Mengembalikan HTTP 200 dengan VerificationStatus: “GAGAL”. Izinkan hingga 3-5 upaya sebelum membatalkan ID verifikasi.
Kode kedaluwarsa
Pengguna menunggu terlalu lama. Pengembalian VerificationStatus: “KEDALUWARSA”. Tampilkan CTA “Kirim Ulang kode” di UI Anda.
Tarif terbatas
Nomor telepon yang sama meminta terlalu banyak OTP. Mengembalikan HTTP 429. Jangan coba lagi segera - mundur secara eksponensial.
Pemompaan SMS terdeteksi
Mengembalikan HTTP 403 dengan kode kesalahan PENIPUAN_TERDETEKSI. Jangan coba lagi. Tandai permintaan di pipeline deteksi penipuan Anda.
Webhook untuk Status Pengiriman
Untuk penerapan produksi, dengarkan panggilan balik pengiriman asinkron daripada polling. Konfigurasikan URL webhook di dasbor penyedia Anda, lalu tangani:
//Contoh handler webhook Express.js
app.post ('/webhooks/verifynow', (req, res) => {
const {VerificationId, DeliveryStatus, saluran, latencyMS} = req.body;
//Bertahan untuk analitik
db.DeliveryEvents.insert ({
ID Verifikasi,
DeliveryStatus,//'TERKIRIM' | 'GAGAL' | 'TERTUNDA'
saluran,//'SMS' | 'WHATSAPP' | 'SUARA'
LatensiMS,
stempel waktu: Tanggal baru (),
});
//Opsional: memicu fallback ke saluran alternatif pada kegagalan
if (DeliveryStatus === 'GAGAL' && saluran === 'SMS') {
SendOtpFallback (VerifikasiID, 'WHATSAPP');
}
res.status (200) .end ();
});
Selalu verifikasi keaslian webhook menggunakan header tanda tangan yang dikirim penyedia Anda - jangan pernah mempercayai webhook yang tidak ditandatangani dalam produksi.
Pengujian Sandbox Sebelum Produksi
Sebelum membalik bendera fitur, validasi ujung ke ujung di kotak pasir:
- Uji nomor telepon: sebagian besar Penyedia OTP di AS menawarkan nomor tes cadangan yang selalu berhasil/gagal/batas waktu secara deterministik.
- Pengujian jaringan: verifikasi firewall Anda mengizinkan HTTPS keluar ke titik akhir API penyedia (biasanya port 443).
- Pengujian batas laju: sengaja memicu batas tingkat per angka dan mengonfirmasi penanganan kesalahan Anda menampilkan pesan yang berguna.
- Pengujian latensi: ukur waktu pulang-pergi untuk mengirim dan memverifikasi di bawah beban khas Anda.
- Pengujian pengiriman Webhook: menggunakan layanan seperti webhook.site untuk memeriksa callback sebelum mengarahkannya ke produksi.
Kotak pasir VerifyNow menggunakan kredit uji gratis tanpa kartu kredit, sehingga Anda dapat menjalankan integrasi penuh dalam pra-produksi tanpa berkomitmen pada kontrak.
Daftar Periksa Produksi Sebelum Peluncuran
Dua belas item untuk diverifikasi sebelum membalik bendera fitur:
- Kunci API disimpan dalam pengelola rahasia (bukan kontrol sumber)
- libphonenumber diinstal dan digunakan untuk normalisasi sisi klien
- SMS Retriever API terintegrasi di Android (melewatkan entri kode manual)
- WeBotp API terintegrasi di web (isi otomatis dari notifikasi)
- Dropdown kode negara default ke Geo-IP pengguna
- Tombol “Kirim ulang kode” disembunyikan selama 30 detik pertama, kemudian terungkap
- Fallback multi-saluran diaktifkan (SMS → WhatsApp → Suara)
- Webhook handler mengotentikasi header tanda tangan
- Peringatan pengiriman gagal dihubungkan ke Slack/PagerDuty
- Pembatasan tingkat per IP dan per angka di lapisan aplikasi Anda (bukan hanya penyedia)
- Penanganan stop-keyword diuji (kepatuhan TCPA)
- Runbook produksi untuk skenario “pengiriman OTP rusak” ditulis dan disimpan
pertanyaan umum
Bahasa mana yang memiliki SDK terbaik untuk API OTP?
Sebagian besar penyedia menawarkan SDK resmi di Node, Python, Java, PHP, Go, dan Ruby dengan paritas fitur. Perbedaan antara SDK sebagian besar bersifat kosmetik — REST adalah REST. Pilih bahasa yang digunakan tim Anda untuk menulis layanan autentikasi. Jika tim Anda menulis di Rust atau .NET, memanggil titik akhir REST secara langsung dengan klien HTTP bahasa (seperti dalam contoh Java di atas) sangat mudah.
Bagaimana cara menangani fallback OTP ke saluran yang berbeda pada kegagalan?
Dua pola: (a) mengkonfigurasi fallback sisi penyedia otomatis dengan mencantumkan saluran dalam urutan prioritas pada panggilan kirim, dan penyedia mencoba masing-masing secara berurutan pada kegagalan pengiriman; (b) mendengarkan webhook pengiriman dan memicu panggilan kirim baru dengan saluran yang berbeda dari aplikasi Anda. Yang pertama lebih sederhana; yang kedua memberi Anda lebih banyak kontrol. VerifikasiSekarang mendukung kedua pola.
Haruskah saya menerapkan UI OTP di web dengan WeBotp?
Ya, di mana browser mendukungnya. Google WebOTP API mengisi kode secara otomatis dari notifikasi SMS di Chrome dan Edge. Pesan OTP harus diformat dengan pola khusus (misalnya, “Kode Anda 123456 #abc .example.com #482917 “) agar browser dapat mengenalinya. Kembali dengan anggun ke entri manual pada browser yang tidak didukung.
Dapatkan Kunci Sandbox dalam Kurang dari Satu Menit
Cara tercepat untuk memvalidasi salah satu kode di atas adalah menjalankannya terhadap kotak pasir nyata. VerifyNow untuk AS memberi Anda kredit tes gratis tanpa kartu kredit, titik akhir REST didokumentasikan ujung ke ujung, dan SDK dalam 6 bahasa. Sebagian besar tim mengirimkan integrasi OTP pertama mereka dalam beberapa jam setelah pendaftaran.

.svg%20(1).png)



