Doğrulama ile öde
Müşteri Nuglr kullanıcı adını girer ya da siten zaten “Nuglr ile giriş” kullanıyorsa kimliği bilinir. Onay isteği doğrudan telefonuna düşer.
Kullanıcının şifresini görmeden güvenli oturum aç. OAuth 2.0 + OpenID Connect + PKCE ile web, mobil ve masaüstü uygulamalarını bağla.
Client ID, Client Secret ve NugPay webhook anahtarı yalnızca uygulamanın sahibine gösterilir.
GET https://nuglr.com/.well-known/openid-configuration/
GET https://nuglr.com/oauth/authorize/?response_type=code&client_id=CLIENT_ID&redirect_uri=CALLBACK&scope=openid%20profile%20email&state=RANDOM_STATE&nonce=RANDOM_NONCE&code_challenge=PKCE_S256&code_challenge_method=S256
POST https://nuglr.com/oauth/token/grant_type=authorization_code&code=CODE&redirect_uri=CALLBACK&client_id=CLIENT_ID&client_secret=CLIENT_SECRET&code_verifier=PKCE_VERIFIER
GET https://nuglr.com/oauth/userinfo/Authorization: Bearer ACCESS_TOKEN
$token = json_decode(file_get_contents('https://nuglr.com/oauth/token/', false, stream_context_create(['http'=>[
'method'=>'POST','header'=>"Content-Type: application/x-www-form-urlencoded\r\n",
'content'=>http_build_query($payload)
]])), true);
$user = json_decode(file_get_contents('https://nuglr.com/oauth/userinfo/', false, stream_context_create(['http'=>[
'header'=>"Authorization: Bearer {$token['access_token']}\r\n"
]])), true);
const token = await fetch('https://nuglr.com/oauth/token/', {method:'POST', headers:{'Content-Type':'application/x-www-form-urlencoded'}, body:new URLSearchParams(payload)}).then(r=>r.json());
const user = await fetch('https://nuglr.com/oauth/userinfo/', {headers:{Authorization:`Bearer ${token.access_token}`}}).then(r=>r.json());
token = requests.post('https://nuglr.com/oauth/token/', data=payload).json()
user = requests.get('https://nuglr.com/oauth/userinfo/', headers={'Authorization': f"Bearer {token['access_token']}"}).json()
resp, _ := http.PostForm("https://nuglr.com/oauth/token/", url.Values{"grant_type":{"authorization_code"}, "code":{code}, "client_id":{clientID}, "client_secret":{secret}, "redirect_uri":{callback}, "code_verifier":{verifier}})
req, _ := http.NewRequest("GET", "https://nuglr.com/oauth/userinfo/", nil)
req.Header.Set("Authorization", "Bearer "+accessToken)
var token = await http.PostAsync("https://nuglr.com/oauth/token/", new FormUrlEncodedContent(payload));
http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
var user = await http.GetFromJsonAsync<NuglrUser>("https://nuglr.com/oauth/userinfo/");
1. Eklentiyi indirip WordPress → Eklentiler → Yeni Ekle alanından yükle.
2. Ayarlar → Nuglr ile Giriş ekranını aç.
3. Burada oluşturduğun Client ID ve Client Secret değerlerini gir.
4. Eklentinin gösterdiği Callback URL’yi Nuglr uygulamana birebir ekle.
5. WordPress giriş ekranında “Nuglr ile Giriş” düğmesi görünür.
E-posta alanı: email izniyle kullanıcının Nuglr adresi (kullanici@nuglr.com) döner. Kişisel adresi gerekiyorsa ayrıca email:personal izni iste; kullanıcı onay ekranında bunu ayrı görür.
Müşteri sitende “NugPay ile öde” seçer. Nuglr uygulamasına onay bildirimi gider; uygulama kapalıysa tutar push bildiriminde görünür. Müşteri onaylayınca tutar NugPay bakiyesinden düşer ve senin bakiyene geçer. Bakiye yetmiyorsa ödeme yetersiz bakiye gerekçesiyle reddedilir. Kart numarası, CVV veya 3D Secure yok.
Müşteri Nuglr kullanıcı adını girer ya da siten zaten “Nuglr ile giriş” kullanıyorsa kimliği bilinir. Onay isteği doğrudan telefonuna düşer.
Ekranda QR kod gösterirsin. Müşteri NugPay içindeki tarayıcıyla okutur, tutarı görür ve onaylar. Kodu Nuglr üretir (qr_url); ödeme belirteci dış bir servise gitmez.
# 1) Ödeme isteği aç
POST https://nuglr.com/api/v1/nugpay-checkout/Content-Type: application/x-www-form-urlencoded
action=create
&client_id=CLIENT_ID
&client_secret=CLIENT_SECRET
&amount=149.90
&order_id=SIP-1001
&description=Sneaker
&payer_username=musteri # doğrulama ile öde (QR icin bos birak)
&callback_url=https://ornek.com/nugpay/webhook
&return_url=https://ornek.com/siparis/tamam
# Cevap
{
"ok": true,
"payment": { "payment_id": "NP...", "status": "pending", "amount": 149.9, ... },
"qr_payload": "nuglr://pay/<token>",
"qr_url": "https://nuglr.com/api/v1/nugpay-qr/?t=<token>",
"expires_in": 900
}
# 2) Durumu sor (sayfa bunu 2 saniyede bir çağırabilir)
GET https://nuglr.com/api/v1/nugpay-checkout/?payment_id=NP...
# 3) Gerekirse iptal et
POST https://nuglr.com/api/v1/nugpay-checkout/action=cancel&client_id=...&client_secret=...&payment_id=NP...
function nugpay_create(array $fields): array {
$fields += ['action'=>'create','client_id'=>NUGPAY_CLIENT_ID,'client_secret'=>NUGPAY_CLIENT_SECRET];
$ch = curl_init('https://nuglr.com/api/v1/nugpay-checkout/');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query($fields),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 15,
]);
return json_decode(curl_exec($ch), true) ?: [];
}
$payment = nugpay_create([
'amount' => 149.90,
'order_id' => $order->id,
'description' => 'Sneaker',
'payer_username' => $customerNuglrUsername,
'callback_url' => 'https://ornek.com/nugpay/webhook',
]);
// QR ile öde: kodu Nuglr uretir, kendi sunucundan gomersin.
// Odeme belirteci ucuncu bir servise gitmez.
echo '<img src="'.htmlspecialchars($payment['qr_url']).'" width="220" height="220" alt="NugPay QR">';
const create = async (fields) => {
const body = new URLSearchParams({
action: 'create',
client_id: process.env.NUGPAY_CLIENT_ID,
client_secret: process.env.NUGPAY_CLIENT_SECRET,
...fields,
});
const res = await fetch('https://nuglr.com/api/v1/nugpay-checkout/', { method: 'POST', body });
return res.json();
};
const payment = await create({
amount: '149.90',
order_id: order.id,
description: 'Sneaker',
payer_username: customer.nuglrUsername,
callback_url: 'https://ornek.com/nugpay/webhook',
});
// Durum sorgusu
const status = await fetch(`https://nuglr.com/api/v1/nugpay-checkout/?payment_id=${payment.payment.payment_id}`).then(r => r.json());
import requests
def nugpay_create(**fields):
fields.update(action='create', client_id=CLIENT_ID, client_secret=CLIENT_SECRET)
return requests.post('https://nuglr.com/api/v1/nugpay-checkout/', data=fields, timeout=15).json()
payment = nugpay_create(
amount='149.90',
order_id=order.id,
description='Sneaker',
payer_username=customer.nuglr_username,
callback_url='https://ornek.com/nugpay/webhook',
)
status = requests.get('https://nuglr.com/api/v1/nugpay-checkout/', params={'payment_id': payment['payment']['payment_id']}).json()
# Musteri karar verdiginde Nuglr callback_url adresine POST atar.
# Govde JSON'dur ve X-Nuglr-Signature basligi HMAC-SHA256 imzasi tasir.
POST https://ornek.com/nugpay/webhook
Content-Type: application/json
X-Nuglr-Signature: <hmac_sha256(govde, webhook_anahtari)>
{ "payment_id":"NP...", "status":"approved", "amount":149.9,
"order_id":"SIP-1001", "method":"verify", "reason":"", "completed_at":"..." }
# PHP dogrulama
$raw = file_get_contents('php://input');
$sent = $_SERVER['HTTP_X_NUGLR_SIGNATURE'] ?? '';
if (!hash_equals(hash_hmac('sha256', $raw, NUGPAY_WEBHOOK_SECRET), $sent)) {
http_response_code(403); exit;
}
$event = json_decode($raw, true);
# status degerleri
# approved -> odeme tamam, siparisi onayla
# rejected -> musteri reddetti
# failed -> reason=insufficient_balance (yetersiz bakiye)
# expired -> 15 dakika icinde onaylanmadi
# cancelled -> satici iptal etti
1. Eklentiyi indirip WordPress → Eklentiler → Yeni Ekle alanından yükle.
2. WooCommerce → Ayarlar → Ödemeler → NugPay ile Öde bölümünü aç.
3. Client ID, Client Secret ve webhook anahtarını buradan kopyalayıp gir.
4. Ödeme yöntemini etkinleştir; kasada “NugPay ile öde” seçeneği çıkar.
5. Müşteri Nuglr kullanıcı adını girer ya da QR kodu okutur.
| Alan | Zorunlu | Açıklama |
|---|---|---|
amount | Evet | ₺1,00 – ₺50.000,00 arası tutar. |
order_id | Hayır | Kendi sipariş numaran; webhook ve durum cevabında aynen döner. |
description | Hayır | Onay ekranında müşteriye gösterilir. |
payer_username | Hayır | Doğrulama ile ödemede müşterinin Nuglr kullanıcı adı. Boş bırakılırsa ödeme QR ile sahiplenilir. |
payer_sub | Hayır | “Nuglr ile giriş” kullanıyorsan ID Token’daki sub değeri. |
callback_url | Hayır | Sonuç webhook’unun gideceği HTTPS adres. |
return_url | Hayır | Ödeme tamamlanınca müşteriyi döndüreceğin sayfa. |
Onaylanmayan istek kendiliğinden expired olur; para hareketi olmaz.
Aynı ödeme ikinci kez onaylanamaz; tekrar denemeler reddedilir.
Belirli bir kullanıcı için açılan isteği yalnızca o kişi görebilir ve onaylayabilir.
Gizli anahtar tarayıcıya düşmemeli. Bu uç yalnızca confidential uygulamalara açıktır.
Harita anahtarı OAuth uygulamasından bağımsızdır: client secret, redirect URI ya da izin ekranı gerekmez. Ad ver, ne için kullanacağını seç, anahtarı al.
Yer arama, adres çözümleme, rota ve mesafe matrisi tek anahtarla. Yemek siparişinden emlak sitesine, kurye takibinden etkinlik haritasına kadar aynı uçlar kullanılır.
Metin, kategori ve konum yarıçapıyla ara. Sonuçlar mesafeye göre sıralı gelir.
/api/v1/map/places/Fotoğraflar, kategori, puan ortalaması ve değerlendirme sayısı.
/api/v1/map/place/Adresten koordinata, koordinattan en yakın yere.
/api/v1/map/geocode/Ara duraklı yol tarifi, adım adım yönlendirme ve GeoJSON çizgi.
/api/v1/map/route/25×25'e kadar başlangıç–varış. Kurye ve şube atamasının çekirdeği.
/api/v1/map/matrix/Karo kaynağı ve tema; gömülü harita bunu kendisi çeker.
/api/v1/map/style/GPS izni yokken IP'den kaba konum. Hassasiyet açıkça bildirilir.
/api/v1/map/locate/Ürün kapsamı, alan adı kısıtı, günlük kota, anında iptal.
X-NugMap-Key"ok": true görüyorsan kurulum tamam.attribution.text kullanıcının gördüğü bir yerde bulunmalı. Gömülü harita bunu kendisi çizer.# Anahtarın çalışıyor mu — tek satırda dene
curl -H "X-NugMap-Key: nmap_SENIN_ANAHTARIN" \
"https://nuglr.com/api/v1/map/places/?q=kafe&lat=41.0082&lng=28.9784&radius=2000"
# Beklenen
{ "ok": true, "results": [ ... ], "attribution": { "text": "NugMap — Proudly Powered by Nuglr" } }
# Anahtar başlığını unutursan
{ "ok": false, "error": "key_missing" }
<!-- 1) Anahtarı "Web sitesi" ortamıyla al, alan adını yaz
2) Kapsam olarak en az "Harita yerleştirme" seç -->
<div id="harita" style="height:420px;border-radius:16px;overflow:hidden"></div>
<script src="https://nuglr.com/nugmap/embed.js"></script>
<script>
const map = NugMap.render('#harita', {
key: 'nmap_SITE_ANAHTARIN',
center: [41.0082, 28.9784],
zoom: 14,
markers: [{ lat: 41.0082, lng: 28.9784, title: 'Şubemiz' }]
});
// Yer arama — kapsamda "Yer arama" açık olmalı
map.search('eczane', { lat: 41.0082, lng: 28.9784, radius: 1500 })
.then(r => console.log(r.results));
</script>
// 1) Anahtarı "Android" ortamıyla al
// 2) Paket adı: build.gradle içindeki applicationId
// 3) SHA-1: keytool -list -v -keystore anahtar.jks
// (Play App Signing kullanıyorsan Play Console'daki SHA-1'i de ekle)
// local.properties → depoya girmez
// nugmapKey=nmap_...
// build.gradle
android {
defaultConfig {
buildConfigField "String", "NUGMAP_KEY", "\"${project.findProperty('nugmapKey')}\""
}
}
// İstek — paket ve imza başlıkları zorunlu
val request = Request.Builder()
.url("https://nuglr.com/api/v1/map/places/?q=kafe&lat=41.01&lng=28.97")
.header("X-NugMap-Key", BuildConfig.NUGMAP_KEY)
.header("X-Android-Package", BuildConfig.APPLICATION_ID)
.header("X-Android-Cert", signatureSha1()) // A1:B2:...
.build()
// Not: paketteki anahtar okunabilir. Rota ve yer aramayı kendi arka ucundan
// geçir; uygulamaya yalnız harita yerleştirme kapsamlı anahtar koy.
// 1) Anahtarı "iOS" ortamıyla al
// 2) Bundle kimliği: Xcode > Target > General > Bundle Identifier
// Config.xcconfig → depoya girmez
// NUGMAP_KEY = nmap_...
// Info.plist: NugMapKey = $(NUGMAP_KEY)
let key = Bundle.main.object(forInfoDictionaryKey: "NugMapKey") as? String ?? ""
let bundleId = Bundle.main.bundleIdentifier ?? ""
var request = URLRequest(url: URL(string:
"https://nuglr.com/api/v1/map/places/?q=kafe&lat=41.01&lng=28.97")!)
request.setValue(key, forHTTPHeaderField: "X-NugMap-Key")
request.setValue(bundleId, forHTTPHeaderField: "X-Ios-Bundle-Identifier")
URLSession.shared.dataTask(with: request) { data, _, _ in
guard let data else { return }
let result = try? JSONSerialization.jsonObject(with: data)
print(result ?? "")
}.resume()
# 401 key_missing
X-NugMap-Key başlığı yok. Sorgu dizesinde ?key= ile de gönderebilirsin ama
başlık tercih edilir (anahtar sunucu günlüklerine düşmez).
# 403 key_invalid
Anahtar yanlış, uygulama silinmiş ya da NugMap erişimi kapalı.
# 403 origin_blocked
Ortam kısıtı eşleşmedi. Yanıttaki key_platform alanı hangi ortam beklendiğini
söyler:
web → Origin/Referer alan adı listede yok
server → Çağrının IP'si listede yok (CIDR yazabilirsin)
android → X-Android-Package / X-Android-Cert eşleşmedi
ios → X-Ios-Bundle-Identifier eşleşmedi
# 403 product_disabled
Anahtarın kapsamında o ürün kapalı. Yanıt enabled_products ile açık olanları
listeler. Uygulama ayarlarından kapsamı genişlet.
# 429 quota_exceeded
Günlük kota doldu (varsayılan 25.000). Kotayı ayarlardan yükselt.
# route yanıtında "estimated": false → normal durum
Gerçek yol ağından hesaplandı; adım adım yönlendirme steps[] içinde.
# route yanıtında "estimated": true → yönlendirme sunucusu yanıt vermedi
Kuş uçuşu tahmine düşüldü. Müşteriye kesin varış saati verme; "yaklaşık" de.
# matrix hücresinde "reachable": false
O başlangıç–varış çifti için yol bulunamadı (ada, kapalı yol, deniz aşırı).
distance_m ve duration_s null gelir; uydurma değer üretilmez.
Anahtar oluştururken hangi ürünleri kullanacağını seçersin. Uçlar yalnız seçilen ürünlere yanıt verir; kapalı bir ürüne istek gelirse 403 product_disabled döner. Sitendeki anahtar sızarsa yalnız açtığın kadarına erişilir.
Yer arama ve detay uçları.
Adres ve koordinat çevirme.
Rota ve adım adım yönlendirme.
Mesafe matrisi.
Gömülü harita ve stil ucu.
IP tabanlı kaba konum.
Anahtarı başlıkta gönder. Sorgu dizesindeki anahtar sunucu günlüklerine ve tarayıcı geçmişine düşer; yalnız hızlı denemede kullan.
# Yakındaki restoranlar
curl -H "X-NugMap-Key: nmap_..." \
"https://nuglr.com/api/v1/map/places/?q=kebap&lat=41.0082&lng=28.9784&radius=2000&limit=10"
# Cevap
{
"ok": true,
"results": [
{ "id": 42, "name": "...", "category": "restoran",
"location": { "lat": 41.01, "lng": 28.98 }, "distance_m": 340 }
],
"total": 7,
"attribution": { "text": "NugMap — Proudly Powered by Nuglr", "required": true }
}
# Rota (ara duraklı)
curl -H "X-NugMap-Key: nmap_..." \
"https://nuglr.com/api/v1/map/route/?from=41.01,28.97&to=40.99,29.02&waypoints=41.00,29.00&mode=driving"
# Mesafe matrisi — hangi kurye daha yakın
curl -H "X-NugMap-Key: nmap_..." \
"https://nuglr.com/api/v1/map/matrix/?origins=41.01,28.97|41.05,29.00&destinations=40.99,29.02"
function nugmap(string $path, array $query = []): array {
$url = 'https://nuglr.com/api/v1/map/' . $path . '/?' . http_build_query($query);
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['X-NugMap-Key: ' . NUGMAP_KEY],
CURLOPT_TIMEOUT => 10,
]);
$raw = curl_exec($ch);
curl_close($ch);
return json_decode((string)$raw, true) ?: ['ok' => false];
}
// Siparişi en yakın şubeye yönlendir
$branches = ['41.0082,28.9784', '41.0450,29.0000'];
$matrix = nugmap('matrix', [
'origins' => implode('|', $branches),
'destinations' => $customerLat . ',' . $customerLng,
]);
$best = null;
foreach ($matrix['rows'] as $i => $row) {
if ($best === null || $row[0]['duration_s'] < $matrix['rows'][$best][0]['duration_s']) $best = $i;
}
echo 'En yakın şube: ' . $branches[$best];
// Atıf zorunlu — kullanıcıya görünen yerde göster
echo '<small>' . htmlspecialchars($matrix['attribution']['text']) . '</small>';
const NUGMAP_KEY = process.env.NUGMAP_KEY;
async function nugmap(path, query) {
const url = new URL(`https://nuglr.com/api/v1/map/${path}/`);
Object.entries(query).forEach(([k, v]) => url.searchParams.set(k, v));
const res = await fetch(url, { headers: { 'X-NugMap-Key': NUGMAP_KEY } });
if (res.status === 429) throw new Error('Günlük kota doldu');
return res.json();
}
// Kullanıcı yazarken yer öner
const found = await nugmap('places', { q: 'pizza', lat: 41.01, lng: 28.97, radius: 3000 });
found.results.forEach(p => console.log(p.name, `${p.distance_m} m`));
// Teslimat süresi
const route = await nugmap('route', { from: '41.01,28.97', to: '40.99,29.02' });
if (route.route.estimated) {
// Yol ağı verisi yoksa süre tahminidir; müşteriye kesin saat vaat etme.
console.warn(route.route.estimate_note);
}
console.log(Math.round(route.route.duration_s / 60), 'dakika');
import requests
KEY = "nmap_..."
BASE = "https://nuglr.com/api/v1/map"
def nugmap(path, **query):
r = requests.get(f"{BASE}/{path}/", params=query,
headers={"X-NugMap-Key": KEY}, timeout=10)
r.raise_for_status()
return r.json()
# Adresten koordinat
hit = nugmap("geocode", address="Kadıköy")
if hit["results"]:
loc = hit["results"][0]["location"]
print(loc["lat"], loc["lng"])
# Ters geocoding — kullanıcının konumu neresi
where = nugmap("geocode", lat=40.9903, lng=29.0250)
print(where["results"][0]["name"] if where["results"] else "Bilinmiyor")
NugMap anahtarı parola değildir ama sınırsız da değildir: kotanı harcar. Nereye koyduğun, anahtarı nasıl kısıtladığını belirler.
PHP, Node, Python, Go — anahtarı ortam değişkeninde tut, isteği kendi sunucundan at. Anahtar tarayıcıya hiç inmez.
Harita çizmek için anahtar sayfada bulunmak zorunda. Bu kaçınılmazdır; alan adı kısıtı ve yalnız embed kapsamıyla koru.
APK/IPA açılıp anahtar okunabilir. Rota ve yer aramayı kendi arka ucundan geçir; uygulamaya yalnız embed anahtarı koy.
Git'e anahtar yazma. .env kullan, .gitignore'a ekle. Sızdıysa uygulama ayarlarından tek tıkla yenile.
Pratik kural: iki anahtar üret. Biri sunucu için tüm kapsamlarla ve alan adı kısıtı olmadan; diğeri site için yalnız embed kapsamıyla ve kendi alan adına kilitli.
# .env — depoya girmez (.gitignore'a ekle)
NUGMAP_SERVER_KEY=nmap_sunucu_anahtari # tüm kapsamlar, arka uçta kalır
NUGMAP_PUBLIC_KEY=nmap_site_anahtari # yalnız embed, alan adına kilitli
# .gitignore
.env
.env.local
<?php
// config.php — anahtar koda gömülmez, ortamdan okunur
define('NUGMAP_KEY', getenv('NUGMAP_SERVER_KEY') ?: '');
function nugmap(string $path, array $query = []): array {
$ch = curl_init('https://nuglr.com/api/v1/map/' . $path . '/?' . http_build_query($query));
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['X-NugMap-Key: ' . NUGMAP_KEY],
CURLOPT_TIMEOUT => 10,
]);
$raw = curl_exec($ch);
curl_close($ch);
return json_decode((string)$raw, true) ?: ['ok' => false];
}
// Sayfa yalnız sonucu görür; anahtar tarayıcıya hiç inmez
$yakin = nugmap('places', ['q' => 'eczane', 'lat' => 41.01, 'lng' => 28.97, 'radius' => 1500]);
// server.js — anahtar yalnız sunucuda
const KEY = process.env.NUGMAP_SERVER_KEY;
app.get('/api/yakin-subeler', async (req, res) => {
const url = new URL('https://nuglr.com/api/v1/map/places/');
url.searchParams.set('q', 'şube');
url.searchParams.set('lat', req.query.lat);
url.searchParams.set('lng', req.query.lng);
const upstream = await fetch(url, { headers: { 'X-NugMap-Key': KEY } });
const data = await upstream.json();
// Tarayıcıya yalnız gerekli alanlar gider
res.json({ results: data.results, attribution: data.attribution });
});
<!-- Gömülü haritada anahtar görünür; kısıtlarla koru -->
<div id="harita" style="height:420px"></div>
<script src="https://nuglr.com/nugmap/embed.js"></script>
<script>
NugMap.render('#harita', {
key: 'nmap_site_anahtari', // yalnız embed kapsamı, alan adına kilitli
center: [41.0082, 28.9784],
zoom: 14
});
</script>
<!-- Uygulama ayarlarında mutlaka yap:
· Kapsam: sadece "Harita yerleştirme"
· İzinli alan adları: ornek.com, *.ornek.com
Bu ikisi olmadan anahtarı kopyalayan herkes kotanı harcar. -->
// iOS — Info.plist ya da xcconfig, koda gömme
// NugMapKey = $(NUGMAP_PUBLIC_KEY)
let key = Bundle.main.object(forInfoDictionaryKey: "NugMapKey") as? String ?? ""
var request = URLRequest(url: url)
request.setValue(key, forHTTPHeaderField: "X-NugMap-Key")
// Android — local.properties + BuildConfig
// gradle: buildConfigField "String", "NUGMAP_KEY", "\"${nugmapKey}\""
val request = Request.Builder()
.url(url)
.header("X-NugMap-Key", BuildConfig.NUGMAP_KEY)
.build()
// Not: paketteki anahtar okunabilir. Rota ve yer aramayı kendi arka ucundan
// geçir; uygulamaya yalnız embed kapsamlı anahtarı koy.
Tek etiketle gömülü harita. Atıf otomatik çizilir, ayrıca eklemene gerek yoktur.
<div id="harita" style="height:420px"></div>
<script src="https://nuglr.com/nugmap/embed.js"></script>
<script>
NugMap.render('#harita', {
key: 'nmap_...',
center: [41.0082, 28.9784],
zoom: 14,
markers: [{ lat: 41.0082, lng: 28.9784, title: 'Şubemiz' }]
});
</script>
// Sipariş takibi: kuryenin konumunu canlı çiz
const map = NugMap.render('#harita', { key: 'nmap_...', center: [41.01, 28.97], zoom: 15 });
setInterval(async () => {
const courier = await fetchCourierLocation(); // kendi ucun
map.setMarkers([
{ lat: courier.lat, lng: courier.lng, title: 'Kurye' },
{ lat: customer.lat, lng: customer.lng, title: 'Teslimat' },
]);
const route = await map.route([courier.lat, courier.lng], [customer.lat, customer.lng]);
map.drawRoute(route);
}, 10000);
/map/geocode/ ile koordinata çevir; belirsizse /map/places/ önerilerini göster./map/matrix/ ile tüm şubelerden müşteriye süreyi al, en kısa olanı seç./map/route/ süresine hazırlık süresini ekle. Yanıtta estimated: true geliyorsa "yaklaşık" de, kesin saat verme.attribution.text kullanıcıya görünen bir yerde bulunmalı. Gömülü harita bunu kendisi çizer.429 ve quota_exceeded döner.estimated: false gelir.estimated: true ile bildirir. Teslimat süresi gösteriyorsan bu alanı kontrol et.403 product_disabled döner ve yanıt açık ürünleri listeler. Kapsamı uygulama ayarlarından değiştirebilirsin./map/locate/ IP tabanlıdır, şehir ölçeğinde doğruluk verir ve accuracy_m ile bunu bildirir. Teslimat adresi gibi kesin konum isteyen işlerde tarayıcı GPS'ini kullan.401 key_missing · 403 key_invalid · 403 referrer_blocked · 429 quota_exceeded · 422 bad_request · 403 product_disabledİkisi de Nuglr logosunu kullanır. Kopyalayıp olduğu gibi kullanabilirsin; tek bağımlılık logo adresidir.
<a class="nuglr-brand-button nuglr-brand-login" href="/auth/nuglr/start">
<span class="nuglr-brand-mark"><img src="https://nuglr.com/assets/img/logo.png" alt=""></span>
<span>Nuglr ile giriş yap</span>
</a>
<a class="nuglr-brand-button nuglr-brand-pay" href="/odeme/nugpay/baslat">
<span class="nuglr-brand-mark"><img src="https://nuglr.com/assets/img/logo.png" alt=""></span>
<span>NugPay ile öde</span>
</a>
.nuglr-brand-button{display:inline-flex;align-items:center;gap:12px;min-height:52px;
padding:10px 22px 10px 10px;border-radius:16px;text-decoration:none;font-weight:800;
letter-spacing:-.01em;transition:transform .18s ease,box-shadow .18s ease}
.nuglr-brand-button:hover{transform:translateY(-1px)}
.nuglr-brand-mark{width:32px;height:32px;border-radius:10px;background:#ffd31a;
display:grid;place-items:center;overflow:hidden;flex:0 0 32px}
.nuglr-brand-mark img{width:100%;height:100%;object-fit:cover;display:block}
.nuglr-brand-login{background:linear-gradient(135deg,#111827,#020617);color:#fff;
box-shadow:0 14px 30px rgba(2,6,23,.24)}
.nuglr-brand-pay{background:#ffd31a;color:#111827;
box-shadow:0 14px 30px rgba(255,211,26,.32)}
Kod ele geçirilse bile verifier olmadan token alınamaz.
openid profile email ile RS256 imzalı ID Token döner.
Uygulamalar ID Token imzasını Nuglr JWKS endpointinden doğrular.
Yalnızca kayıtlı dönüş adreslerine yönlendirme yapılır.
Client Secret daha sonra tekrar gösterilmez.
Webhook imzasını bu anahtarla doğrula. Yenilersen eski anahtar geçersiz olur.