Satıştaki Ürünler

1.7k görüntülenme Markdown

Satıştaki ürünleri, kategorilerini ve sipariş şemasını veren üç uç.

Genel Bakış

Bu üç uç, müşterinin satın alabileceği şeyleri gösterir. Vitrinde ne varsa burada da odur: kapalı, gizli ya da grubu kapatılmış ürün hiç görünmez.

Fiyatlar hesabın cüzdan para biriminde gelir. Böylece listelenen rakam bakiyeyle doğrudan karşılaştırılabilir ve sipariş anında sürpriz çıkmaz.

Detay ucu bir katalog kaydından fazlasını verir: sipariş gövdesinin şemasıdır. Döngüler, ek hizmetler, sorulacak alanlar ve alan adı ekseni oradan okunur.

Referans

Ürünleri Listeleme

get/api/v1/client/products
Products/GetProducts cüzdan para birimi

Sipariş edilebilecek ürünleri vitrin sırasıyla döndürür.

Sorgu 5
pageintKaçıncı sayfa.
limitintSayfa başına satır. En çok 100.
typestringTek bir ürün türü. Bilinmeyen tür reddedilir ve geçerli liste yanıtın ayrıntısında gelir.
categoryintKategori numarası. Ana kategoriyle de ek atamalarla da eşleşir.
searchstringÜrün başlığında arar.
Dönen alanlar data[] — 8 + meta — 5
idintÜrünün numarası.
typestringÜrün türü.
titlestringÜrün adı.
taglinestringKısa tanıtım cümlesi.
categoryobjectAna kategori. Numara ve ad taşır; kategorisiz üründe boş gelir.
in_stockboolSipariş edilebilir mi. Yalnız stok takibi açıkken ve sayaç sıfırken kapanır.
stockintKalan stok. Boş gelmesi takip edilmediği anlamına gelir.
pricingobject[]Ödeme döngüsü başına bir fiyat satırı.
totalintToplam ürün. Meta altında döner.
pageintBulunulan sayfa.
limitintSayfa boyutu.
next_pageintSonraki sayfa.
currencystringBütün fiyatların para birimi. Hesabın cüzdan birimidir.
Hatalar 2
type_invalid422Ürün türü bilinmiyor ya da o grup kapalı.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl 'https://panel.ornek.com/api/v1/client/products?type=hosting' \
  -H "Authorization: Bearer $CLIENT_KEY"
const res = await fetch('https://panel.ornek.com/api/v1/client/products?type=hosting', {
  headers: { Authorization: `Bearer ${clientKey}` },
});

const { data, meta } = await res.json();
renderPrices(data, meta.currency);
$ch = curl_init('https://panel.ornek.com/api/v1/client/products?type=hosting');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $clientKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Fiyatlar CUZDAN para biriminde gelir: bakiyeyle dogrudan karsilastirilabilir, cevirmeyin.
$r = Kernel::internal('client:Products/GetProducts', ['owner_id' => $uid, 'type' => 'hosting']);
$cur = $r['meta']['currency'];

Kategorileri Listeleme

get/api/v1/client/products/categories
Products/GetProductCategories sayfalama yok

Vitrinde görünen ürün kategorilerini düz bir liste olarak döndürür.

Sorgu 1
typestringYalnız bu türün kategorileri. Bilinmeyen değer boş liste verir, hata değil.
Dönen alanlar data[] — 4 + meta — 1
idintKategorinin numarası. Ürün listesinin kategori süzgecine bu değer verilir.
parentintÜst kategorinin numarası. Boş gelmesi en üst seviye demektir.
typestringKategorinin ürün türü.
namestringKategori adı.
totalintKategori sayısı. Meta altında döner.
Hatalar 1
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl 'https://panel.ornek.com/api/v1/client/products/categories' \
  -H "Authorization: Bearer $CLIENT_KEY"
const res = await fetch('https://panel.ornek.com/api/v1/client/products/categories', {
  headers: { Authorization: `Bearer ${clientKey}` },
});

const { data } = await res.json();
const roots = data.filter((c) => c.parent === null);
$ch = curl_init('https://panel.ornek.com/api/v1/client/products/categories');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $clientKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Liste DUZDUR: agaci ust kategori alanindan kendiniz kurun, uc hazir agac vermez.
$rows = Kernel::internal('client:Products/GetProductCategories', ['owner_id' => $uid])['data'];
$tree = [];
foreach ($rows as $c) $tree[$c['parent'] ?? 0][] = $c;

Ürün Detayı ve Sipariş Şeması

get/api/v1/client/products/{id}
Products/GetProduct sipariş girdisi

Bir ürünü, sipariş gövdesini kurmak için gereken her şeyle döndürür.

