İçeriğe geç
Örnekler

Kendini düzelten adres formu

Müşteri adresi tek satırda nasıl yazarsa yazsın; il, ilçe, mahalle, sokak, bina ve daire ayrı alanlara dolar, sicille eşleşmeyen alan işaretlenir.

  1. Anahtar al. Ücretsiz kayıt, ayda 1.000 kredi. Anahtarı panelde üretirsin; ak_live_ ile başlar.
  2. Dosyayı al. Aşağıdan kopyala ya da indir: checkout.mjs. Node 18 ya da üstü yeter, paket yok.
  3. Çalıştır. KILAVUZ_ANAHTAR=ak_live_… node checkout.mjs. Sayfa localhost:3000’de açılır.

Tek dosya, olduğu gibi çalışır:

// Kendini düzelten teslimat adresi formu: müşteri adresi nasıl yazarsa yazsın,
// Kılavuz il, ilçe, mahalle, sokak, bina ve daireyi ayırıp sicille doğrular.
// Node 18+, paket yok.  KILAVUZ_ANAHTAR=ak_live_… node checkout.mjs  →  http://localhost:3000
// Anahtar yalnız bu sunucuda durur; tarayıcı aşağıdaki izinli uca gider, sunucu Kılavuz'a iletir.
import { createServer } from 'node:http';

const API = 'https://api.kilavuzapi.com';
const ANAHTAR = process.env.KILAVUZ_ANAHTAR;
if (!ANAHTAR) throw new Error('KILAVUZ_ANAHTAR tanımlı değil (anahtar: kilavuzapi.com/panel)');
const IZINLI = ['/v1/address/resolve'];
const PORT = process.env.PORT ?? 3000;

createServer(async (istek, yanit) => {
  const { pathname, search } = new URL(istek.url, 'http://yerel');
  if (!IZINLI.includes(pathname)) return yanit.writeHead(200, { 'content-type': 'text/html; charset=utf-8' }).end(SAYFA);
  let govde = '';
  for await (const parca of istek) if ((govde += parca).length > 10_000) return yanit.writeHead(413).end();
  try {
    const r = await fetch(API + pathname + search, {
      method: istek.method,
      headers: { authorization: `Bearer ${ANAHTAR}`, 'content-type': 'application/json' },
      body: istek.method === 'POST' ? govde : undefined,
    });
    yanit.writeHead(r.status, { 'content-type': 'application/json; charset=utf-8' }).end(await r.text());
  } catch {
    yanit.writeHead(502, { 'content-type': 'application/json; charset=utf-8' }).end('{"hata":"Kılavuz API\'sine ulaşılamadı"}');
  }
}).listen(PORT, '127.0.0.1', () => console.log(`http://localhost:${PORT}`));

const SAYFA = `<!doctype html>
<html lang="tr">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Teslimat adresi</title>
<style>
  body { font: 16px/1.5 system-ui, sans-serif; max-width: 34rem; margin: 40px auto; padding: 0 16px; color: #16181c; }
  label { display: block; margin-top: 12px; font-size: 14px; }
  input, textarea { display: block; box-sizing: border-box; width: 100%; margin-top: 4px; padding: 8px 10px; font: inherit; border: 1px solid #c3c7cd; border-radius: 6px; }
  .kontrol { border-color: #d97706; background: #fff8eb; }
  .ikili { display: grid; grid-template-columns: 1fr 1fr; gap: 0 12px; }
  button { margin-top: 16px; padding: 10px 14px; font: inherit; border: 0; border-radius: 6px; background: #16181c; color: #fff; cursor: pointer; }
  #duzelt { background: #e7e9ec; color: #16181c; }
  #durum { min-height: 1.5em; font-size: 14px; color: #4d535b; }
</style>
<h1>Teslimat adresi</h1>
<form id="form">
  <label>Adres <textarea name="q" rows="2">kadıköy caferağa mh moda cd no 12 d3</textarea></label>
  <button type="button" id="duzelt">Adresi düzelt</button>
  <p id="durum"></p>
  <div class="ikili">
    <label>İl <input name="il" autocomplete="address-level1"></label>
    <label>İlçe <input name="ilce" autocomplete="address-level2"></label>
    <label>Mahalle <input name="mahalle"></label>
    <label>Cadde / sokak <input name="yol"></label>
    <label>Bina no <input name="binaNo"></label>
    <label>Daire <input name="daire"></label>
  </div>
  <button>Siparişi tamamla</button>
</form>
<script>
  const form = document.getElementById('form');
  const durum = document.getElementById('durum');

  document.getElementById('duzelt').onclick = async () => {
    if (!form.q.value.trim()) return (durum.textContent = 'Önce adresi yaz.');
    durum.textContent = 'Kontrol ediliyor…';
    const r = await fetch('/v1/address/resolve', {
      method: 'POST',
      headers: { 'content-type': 'application/json' },
      body: JSON.stringify({ q: form.q.value }),
    });
    const a = await r.json();
    if (!r.ok) return (durum.textContent = a.hata);

    for (const alan of ['il', 'ilce', 'mahalle', 'yol', 'binaNo', 'daire']) {
      form[alan].value = a[alan] ?? '';
      // Sicilde doğrulanamayan alanı müşteriye işaretle.
      form[alan].classList.toggle('kontrol', a.dogrulanan?.[alan] === false || (alan !== 'daire' && !a[alan]));
    }
    durum.textContent = a.hassasiyet === 'sokak'
      ? 'Adres sicille eşleşti.' + (a.duzeltmeler.length ? ' Düzeltilen: ' + a.duzeltmeler.join(', ') : '')
      : 'Adresin bir kısmı bulunamadı; işaretli alanları kontrol et.';
  };

  form.onsubmit = (e) => {
    e.preventDefault();
    durum.textContent = 'Sipariş alındı. Burada kendi ödeme adımın çalışır.';
  };
</script>
`;

Kullandığı uçlar

  • POST /v1/address/resolve1 kredi

Anahtar tarayıcıya inmez. Dosya küçük bir sunucu: sayfayı verir, tarayıcının isteğini anahtarı ekleyerek Kılavuz’a iletir. Yalnız IZINLI listesindeki uçlar geçer. Kendi uygulamana taşırken de anahtarı sunucuda tut. Uçların ayrıntısı dokümanda.

Öteki örnekler