PHP SMS İle Üye Onaylama Sistemi

Bu derste birçok yeni başlayan arkadaşın merak ettiği SMS ile onaylama olayını anlatacağım. Öncelikle bu işin masraflı bir iş olduğunu söyleyeyim. Tabiki de denemeniz ücretsiz ama daha sonra SMS olayını kullanacaksanız SMS servis sağlayıcılarına bir miktar para ödemeniz gerekecek.

Derse başlamadan önce isteyen arkadaşlar aşağıdan dersin videosunu da izleyebilirler.

Şimdi anlatmaya başlayalım. Öncelikle ufak bir üye kayıt sistemi yazalım. Tamamen formalite, sadece konuyu daha rahat anlayabilmeniz için. Ben SMS adında bir veritabanı oluşturdum ve içerisine users adında bir tablo oluşturdum. SQL kodlarımız aynen şu şekilde.

create database sms;

sms veritabanımızı oluşturduk şimdi de sıra users tablomuzu oluşturmaya geldi.

CREATE TABLE `users` (
`u_id` int(11) NOT NULL AUTO_INCREMENT,
`u_name` varchar(55) NOT NULL,
`u_password` varchar(32) NOT NULL,
`u_email` varchar(110) NOT NULL,
`u_status` enum(‘1′,’0’) DEFAULT ‘0’,
`u_confirm_code` int(6) NOT NULL,
`u_phone` varchar(20) NOT NULL,
PRIMARY KEY (`u_id`),
UNIQUE KEY `u_email` (`u_email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

Tablomuz aynen bu şekilde. Şimdi kısaca mantığını anlatalım. Kullanıcı sisteme kaydolurken kullanıcıya bir onay kodu atayacağız ve bize verdiği telefon numarasına bu onay kodunu SMS olarak göndereceğiz. Sonrasında da tahmin edebileceğiniz gibi onay kodunu kutucuğa yazmasını isteyeceğiz ve girdiği değerle veritabanımızdaki değerin uyuşup uyuşmadığını kontrol edeceğiz. Şimdi hemen kayıt formumuzu oluşturalım. Formumuzun HTML kodları aşağıdaki gibidir.

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>PHP SMS Ile Uye Dogrulama</title>
    <style>
        form {
            width:350px;
            margin:50px auto;
            border:1px solid #ddd;
            border-radius:8px;
            padding:20px;
            box-sizing:border-box;
        }

        form label {
            line-height:26px;
        }

        form label input {
            margin-bottom:10px;
            width:100%;
            padding:7px 5px;
            box-sizing:border-box;
        }

        form button {
            padding:10px 8px;
            border:1px solid #ddd;
            color:#333;
            text-decoration:none;
            width:100%;
            display:block;
            text-align:center;
            box-sizing:inherit;
            margin:10px auto;
        }

        form button:hover {
            background:#f1f1f1;
        }
    </style>
</head>
<body>
<?php if(!isset($_GET["step"]) || $_GET["step"] == "1"): ?>
    <form action="" method="POST">
        <label>Name: <br><input type="text" name="name"></label><br>
        <label>Password: <br><input type="password" name="password"></label><br>
        <label>Email: <br><input type="email" name="email"></label><br>
        <label>Phone: <br><input type="tel" name="phone"></label><br>
        <button type="submit" name="register_form">Continue</button>
    </form>
<?php elseif(isset($_GET["step"]) && $_GET["step"] == "2" && isset($_GET["phone"])): ?>
    <form action="" method="POST">
        <label>Confirmation Code: <br><input type="text" name="confirmation"></label>
        <button type="submit" name="confirmation_form">Confirm Account</button>
    </form>
<?php endif; ?>
</body>
</html>

Kodlarımızın tamamını açıklamaya gerek yok, temel bilgileriniz olduğunu varsayarak devam ediyorum. if koşullarının içine ne yazdığımızı söyleyelim. Gördüğünüz üzere orda iki tane formumuz var, birinci formumuz kullanıcının üye olmasını sağlayan form, eğer get ile alınan bir veri yoksa kayıt formunu göstereceğiz. Eğer get ile alınan step değeri varsa ve bu değer 2’ye eşitse ve bir de GET ile aldığımız phone değer varsa bu sefer de kullanıcının üye olmuş olduğunu anlıyoruz ve ona SMS onaylama formunu gösteriyoruz. SMS onaylama kısmında da kullanıcı ona gönderecek olduğumuz SMS’teki onay kodunu yazıyor ve veritabanında arama yapıyoruz. GET ile aldığımız telefon numarasına sahip üyenin onay kodu üyenin bize form aracılığı ile göndermiş olduğu onay kodu olup olmadığını kontrol ediyoruz. Eğer onay kodu doğru ise kullanıcının statüsünü onay bekleyen üyeden onaylı üyeye çekiyoruz. İşte tüm mesele bu. Şimdi üye olma kısmını ve SMS gönderme olayını halledelim. Bu derste güvenliğe dikkat etmeyeceğim. En kısa yoldan sistemi yazacağım. Body etiketimizin hemen sonrasına şu kodları ekleyelim. Böylece kayıt işlemimizi yapabileceğiz.

<?php

try {
    $db = new PDO("mysql:hostname=localhost; dbname=sms;", "root", "");
}catch(PDOException $e) {
    die($e->getMessage());
}
// Veritabani baglantimizi kurduk.
if(isset($_POST["register_form"])) {
    $name = $_POST['name'];
    $password = $_POST['password'];
    $email = $_POST['email'];
    $phone = $_POST['phone'];

    // Onay kodumuzu olusturalim.
    $code = substr(str_shuffle("1234567890"), 0, 6);

    $insertUser = $db->exec("INSERT INTO users SET
    u_name = '$name',
    u_password = '$password',
    u_email = '$email',
    u_confirm_code = $code,
    u_phone = '$phone'");

    if($insertUser) {
        require_once "textlocal.class.php";
        $tl = new Textlocal("mailadresiniz@siteniz.com", "TextLocal_Hash");
        $sendSms = $tl->sendSms(["+905511107257", "Diğer Numaralar"], "Mesajınızın İçeriği", "Gönderen İsmi");
        if($sendSms->status == "success") {
            //SMS Gönderildi Demektir.
            header("Location:index.php?step=2&phone=".$phone);
        }else {
            echo "SMS Gönderilirken Bir Sorun Oluştu";
        } 
    }else {
        echo "Kullanici olusturulamadi.";
    }
}

if(isset($_POST["confirmation_form"])) {
    $confCode = $_POST["confirmation"];
    $phone = "+".trim($_GET["phone"]);
    $query = $db->query("SELECT * FROM users WHERE u_confirm_code = $confCode && u_phone = '$phone'");
    if($query->rowCount()) {
        $update = $db->exec("UPDATE users SET u_status = '1' WHERE u_phone = '$phone'");
        if($update) {
            echo "Hesabınız Onaylandı";
        }else {
            echo "Hesabınız Onaylanamadı";
        }
    }else {
        echo "Onay Kodunuz veya Telefon Numaranız Yanlış";
    }
}
?>

Evet sistemimiz bu kadar basit şimdi blok blok neler yaptığımızı açıklayalım.

Öncelikle try catch veritabanı bağlantımızı kurduk ve db adında bir değişkene atadık. Şimdi ilk if bloğumuza bakalım. Burada register_form adında bir değerin post edilip edilmediğini sorguladık. Eğer edildiyse aşağıdaki işlemleri yap dedik ve devam ettik. Eğer register_form adındaki form POST edildiyse formdaki bilgileri al dedik ve aldık. Daha sonra rastgele bir onay kodu oluşturduk.

str_shuffle fonksiyonu içerisine girilen parametredeki tüm karakterleri karıştırıp aynı uzunlukta yeni bir string döndürür. Biz de str_shuffle fonksiyonunu kullanarak 0’dan 9’a tüm rakamların olduğu rastgele bir string ürettik ve daha sonra da substr fonksiyonu aracılığıyla bu string ifadenin ilk 6 karakterini aldık ve bunu $code değişkenine atadık. Kullanacağımız onay kodunu bu şekilde belirlemiş olduk. Kodlarımızı okumaya devam edelim. Onay kodumuzu oluşturduktan sonra PDO sınıfının exec metodu ile kullanıcıyı users tablomuza eklemiş olduk. Bildiğiniz üzere exec metodu işlem yapılırsa true yapılmazsa false döndürüyor. Ben de bu ders çabuk bitsin teferruata gerek yok diyerek exec metodunu kullandım. Devam edelim. Üye kayıt işlemimizin başarılı olup olmadığını kontrol ediyoruz. Eğer başarılı olmazsa ‘Kullanıcı oluşturulamadı’ şeklinde bir uyarı veriyoruz. Eğer üye oluşturulursa da SMS gönderme işlemimizi yapıyoruz. Bundan bahsedelim şimdi de.

SMS göndermek için öncelikle Textlocal servisinin bize sağlamış olduğu class’ı sayfamıza dahil ediyoruz. Bu class’ı indirmek isterseniz Textlocal’in API dökümantasyonuna bakabilirsiniz. Dökümantasyon içerisinde Overview sekmesi altında PHP Class Reference sayfasında İnstallation Instructions kısmında indirme linkini bulabilirsiniz. İnen arşivin içerisinde php-uk adında bir klasör var ve altında da textlocal.class.php dosyası mevcut. Biz de require komutu ile bu dosyayı çağırdık. Şimdi de bu sınıfı kullanmak için sınıfın bir nesnesini oluşturalım.

$tl = new Textlocal(); diyerek Textlocal sınıfının yeni bir nesnesini oluşturduk. Bu nesnemizin construct metodu iki parametre alıyor. Birinci parametre Textlocal’e giriş yaparken kullandığınız mail adresiniz ve diğer parametre de Textlocal’in size vermiş olduğu hash. Bu hash’i elde etmek için de Textlocal’e giriş yapıyorsunuz. Bir aksilik olmadığı müddetçe sizi kontrol paneline atıyor. Bu panelde navbarda help sekmesinin altındaki All Documentation linkine tıklıyorsunuz ve sayfayı biraz aşağı kaydırdığınız aman sol kısımda Your Api Hash Key gibi bir ifade görüyorsunuz. Orda verdiği değer sizin hash değeriniz. Bu değeri ikinci parametre olarak giriyorsunuz. Bu arada Textlocal size denemek için 10 kredi veriyor ve 1 SMS’in ücreti de 0.4 kredi. Nesnemizi düzgün bir şekilde oluşturduğumuza göre şimdi SMS gönderebiliriz. SMS göndermek için Textlocal sınıfının içerisindeki sendSms metodunu kullanıyoruz. Bu metod 3 parametre alıyor.
Birinci parametremiz bir dizi. Bu dizinin içerisine ülke kodlarıyla beraber teker teker telefon numaralarınızı yazıyorsunuz. Örnek dizi: [“+905555555555”, “+905555555554”] gibi. Buraya kredinizin yettiğince istediğiniz gibi numaralar ekleyebilirsiniz. Biz tek bir üyeyi onaylayacağımız için sadece bir eleman girebiliriz ama birinci parametre kaç eleman girecek olursanız olun dizi halinde olmalı. Şimdi ikinci parametreye geçelim. Bu parametremiz de kullanıcıya göndereceğimiz mesaj oluyor. Buraya ‘Onay Kodunuz 123456’ gibi bir ifade yazabilirsiniz. Son parametremiz de SMS’in kimden gittiği bilgisi. Bu bilgi genel olarak çalışsa da bazen çalışmıyor. Örnek olarak ben buraya Üye Onay yazdığımda BNTSMS adı altında SMS gönderdiği de oldu. O yüzden buna çok güvenmeyin.
Bu kod satırımızı açıklayalım şimdi de. Bu satırda da $sendSms adında bir değişken oluşturduk ve Textlocal sınıfının içerisindeki sendSms metodu ile SMS’imizi gönderdik. Bu metod bize bir obje döndürüyor. SMS’in başarılı bir şekilde gönderilip gönderilmediğini görmek isterseniz bu obje içindeki status değerine bakabilirsiniz. Ben de burada aynı şeyi yaptım. $sendSms->status değeri success’a eşitse bu durumda SMS başarılı bir şekilde gönderilmiş demektir dedim ve sonraki satırda da zaten kullanıcıyı formun ikinci adımına yönlendirdik. Bu adımda da zaten SMS ile gönderdiğimiz onay kodunu girecek. Ama burada şöyle bir problem var. Girilecek onay kodunun hangi üyeye ait olduğunu nasıl kontrol edeceğiz ? Bu durum için de şöyle bir çözüm geliştirdim (Siz daha iyilerini geliştirebilirsiniz) kullanıcının telefon numarasını adres çubuğuna get parametresi olarak ekledim ve daha sonra $_GET fonksiyonu ile bu parametreyi aldım. Parametreyi alırken şöyle bir problem oluyor, +905555555555 şeklinde parametreyi başındaki +’yı bir adet boşluk ile değiştirerek bize veriyor. Veritabanında karşılaştırma yaparken de doğal olarak bu durum bize sıkıntı çıkartıyor. Bu yüzden bu veriyi alırken başına bir + işareti koyarak ve numaranın başındaki boşluğu da trim fonksiyonu ile temizleyerek veritabanında arama ve karşılaştırma yapmaya uygun hale getiriyoruz. Veritabanında aratırken de diyoruz ki users tablosunda telefon numarası GET ile aldığımız telefon numarası ve onay kodu da formdan gelen onay kodu olan bir üye var mı ? Eğer böyle bir üye varsa yine PDO sınıfının exec metodu ile üyenin statüsünü onaysız üyeden onaylı üyeye güncelliyoruz. Eğer güncelleme işlemi başarılı olursa Hesabınız onaylandı diyoruz, eğer güncelleme işlemi başarılı olmazsa da hesabınız onaylanmadı şeklinde bir uyarı mesajı veriyoruz.

İşte SMS ile üye onaylama sistemimiz bu kadar basit. Bir kelimelik bile olsa bir yorum bırakırsanız çok sevinirim. Bu arada Youtube kanalıma da abone olmayı unutmayın (Youtube Kanalım) 🙂 Projenin dosyalarını Github’a da attım. Aşağıdaki linkten ulaşabilirsiniz.

Projeyi Github’da Görün

Bu derslik bu kadar, başka derslerde görüşmek üzere.

Genel, PHP Mustafa Zahid Efe 3 yorum