Dönen alanlar data — 14
idintÜrünün numarası.
typestringÜrün türü.
titlestringÜrün adı.
taglinestringKısa tanıtım cümlesi.
descriptionstringTam açıklama. Vitrindeki işaretlemesiyle gelir.
categoryobjectAna kategori.
in_stockboolSipariş edilebilir mi.
stockintKalan stok.
quantityobjectAdet kuralı. İzin ve kip taşır: tek birim, her birim ayrı hizmet ya da tek hizmet içinde ölçeklenen adet.
order_limit_per_userintHesap başına en çok kaç hizmet. Boş gelmesi sınırsız demektir.
pricingobject[]Ödeme döngüsü başına bir fiyat satırı.
addonsobject[]Siparişte seçilebilecek ek hizmetler. Her biri numara, ad, açıklama, giriş türü, zorunluluk, seçenekler ve kendi soruları ile gelir.
requirementsobject[]Siparişin doldurması gereken alanlar. Numara, ad, giriş türü ve zorunluluk taşır; seçimli tipler seçenek listesi, dosya tipi izinli uzantı ve boyut sınırı ekler.
metricsobject[]Kullanıma göre ücretlenen sayaçlar. Numara, tür, etiket, birim, ücretlendirme şeması, dahil miktar, tavan ve kademe fiyatları taşır.
domainobjectAlan adı ekseni. Kipe göre seçim listesi, alt alan adı kökleri ya da lisans alanları taşır.
Hatalar 2
not_found404Ürün yok, kapalı, gizli ya da grubu kapatılmış. Dördü bilinçli olarak ayırt edilmez.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl 'https://panel.ornek.com/api/v1/client/products/36' \
  -H "Authorization: Bearer $CLIENT_KEY"
const res = await fetch(`https://panel.ornek.com/api/v1/client/products/${id}`, {
  headers: { Authorization: `Bearer ${clientKey}` },
});

const { data } = await res.json();
const must = data.requirements.filter((r) => r.required);
const cycles = data.pricing.map((p) => p.cycle);
$ch = curl_init('https://panel.ornek.com/api/v1/client/products/' . $id);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $clientKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// YENI alan adi buradan siparis edilemez: kayit ve transfer Domains uclarinda yapilir.
$pr = Kernel::internal('client:Products/GetProduct', ['owner_id' => $uid, 'id' => $id])['data'];
$viaDomains = ($pr['domain']['register_transfer'] ?? '') === 'via_domains_endpoints';

Tuzaklar

Yeni alan adı bu uçlardan sipariş edilmez

Ürün detayındaki alan adı ekseni yalnız sahip olduğunuz bir alan adını kullanmayı ya da ücretsiz bir alt alan adı seçmeyi kapsar. Yeni bir alan adı kaydetmek ya da transfer etmek alan adı uçlarına aittir. Bunu karıştırmak sipariş gövdesinde karşılığı olmayan bir alan aramaya yol açar.

Listelenen fiyat kampanyalı fiyatın kendisidir

Bir döngüde kampanya varsa fiyat alanı kampanyalı tutarı taşır ve kampanya işareti doğru gelir. Yani listeyi görüp üzerine indirim uygulamak tutarı iki kez düşürür. Sipariş motorunun tahsil ettiği rakam da budur; listeyle sepet asla çelişmez.

Bulunamayan ürün dört farklı sebepten olabilir

Detay ucu bilinmeyen, kapalı, gizli ve grubu kapatılmış ürünü aynı yanıtla karşılar. Bu bilinçlidir: yanıt ürünün var olup olmadığını sızdırmaz. Bir ürün listede görünmüyorsa nedenini API'den öğrenemezsiniz, operatöre sorulur.

Adet kipi üç farklı sipariş anlamına gelir

Adet kuralı üç kipten birindedir: sipariş başına tek birim, her birim için ayrı bir hizmet, ya da tek hizmet içinde ölçeklenen adet. İkinci kipte on adet sipariş etmek on hizmet doğurur; üçüncüde bir hizmet ve on katı fiyat. Arayüzü kipi okumadan kurmayın.

Kategori listesi ağaç değil, düz listedir

Kategoriler düz döner ve hiyerarşi üst kategori alanından kurulur. Sayfalama da yoktur: küme her zaman bütün gelir. Bir kategori seçimi ürün listesine süzgeç olarak verilir ve alt kategorileri kendiliğinden kapsamaz.

Faydalı oldu mu?

Geri bildiriminiz için teşekkürler!

Hâlâ Yardıma mı İhtiyacınız Var?

Yukarıda bulamadığınız her şey için destek ekibimiz her zaman yanınızda.