Laravel İle TC Kimlik Numarası Doğrulama

4 Ağu 2023
Laravel İle TC Kimlik Numarası Doğrulama

Herkese merhaba,

Bu yazımızda Laravel ile özel bir validation(doğrulama) sınıfı yazarak TC Kimlik numarası doğrulama işlemi gerçekleştireceğiz.

Öncelikle aşağıdaki komutu kullanarak kendimize özel bir validation oluşturalım;

php artisan make:rule ValidateTCNo

Bu komut bize ValidateTCNo sınıfımızı hazırlayacak.

app/Rules/ValidateTCNo.php

namespace App\Rules;

use Closure;

use Illuminate\Contracts\Validation\ValidationRule;

class ValidateTCNo implements  ValidationRule
{

  /**
     * Run the validation rule.
     *
     * @param  \Closure(string): \Illuminate\Translation\PotentiallyTranslatedString  $fail
     */
    public function validate(string $attribute, mixed $value, Closure $fail): void
    {

           //

     }

}

Bu özel validation sınıfımıza dinamik veri eklememiz gerekiyor.

Çünkü Tc Kimlik Doğrulaması için kullanacağımız servis bizden ad, soyad, tc no ve doğum tarihi(yıl) gibi bilgiler isteyecek.

Bunun için sınıfımıza Laravel'in DataAwareRule interface'ini entegre edeceğiz.

namespace App\Rules;


use Closure;
use Illuminate\Contracts\Validation\DataAwareRule;
use Illuminate\Contracts\Validation\ValidationRule;

class ValidateTCNo implements DataAwareRule, ValidationRule
{
    /**
     * All of the data under validation.
     *
     * @var array
     */
    protected $data = [];

    /**
     * Set the data under validation.
     *
     * @param  array  $data
     */
    public function setData(array $data): static
    {
        $this->data = $data;

        return $this;
    }

    /**
     * Run the validation rule.
     *
     * @param  \Closure(string): \Illuminate\Translation\PotentiallyTranslatedString  $fail
     */
    public function validate(string $attribute, mixed $value, Closure $fail): void
    {
       //
    }

Artık $this->data altında, Controller'dan gelecek verileri burada işleyebiliriz.

Şimdi basit bir Controller örneği yazalım.

use App\Rules\ValidateTCNo;

public function store(Request $request): RedirectResponse

{

$validated = $request->validate([

'first_name' => 'required',
'last_name' => 'required',
'tc_no'    => ['required', new ValidateTCNo ],
'birth_year' => 'required',

]);


// doğrulama başarılı, kayıt işlemleri ve yönlendirme



return redirect('/');

}

Burada tc_no alanı için new ValidateTCNo şeklinde yazdığımız özel validation sınıfını çağırmış olduk.

Şimdi özel validation sınıfımızdaki işlemleri tamamlayalım.

Nufüs Ve Vatandaşlık İşlemleri Genel Müdürlüğü'nün sağlamış olduğu SOAP servisi üzerinden bu işlemi gerçekleştireceğiz.

Karşı servis bizden büyük harflerle aşağıdaki bilgileri istemekte;

AD

SOYAD

TC KİMLİK NO

DOĞUM YILI

Şimdi bu bilgileri göndererek validation işlemimizi tamamlayalım.

namespace App\Rules;


use Closure;
use Illuminate\Contracts\Validation\DataAwareRule;
use Illuminate\Contracts\Validation\ValidationRule;

class ValidateTCNo implements DataAwareRule, ValidationRule
{
    /**
     * All of the data under validation.
     *
     * @var array
     */
    protected $data = [];

    /**
     * Set the data under validation.
     *
     * @param  array  $data
     */
    public function setData(array $data): static
    {
        $this->data = $data;

        return $this;
    }

    /**
     * Run the validation rule.
     *
     * @param  \Closure(string): \Illuminate\Translation\PotentiallyTranslatedString  $fail
     */
    public function validate(string $attribute, mixed $value, Closure $fail): void
    {
        try {
           
            $client = new \SoapClient('https://tckimlik.nvi.gov.tr/Service/KPSPublic.asmx?WSDL');

            $response = $client->TCKimlikNoDogrula([
                'TCKimlikNo' => $value,
                'Ad' => \Transliterator::create('tr-Upper')->transliterate($this->data['first_name']),
                'Soyad' => \Transliterator::create('tr-Upper')->transliterate($this->data['last_name']),
                'DogumYili' => $this->data['birth_year'],
            ]);

            if (! $response->TCKimlikNoDogrulaResult) {
                $fail('Girilen TC kimlik numarası doğru değil.');
            }

        } catch (\Exception $e) {
            $fail('TC kimlik doğrulama sırasında bir hata oluştu.');
        }
    }
}

Burada yapılan işlemleri açıklayacak olursak öncelikle SOAP servisine istek atıyoruz

$client = new \SoapClient('https://tckimlik.nvi.gov.tr/Service/KPSPublic.asmx?WSDL');

Burada TCKimlikNo kısmına $value değerini gönderiyoruz.

$value değeri validation işlemi sırasında verdiğiniz sütunu ifade ediyor.

Yani $request->validate([]) içerisindeki şu alan;

'tc_no'    => ['required', new ValidateTCNo ],

Laravel'in DataAwareRule interface'i sayesinde Controller'daki diğer alanları da $this->data dizisi içerisinden alıyoruz.

Şu iki kod bloğu dikkatinizi çekmiş olabilir;

'Ad' => \Transliterator::create('tr-Upper')->transliterate($this->data['first_name']),

'Soyad' => \Transliterator::create('tr-Upper')->transliterate($this->data['last_name']),

Burada ad ve soyad değerlerini büyük harf ile dönüştürdük. Laravel'in Str::upper() fonksiyonunu da kullanabilirdik.

Ancak Laravel'in upper fonksiyonu Türkçe karakterleri dönüştüremiyor. Bu yüzden transliterate den faydalandık.

Ardından eğer $response->TCKimlikNoDogrulaResult fonksiyonu false dönerse, TC Kimlik kontrolünün başarısız olduğu mesajı ile kullanıcıya geri dönüş sağlıyoruz.

SOAP servisine bağlanırken olası bir hata yaşanma ihtimaline karşı, kodlarımızı try-catch bloğu içerisine alıyoruz.

Yine aynı şekilde, karşı servise bağlanamaz ve bir problem olursa aşağıdaki blok çalışıyor ve ilgili mesaj kullanıcıya döndürülüyor;

catch (\Exception $e) {
            $fail('TC kimlik doğrulama sırasında bir hata oluştu.');
        }

İşlem tamamlandı.

Bu örnekte kendi Laravel validation sınıfımızı yazarak özel doğrulama işlemimizi gerçekleştirdik.

Müşteri kaydı gibi durumlarda artık siz de TC Kimlik Numarası doğrulaması yapabilirsiniz.

İyi kodlamalar!

YAZAR : Boran BAR
Chat on WhatsApp