Bayilik

1.7k görüntülenme Markdown

Bir müşterinin bayi durumunu ve bayi programının kurulum genelindeki ayarlarını yöneten beş uç.

Genel Bakış

Bayilik, bir müşterinin sizden indirimli alıp kendi müşterilerine satmasıdır. Bu uçlar iki ayrı katmanı yönetir ve karıştırılmamalıdır.

İlk üç uç tek bir müşteriye bakar: o müşterinin bayi durumu, kredi eşiği ve indirim kademeleri. Son iki uç programın kendisini yönetir: başvurular nasıl onaylanır, doğrulama zorunlu mudur, bayilere API erişimi verilir mi. Adres içinde müşteri kimliği olup olmaması bu ayrımı gösterir.

Yapı

İndirim Kademeleri

Müşteriye özel discounts ile program geneli discount_rates aynı biçimi paylaşır. Her kademe anahtarı from, to ve rate taşıyan satırların listesine karşılık gelir.

Kademe anahtarıNeye uygulanırÖrnek
defaultTüm ürünler, alan adları ve eklentilerdefault
<grup>Bir grubun tamamı: hosting, server, software, ssl, domain (tüm uzantılar) ya da addon (tüm eklentiler)hosting
special/<grup_id>Bir özel ürün grubuspecial/446
<grup>/<kategori_id>Bir ürün kategorisi, alt kategorilerindeki ürünler dahilhosting/550
<grup>/0Grubun hiçbir kategoriye bağlı olmayan ürünlerihosting/0
special-<grup_id>/0Bir özel grubun kategorisiz ürünleri; special/0 tüm özel grupları kapsarspecial-445/0
<tip>-<ürün_id>Tek bir ürün; özel grup ürünü special-<ürün_id> biçimindedirhosting-15
domain-<uzantı>Tek bir alan adı uzantısıdomain-com
addon-<eklenti_id>Tek bir eklentiaddon-8

Önceki sürümlerin yazdığı anahtarlar da çözülür. special-<grup_id>, o id'de özel grup ürünü yoksa özel grup olarak okunur. domain-<uzantı_id>, uzantının sayısal id'si olarak okunur. Hiçbir biçime uymayan anahtar gönderildiği gibi saklanır ama hiçbir satıra uygulanmaz. Üç değeri de 0 olan satır kayıtta düşürülür.

Bayi hangi kademeleri alır. Program geneli discount_rates her aktif bayiye uygulanır. Bayinin kendi kademesi olan anahtar, programdaki aynı anahtarın kademelerinin bütünüyle yerine geçer. İki satır listesi birleştirilmez. Programdaki diğer her anahtar uygulanmaya devam eder; kendine özel kademesi olmayan bayi program oranlarıyla fiyatlanır.

Satırı hangi kademe fiyatlar. Eşleşen satırı olan en dar hedef kazanır: ürün, eklenti, alan adı uzantısı, kategori, kategorisiz, grup ve son olarak default. Kategoride önce ürünün kendi kategorisine, sonra ağaçta yukarı doğru her üst kategoriye bakılır. Bir anahtarın içinde, aralığı sayıyı kapsayan ilk satır uygulanır. Eşleşen satırı olmayan ya da satırının oranı 0 olan anahtar bir sonraki hedefe bırakır.

Ne sayılır. Kademe, müşterinin o kademenin düzeyindeki hizmetleriyle seçilir. Ürün kademesi o ürünü, kategori kademesi kategoriyi alt kategorileriyle birlikte sayar. Kategorisiz kademe grubun kategorisiz ürünlerini, grup kademesi grubun tamamını sayar. addon grubu müşterinin eklentilerini, default tüm hizmetleri sayar. Alan adı kademesi o uzantıyı, eklenti kademesi o eklentiyi sayar. Sipariş, sepet ve bayi panosu iptal edilmemiş her hizmeti sayar; bekleyenler de dahildir. Fatura satırları yalnız aktif hizmetleri sayar: yenileme, yükseltme ve fatura ekranlarında yazılan satırlar.

Referans

Bayi Durumunu Getirme

get/api/v1/admin/clients/{id}/reseller
Clients/GetClientReseller admin iki farklı şekil

Müşterinin bayi durumunu ve kendisine özel bayi ayarlarını döndürür.

Dönen alanlar data — 7
is_resellerboolBayilik etkin mi. Bayi kaydı hiç yoksa yanıtta bundan başka alan olmaz.
statusstringactive ya da inactive.
activation_timedatetime | nullİlk aktivasyonun zamanı.
min_creditobjectAlışveriş için gereken en az kredi.
amountfloatTutar.
currency_idintPara birimi kimliği.
min_discountobjectİndirimin geçerli olması için gereken en az bakiye.
amountfloatTutar.
currency_idintPara birimi kimliği.
only_credit_paymentboolYalnız krediyle ödeme zorunlu mu.
discountsobjectKademe anahtarından (default, hosting, hosting/550, hosting-15, domain-com, addon-8) indirim kademelerine eşleme.
fromintAktif hizmet sayısının alt sınırı (dahil).
tointÜst sınır (dahil); 0 üst sınır yok demektir.
ratefloatİndirim yüzdesi, 2 ondalığa yuvarlanır.
Hatalar 2
not_found404Müşteri bulunamadı.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl 'https://panel.ornek.com/api/v1/admin/clients/42/reseller' \
  -H "Authorization: Bearer $API_KEY"
