Misafir doğrulama akışı

Bu rehber, oteldeki misafir listesinin bir captive portal’da nasıl kullanılacağını anlatır: misafirin girdiği bilgilerin listeyle eşleştirilmesi, Wi-Fi oturumunun ne zaman biteceği, listenin hangi sıklıkla yenileneceği ve 5651 kayıtları için hangi alanların saklanacağı.

Portalda ne sorulur#

Liste oda ve kimlik bilgilerini birlikte verdiği için en yaygın form oda numarası + soyaddır. Oda numarası tek başına yeterli değildir; komşu odanın numarasını bilen herkes giriş yapabilir. Alternatif olarak oda numarası + kimlik/pasaport numarası ya da soyad + doğum tarihi sorulabilir; kimlik numarası boş olan misafirler için ikinci seçeneği yedek olarak tutun.

Eşleştirme kuralları#

Misafirin yazdığı değerlerle listedeki değerleri karşılaştırmadan önce iki tarafı da normalize edin:

  • Oda numarası: baştaki ve sondaki boşlukları kaldırın, büyük harfe çevirin. roomName bir metindir ("104", "A-12", "Villa 3" olabilir); sayıya çevirmeyin, baştaki sıfırları yok saymayın.
  • Soyad: büyük harfe çevirin (Türkçe için i → İ dönüşümüne dikkat), birden fazla boşluğu teke indirin. Liste değerleri genellikle kimlik belgesinden büyük harfle okunmuştur.
  • Kimlik numarası: boşlukları kaldırın, büyük harfe çevirin. T.C. kimlik numarası 11 hanedir; pasaport numarası harf ve rakam içerir.
  • Doğum tarihi: liste GG.AA.YYYY verir; formunuz başka biçimde alıyorsa karşılaştırmadan önce dönüştürün.
Eşleştirme
const norm = (s) => String(s ?? "")
  .replace(/\s+/g, " ")
  .trim()
  .toLocaleUpperCase("tr-TR");

function findGuest(list, room, lastName) {
  return list.find((g) =>
    norm(g.roomName) === norm(room) && norm(g.lastName) === norm(lastName)
  ) || null;
}

const guest = findGuest(data.otelde, form.room, form.lastName);
if (!guest) {
  // "Oda numarası ve soyad eşleşmedi" — başarısız denemeleri sayın, 5 denemeden sonra bekletin
}

Eşleşen kaydın unique değeri hotspot kullanıcısının kimliğidir. Aynı misafir ikinci cihazından giriş yaptığında yeni hesap açmak yerine bu değere bağlı hesabı kullanın; cihaz sayısı sınırını da bu hesap üzerinde uygulayın.

Oturum süresi#

checkout planlanan çıkış tarihidir ve günün 00:00’ını (UTC) gösterir; saat bilgisi yoktur. Oturumu bu zamana kadar açarsanız misafir çıkış günü sabahı erişimini kaybeder. Oturum sonunu, çıkış tarihine otelin çıkış saatini ekleyerek hesaplayın:

Oturum sonu
const CHECKOUT_TIME = "12:00";                       // otelin çıkış saati
const day = new Date(guest.checkout * 1000)
  .toLocaleDateString("en-CA", { timeZone: "UTC" });   // "2026-09-10"
const sessionEnd = new Date(`${day}T${CHECKOUT_TIME}:00+03:00`);

Misafir çıkış saatinden önce ayrılırsa listeden düşer; bir sonraki senkronda hesabını kapatın. Konaklama uzatılırsa checkout değeri değişir; senkronda bu alanı da karşılaştırıp oturum süresini güncelleyin. Geç çıkışta misafir listede kaldığı sürece erişimi açık tutmak daha doğrudur.

Periyodik senkron#

Liste anlık durumu verir; değişiklik bildirimi (webhook) yoktur. Listeyi sabit aralıkla çekin ve bir öncekiyle unique üzerinden karşılaştırın:

  • Aralık: 5 dakika çoğu otel için yeterlidir. Misafirin check-in anında Wi-Fi’ye girmesi bekleniyorsa 1–2 dakikaya inebilirsiniz; 1 dakikanın altına inmeyin.
  • Yeni unique: hesabı hazırlayın; misafir portalda ilk girişte eşleştirilir.
  • Kaybolan unique: misafir çıkış yaptı ya da rezervasyon iptal edildi. Oturumu sonlandırın, hesabı kapatın.
  • Aynı unique, farklı roomName ya da checkout: oda değişikliği ya da uzatma. Hesabı güncelleyin.
  • Başarısız istek: zaman aşımı, 401 ya da 5xx aldığınızda son başarılı listeyi koruyun; hesapları hata yanıtına göre kapatmayın.
Senkron döngüsü
async function sync(prev) {
  const res = await fetch(BASE + "/public/json/customer/inhotel", {
    method: "POST",
    headers: { "ApiKey": process.env.HMS_API_KEY, "HotelCode": HOTEL_CODE }
  });
  if (!res.ok) return prev;                                   // 401 / 5xx: eski listeyi koru
  const { success, otelde } = await res.json();
  if (success !== 1) return prev;

  const next = new Map(otelde.map((g) => [g.unique, g]));
  for (const [id] of prev) {
    if (!next.has(id)) await closeAccount(id);                // çıkış yaptı
  }
  for (const [id, g] of next) {
    const old = prev.get(id);
    if (!old) await openAccount(g);                           // yeni misafir
    else if (old.checkout !== g.checkout || old.roomName !== g.roomName) await updateAccount(g);
  }
  return next;
}

Aynı odada birden fazla misafir#

Bir odadaki her misafir ayrı bir kayıttır: rezervasyon_id ortak, unique farklıdır. Hesabı oda başına değil misafir başına açın; böylece her misafirin kendi cihazı, kendi oturumu ve kendi 5651 kaydı olur. Oda numarası + soyad sorgusu aynı soyadlı iki misafirde (aile) birden fazla kayıt döndürebilir; ilk eşleşeni almak yerine ad ya da doğum tarihiyle ayırın veya bu misafirlere ortak bir hesap açın.

5651 kayıtları#

5651 sayılı kanun kapsamındaki erişim kayıtlarını tutma yükümlülüğü hotspot sistemine aittir; HMS yalnızca kimlik verisini sağlar. Oturum açıldığında MAC/IP adresi ve zaman damgasıyla birlikte şu alanları saklayın: unique, rezervasyon_id, firstName, lastName, identityNumber, birthDate, roomName, checkin, checkout. Misafir listeden düştükten sonra HMS bu bilgiyi vermez; kaydı kendi tarafınızda tutun.

Son güncelleme: 8 Eylül 2026Bu sayfada bir hata mı var? Bize yazın