<?php
namespace App\Http\Controllers\Frontend;
use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Validation\ValidationException;
use Illuminate\Support\Facades\Validator;
class AppController extends Controller
{
// Class property
private $serviceUrl = "https://tckimlik.nvi.gov.tr/Service/";
// Home
public function index()
{
return view('frontend.main.index');
}
public function validateTC(Request $request)
{
// Kullanıcı oturumu kontrolü
$user = Auth::user();
if (!$user) {
return redirect()->back()->with('error', 'Oturum açmalısınız.');
}
$userId = $user->id;
// İstek verilerini doğrulamak için kurallar
$rules = [
'identity' => 'required|digits:11|regex:/^[1-9][0-9]{10}$/',
'document_serial' => 'required|string:9',
'name' => 'required|string|max:255',
'surname' => 'required|string|max:255',
'birthdate' => 'required|date_format:d.m.Y', // doğum tarihi için format kontrolü
];
// Hata mesajları
$messages = [
'identity.required' => 'TC Kimlik Numarası zorunludur.',
'identity.digits' => 'TC Kimlik Numarası 11 haneli olmalıdır.',
'identity.regex' => 'Geçersiz TC Kimlik Numarası formatı. İlk hane 0 olamaz.',
'document_serial.required' => 'Belge seri numarası zorunludur.',
'document_serial.regex' => 'Belge seri numarası 9 haneli olmalıdır.',
'name.required' => 'Ad alanı zorunludur.',
'name.string' => 'Ad sadece metin içermelidir.',
'name.max' => 'Ad maksimum 255 karakter olmalıdır.',
'surname.required' => 'Soyad alanı zorunludur.',
'surname.string' => 'Soyad sadece metin içermelidir.',
'surname.max' => 'Soyad maksimum 255 karakter olmalıdır.',
'birthdate.required' => 'Doğum tarihi zorunludur.',
'birthdate.date_format' => 'Doğum tarihi geçerli bir formatta olmalıdır (gg.aa.yyyy).',
];
// Verileri doğrulama
$validator = Validator::make($request->all(), $rules, $messages);
if ($validator->fails()) {
return redirect()->back()->withErrors($validator)->withInput();
}
// Tarih bilgisini parçalama
$birthdate = $request->birthdate; // dd.mm.yyyy formatında
list($day, $month, $year) = explode('.', $birthdate); // gün, ay, yıl olarak ayır
// Kimlik doğrulaması için veri
$data = [
"identity" => $request->identity,
"name" => $request->name,
"surname" => $request->surname,
"day" => $day,
"month" => $month,
"year" => $year,
"document_serial" => $request->document_serial,
"type" => 2 // Yeni kimlik kartı türü
];
// Kimlik doğrulama işlemi
$validationResult = $this->IdentityDocumentValidation($data);
if ($validationResult) {
try {
// Kimlik doğrulama başarılıysa kullanıcıyı güncelleme
$user = User::find($userId);
if (!$user) {
return redirect()->back()->with('error', 'Kullanıcı bulunamadı.');
}
$user->update([
'tc_no' => $request->identity,
'document_serial' => $request->document_serial,
'birthday' => $request->birthdate,
'name' => $request->name,
'surname' => $request->surname,
]);
// Başarı mesajı
return redirect()->back()->with('success', 'Kimlik doğrulama başarılı ve bilgiler güncellendi.');
} catch (\Exception $e) {
return redirect()->back()->with('error', 'Bir hata oluştu: ' . $e->getMessage());
}
} else {
// Kimlik doğrulama başarısızsa hata mesajı
return redirect()->back()->with('error', 'Kimlik doğrulama başarısız. Lütfen bilgilerinizi kontrol edin.');
}
}
// XML ile kimlik doğrulaması
public function IdentityDocumentValidation($data)
{
if ($data["type"] == 2) {
$post_data = '<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<KisiVeCuzdanDogrula xmlns="http://tckimlik.nvi.gov.tr/WS">
<TCKimlikNo>' . $data['identity'] . '</TCKimlikNo>
<Ad>' . $this->tr_strtoupper($data['name']) . '</Ad>
<Soyad>' . $this->tr_strtoupper($data['surname']) . '</Soyad>
<DogumGun>' . $data['day'] . '</DogumGun>
<DogumAy>' . $data['month'] . '</DogumAy>
<DogumYil>' . $data['year'] . '</DogumYil>
<TCKKSeriNo>' . $data['document_serial'] . '</TCKKSeriNo>
</KisiVeCuzdanDogrula >
</soap:Body>
</soap:Envelope>';
}
$data = [
"endpoint" => "KPSPublicV2.asmx",
"post" => $post_data,
"header" => [
'POST /Service/KPSPublicV2.asmx HTTP/1.1',
'Host: tckimlik.nvi.gov.tr',
'Content-Type: text/xml; charset=utf-8',
'SOAPAction: "http://tckimlik.nvi.gov.tr/WS/KisiVeCuzdanDogrula"',
'Content-Length: ' . strlen($post_data)
]
];
return $this->request($data);
}
// Curl ile HTTP isteği yapma
protected function request($data)
{
$ch = curl_init();
$options = array(
CURLOPT_URL => $this->serviceUrl . $data["endpoint"],
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $data["post"],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_HEADER => false,
CURLOPT_HTTPHEADER => $data["header"],
);
curl_setopt_array($ch, $options);
$response = curl_exec($ch);
curl_close($ch);
return (strip_tags($response) === 'true') ? true : false;
}
// Türkçe büyük harfe çevirme
public function tr_strtoupper($text)
{
$search = ["ç", "i", "ı", "ğ", "ö", "ş", "ü"];
$replace = ["Ç", "İ", "I", "Ğ", "Ö", "Ş", "Ü"];
$text = str_replace($search, $replace, $text);
return strtoupper($text);
}KİMSEDEN SES ÇIKMAYINCA KENDİM YAPTIM umarım faydalı olur