const res  = await fetch('https://panel.ornek.com/api/v1/admin/clients/42/reseller', {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();

// Bayi kaydi yoksa yanit tek alanlidir.
if (!body.data.is_reseller) return;
$ch = curl_init('https://panel.ornek.com/api/v1/admin/clients/42/reseller');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
$response = Api::Clients()->GetClientReseller(['id' => 42]);

// Diger alanlar yalnizca bayi kaydi varken gelir — null-safe okuyun.
$minCredit = $response['data']['min_credit']['amount'] ?? 0;
Yanıt
{
  "data": {
    "is_reseller": true,
    "status": "active",
    "activation_time": "2026-02-01 12:00:00",
    "min_credit": { "amount": 100.00, "currency_id": 840 },
    "min_discount": { "amount": 50.00, "currency_id": 840 },
    "only_credit_payment": false,
    "discounts": {
      "hosting": [{ "from": 1, "to": 10, "rate": 15.0 }, { "from": 11, "to": 0, "rate": 17.5 }]
    }
  }
}
{
  "data": {
    "is_reseller": false
  }
}

Bayi Ayarlarını Kaydetme

patch/api/v1/admin/clients/{id}/reseller
Clients/UpdateClientReseller admin ilk aktivasyonda bildirim

Müşteriye özel bayi ayarlarını kaydeder ve bayiliği açıp kapatır.

Gövde 5
activeboolBayiliği açar ya da kapatır.
min_creditobjectEn az kredi gereksinimi. Yalnız bayilik açıkken anlamlı.
amountfloatTutar.
currency_idintPara birimi kimliği.
min_discountobjectİndirim için en az bakiye. Yalnız bayilik açıkken anlamlı.
amountfloatTutar.
currency_idintPara birimi kimliği.
only_credit_paymentboolÖdemeyi krediyle sınırlar.
discountsobjectKademe anahtarından (default, hosting, hosting/550, hosting-15, domain-com, addon-8) indirim kademelerine eşleme.
fromintAktif hizmet sayısının alt sınırı (dahil).
tointÜst sınır (dahil); 0 ya da boş, üst sınır yok demektir.
ratefloatİndirim yüzdesi, 2 ondalığa yuvarlanır.
Dönen alanlar data
dataobjectKayıt sonrası bayi kaydı. Okuma ucuyla aynı şekildedir.
Hatalar 2
not_found404Müşteri bulunamadı.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl -X PATCH 'https://panel.ornek.com/api/v1/admin/clients/42/reseller' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"active":true,"min_credit":{"amount":100,"currency_id":840},"only_credit_payment":true}'
const res = await fetch('https://panel.ornek.com/api/v1/admin/clients/42/reseller', {
  method: 'PATCH',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    active: true,
    min_credit: { amount: 100, currency_id: 840 },
    only_credit_payment: true,
    discounts: {
      5: [{ from: 1, to: 10, rate: 15 }],
    },
  }),
});

const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/clients/42/reseller');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'PATCH',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'active'              => true,
        'min_credit'         => ['amount' => 100, 'currency_id' => 840],
        'only_credit_payment' => true,
    ]),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Bayilik acikken gondermediginiz ayar KISITI KALDIRIR — once mevcut hali okuyun.
$current = Api::Clients()->GetClientReseller(['id' => 42])['data'];

$response = Api::Clients()->UpdateClientReseller([
    'id'                  => 42,
    'active'              => true,
    'min_credit'          => $current['min_credit'],
    'min_discount'        => $current['min_discount'],
    'only_credit_payment' => true,
    'discounts'           => $current['discounts'],
]);

Bayi Durumunu Değiştirme

put/api/v1/admin/clients/{id}/reseller/status
Clients/SetClientResellerStatus admin ayarlara dokunmaz

Var olan bir bayi kaydını açıp kapatır. Ayarlar olduğu gibi kalır.

Gövde 1
actionstringzorunluactivate ya da terminate.
Dönen alanlar data — 2
statusstringİşlem sonrası durum.
is_resellerboolBayilik etkin mi.
Hatalar 3
not_found404Müşteri bulunamadı.
action_invalid422action iki değerden biri değil.
not_reseller422Müşterinin bayi kaydı yok. Önce ayarlar ucuyla oluşturun.
İstek
curl -X PUT 'https://panel.ornek.com/api/v1/admin/clients/42/reseller/status' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"action":"activate"}'
const res = await fetch('https://panel.ornek.com/api/v1/admin/clients/42/reseller/status', {
  method: 'PUT',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ action: 'activate' }),
});

const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/clients/42/reseller/status');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'PUT',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['action' => 'activate']),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
$response = Api::Clients()->SetClientResellerStatus([
    'id'     => 42,
    'action' => 'activate',
]);

Program Ayarlarını Getirme

