diskusi.tech (beta) Community

loading...
Cover image for Cara Validasi Nomor Seluler Indonesia yang benar

Cara Validasi Nomor Seluler Indonesia yang benar

willnode profile image Wildan M ・3 min read

Sering kali saya bikin aplikasi yang menggunakan nomor HP sebagai username atau ID autentikasi pada aplikasi tertentu.

Saya belum tahu apakah memang hanya kita orang Indonesia atau berlaku juga untuk negara lain, namun sepertinya banyak orang lebih mengingat nomor HP (Seluler) daripada alamat email.

Meski terlihat mudah, namun menggunakan nomor HP sebagai dasar autentikasi itu lebih sulit daripada menggunakan email, karena memverifikasi nomor HP itu tergolong mahal, jadi kita perlu suatu code yang dapat dengan mudah mendeteksi mana nomor HP yang palsu dan yang "terlihat" asli.

Untuk code kebawah saya akan menggunakan Javascript, yang code-nya bisa digunakan untuk browser front-end atau Node.js sebagai back-end.

Normalisasi nomor

Hal pertama yang harus dilakukan adalah menghilangkan tanda-tanda ekstra dari nomor HP, seperti strip atau spasi, serta mengganti kode internasional (+628) menjadi nomor HP lokal (08).

/**
 * Normalisasi nomor HP lokal
 * @param {string} phone
 * @return {string}
 */
function normalisasiNomorHP(phone) {
    phone = String(phone).trim();
    if (phone.startsWith('+62')) {
        phone = '0' + phone.slice(3);
    } else if (phone.startsWith('62')) {
        phone = '0' + phone.slice(2);
    }
    return phone.replace(/[- .]/g, '');
}
Enter fullscreen mode Exit fullscreen mode

Dengan menormalisasi nomor HP, kita menghindari potensi dua nomor yang hanya syntax-nya berbeda dikategorikan menjadi dua akun yang berbeda, contoh: +62812-3456-7890 setelah dinormalisasi menjadi 081234567890.

Deteksi panjang dan pola nomor yang digunakan

Dalam keseharianku, aku sering menjumpai nomor HP yang mempunyai panjangnya 12 digit. Namun kadang juga aku menjumpai yang panjangnya yang bisa 13, 11 atau bahkan 10 digit.

Setelah dipelajari, kita akan menjumpai titik terang, dimana dalam dunia nomor telepon selular, ada 2 jenis nomor yang berbeda, yakni nomor prabayar dan pascabayar. Di Indonesia, nomor prabayar panjangnya berkisar 11-13 digit sedangkan pascabayar panjangnya adalah 10-11 digit. Jika digabung, maka jumlah digit yang valid untuk nomor indonesia adalah 10-13 digit.

Apakah selamanya akan seperti itu? saya belum tahu, Jepang saja sudah membuka nomor selular 14 digit. Namun mari kita asumsikan kalau jumlah angka ini tidak berubah setidaknya untuk 10 tahun yang akan datang.

Dan yang terakhir, nomor seluler pasti berawal 08. Ini karena nomor lain sudah digunakan sebagai nomor telepon kabel dibedakan per wilayah. Dan awalan 080 tidak akan kita gunakan karena nomor tersebut adalah telepon layanan bebas pulsa atau call center perusahaan. Sehingga kode untuk validasi kita sebagai berikut:

/**
 * Tes nomor HP lokal
 * @param {string} phone
 * @return {boolean}
 */
function tesNomorHP(phone) {
    if (!phone || !/^08[1-9][0-9]{7,10}$/.test(phone)) {
        return false;
    }
    return true;
}
Enter fullscreen mode Exit fullscreen mode

Deteksi prefix seluler agar lebih aman

Jika anda ingin menggunakan layanan verifikasi nomor HP seperti OTP alangkah baiknya kita dapat mendeteksi operator mana yang kita tuju. Menurut daftar nomor seluler di Wikipedia hasil code untuk mendeteksi operator seluler adalah sebagai berikut:

/**
 * Deteksi operator seluler indonesia
 * @param {string} phone
 * @return {string?}
 */
function deteksiOperatorSeluler(phone) {
    const prefix = phone.slice(0, 4);
    if (['0831', '0832', '0833', '0838'].includes(prefix)) return 'axis';
    if (['0895', '0896', '0897', '0898', '0899'].includes(prefix)) return 'three';
    if (['0817', '0818', '0819', '0859', '0878', '0877'].includes(prefix)) return 'xl';
    if (['0814', '0815', '0816', '0855', '0856', '0857', '0858'].includes(prefix)) return 'indosat';
    if (['0812', '0813', '0852', '0853', '0821', '0823', '0822', '0851', '0811'].includes(prefix)) return 'telkomsel';
    if (['0881', '0882', '0883', '0884', '0885', '0886', '0887', '0888', '0889'].includes(prefix)) return 'smartfren';
    return null;
}
Enter fullscreen mode Exit fullscreen mode

Apakah daftar prefix seluler ini up-to-date? Saya sendiri kurang tahu karena kita tidak punya rujukan resmi tentang ini. Namun yang saya percaya, nomor prefix ini akan bertambah seiring waktu. Contoh saja by.U dengan prefix 0851 muncul pada tahun 2019 dan Switch dengan prefix 0889 muncul pada 2020 (meski sekarang sudah tutup).


Kesimpulan

/**
 * Apakah nomor HP ini valid?
 * @param {string} phone
 * @return {boolean}
 */
function validasiNomorSeluler(phone) {
    phone = normalisasiNomorHP(phone);
    return tesNomorHP(phone) && !!deteksiOperatorSeluler(phone);
}
Enter fullscreen mode Exit fullscreen mode

Demikian tips hari ini untuk deteksi nomor HP yang valid. Code ini juga aku pakai untuk project saya pribadi dan sejauh ini masih aman untuk saya pakai :)

Credit cover by NordWoord Themes

Discussion

pic
Editor guide