get/api/v1/admin/clients/reseller/config
Clients/GetResellerConfig admin kurulum geneli

Bayi programının kurulum genelindeki ayarlarını döndürür. Tek bir müşteriye bakmaz.

Dönen alanlar data — 10
enabledboolProgram açık mı.
activationstringBaşvuru onayı biçimi. Saklanan değer manuel ya da auto.
allow_non_membersboolÜye olmayanlar bayi vitrinini görebilir mi.
api_accessboolBayilere API erişimi verilir mi.
payment_restrictionboolÖdeme krediyle sınırlı mı.
verificationboolBaşvuruda doğrulama zorunlu mu.
verification_methodsstring[]Zorunlu tutulan doğrulama yöntemleri.
min_creditobjectEn az kredi tutarı.
amountfloatTutar.
currency_idintPara birimi kimliği.
credit_thresholdobjectKredi eşiği.
amountfloatTutar.
currency_idintPara birimi kimliği.
discount_ratesobjectKademe anahtarından (default, hosting, hosting/550, hosting-15, domain-com, addon-8) indirim kademelerine eşleme.
fromintAktif hizmet sayısının alt sınırı (dahil).
tointÜst sınır (dahil); 0 üst sınır yok demektir.
ratefloatİndirim yüzdesi, 2 ondalığa yuvarlanır.
Hatalar 1
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl 'https://panel.ornek.com/api/v1/admin/clients/reseller/config' \
  -H "Authorization: Bearer $API_KEY"
const res  = await fetch('https://panel.ornek.com/api/v1/admin/clients/reseller/config', {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/clients/reseller/config');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
$response = Api::Clients()->GetResellerConfig();

Program Ayarlarını Kaydetme

put/api/v1/admin/clients/reseller/config
Clients/SaveResellerConfig admin kurulum geneli

Bayi programının kurulum genelindeki ayarlarını kaydeder.

Gövde 10
enabledboolProgramı açar ya da kapatır.
activationstringmanual, automatic ya da auto. Tanınmayan değer elle onaya düşer.
allow_non_membersboolÜye olmayanlara vitrini açar.
api_accessboolBayilere API erişimi verir.
payment_restrictionboolÖdemeyi krediyle sınırlar.
verificationboolBaşvuruda doğrulamayı zorunlu kılar.
verification_methodsstring[]Zorunlu tutulacak doğrulama yöntemleri.
min_creditobjectEn az kredi tutarı.
amountfloatTutar.
currency_idintPara birimi kimliği.
credit_thresholdobjectKredi eşiği.
amountfloatTutar.
currency_idintPara birimi kimliği.
discount_ratesobjectKademe anahtarından (default, hosting, hosting/550, hosting-15, domain-com, addon-8) indirim kademelerine eşleme. Tam seti gönderin; gönderilmeyen kademe silinir.
fromintAktif hizmet sayısının alt sınırı (dahil).
tointÜst sınır (dahil); 0 ya da boş, üst sınır yok demektir.
ratefloatİndirim yüzdesi, 2 ondalığa yuvarlanır.
Dönen alanlar data
dataobjectKayıt sonrası program ayarları. Okuma ucuyla aynı şekildedir.
Hatalar 1
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl -X PUT 'https://panel.ornek.com/api/v1/admin/clients/reseller/config' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"enabled":true,"activation":"manual","api_access":true}'
const res = await fetch('https://panel.ornek.com/api/v1/admin/clients/reseller/config', {
  method: 'PUT',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    enabled: true,
    activation: 'manual',
    api_access: true,
  }),
});

const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/clients/reseller/config');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'PUT',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'enabled'    => true,
        'activation' => 'manual',
        'api_access' => true,
    ]),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
$response = Api::Clients()->SaveResellerConfig([
    'enabled'    => true,
    'activation' => 'manual',
    'api_access' => true,
]);

Tuzaklar

Göndermediğiniz ayar kısıtı kaldırır

Bayilik açıkken ayarları kaydederseniz, gönderilmeyen bir kısıt silinir; eski değeri korunmaz. Yalnız ödeme kısıtını değiştirmek isterken kredi eşiğini göndermeyi unutmak o eşiği kaldırır. Önce mevcut ayarları okuyun, üzerinde değişikliği yapın, tamamını geri gönderin.

Yanıtın şekli kayda göre değişir

Müşterinin bayi kaydı yoksa durum ucu yalnız is_reseller döndürür; diğer alanlar hiç gelmez. Bunları doğrudan okumak yerine null-safe erişin, yoksa bayi olmayan her müşteride hata alırsınız.

Durum ucu boşluktan bayi yaratmaz

Hızlı açma ucu yalnız var olan bir kaydı değiştirir; kaydı olmayan müşteride not_reseller döner. Yeni bir bayi açmak ayarlar ucunun işidir.

Üst sınırı 0 olan kademe açık uçludur

to değeri 0 olan (ya da boş gönderilen) kademenin üst sınırı olmaz: from ve üzerini kapsar. Bunu boş bir aralık saymayın. Kademe anahtarı olarak hosting ya da hosting-15 gibi metinler kullanılır; yalın bir sayı hiçbir ürünle eşleşmez.

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.