Müşteri Uçları
Müşteri kaynağının yedi ucu: okuma, oluşturma, güncelleme, silme, kimlik bilgisi doğrulama ve oturum açma. Her biri için gönderilecek alanlar, dönen alanlar ve çalışan örnek.
Genel Bakış
Müşteri kaynağı, panelin Müşteriler ekranının API karşılığıdır. Aynı iş kurallarını uygular: bir müşteri oluştururken şifre uzunluğu ya da e-posta benzersizliği panelde ne ise burada da odur, çünkü uç panelin kullandığı işleyiciyi yeniden kullanır.
Yedi ucun tamamı admin kitlesine aittir ve anahtarın ilgili kapsamı taşımasını bekler. Kapsam adları aşağıda her ucun kimlik satırında yazılıdır.
Bir modül ya da eklenti geliştiriyorsanız HTTP'ye çıkmanız gerekmez: Api::Clients()->GetClients() aynı ucu süreç içinde çalıştırır ve aynı zarfı döndürür. Her örnekte ilk sekme bu çağrıyı gösterir.
Referans
Müşterileri Listeleme
Müşterileri filtreleyerek ve sayfalayarak listeler. Sayfa boyutu 100 ile sınırlıdır; daha büyük bir değer sessizce düşürülür.
active veya blocked. Tam liste: reference/statuses?entity=client.clients/groups.active veya blocked.TR.TRY.0.curl -G 'https://panel.ornek.com/api/v1/admin/clients' \
-H "Authorization: Bearer $API_KEY" \
-H 'Accept: application/json' \
-d status=active \
-d limit=25const url = new URL('https://panel.ornek.com/api/v1/admin/clients');
url.searchParams.set('status', 'active');
url.searchParams.set('limit', '25');
const res = await fetch(url, { headers: { Authorization: `Bearer ${apiKey}` } });
const body = await res.json();
for (const c of body.data) console.log(c.id, c.full_name);$url = 'https://panel.ornek.com/api/v1/admin/clients?' . http_build_query([
'status' => 'active',
'limit' => 25,
]);
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $apiKey,
'Accept: application/json',
],
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);
foreach ($body['data'] as $client) {
echo $client['id'], ' ', $client['full_name'], PHP_EOL;
}// WISECP içinden: HTTP yok, aynı zarf döner.
$response = Api::Clients()->GetClients([], [
'status' => 'active',
'limit' => 25,
]);
if (isset($response['error'])) {
Logger::error($response['error']['message']);
return;
}
foreach ($response['data'] as $client) {
echo $client['id'], ' ', $client['full_name'], PHP_EOL;
}{
"data": [
{
"id": 42,
"full_name": "Ayse Yilmaz",
"company_name": "",
"email": "[email protected]",
"phone": "5550100",
"status": "active",
"group": { "id": 1, "name": "Standart" },
"email_verified": true,
"phone_verified": false,
"active_services": 3,
"created_at": "2026-01-01 10:00:00",
"last_login_at": "2026-06-20 09:00:00"
}
],
"meta": { "total": 128, "page": 1, "limit": 25, "next_page": 2 }
}{
"error": {
"code": "insufficient_scope",
"message": "API key lacks the required scope."
}
}Müşteri Detayı
Tek bir müşterinin tam profilini döndürür. Listede olmayan alanlar burada gelir: ad ve soyad ayrı ayrı, bakiye, ülke ve para birimi kimlikleri.
full_name gelir.active, blocked veya cancelled. Listede cancelled geçmez.reference/countries.group nesnesinin yerine burada yalnız kimlik gelir.curl 'https://panel.ornek.com/api/v1/admin/clients/42' \
-H "Authorization: Bearer $API_KEY" \
-H 'Accept: application/json'const res = await fetch('https://panel.ornek.com/api/v1/admin/clients/42', {
headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();$ch = curl_init('https://panel.ornek.com/api/v1/admin/clients/42');
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()->GetClient(['id' => 42]);
if (isset($response['error'])) {
// not_found ya da insufficient_scope
return false;
}
$client = $response['data'];
echo $client['name'], ' ', $client['surname'], PHP_EOL;Müşteri Oluşturma
Yeni müşteri oluşturur ve oluşturulan kaydı detay şemasıyla döndürür. İş kuralları panelin kullandığı işleyicide çalışır, bu yüzden şifre uzunluğu gibi ayarlar burada da geçerlidir.
options/password-length karakter; varsayılan 6.individual veya corporate. Varsayılan individual.general/local.clients/groups.TR. Karşılığı: reference/countries.USD.201 ile döner. Detay ucuyla aynı şekil.curl -X POST 'https://panel.ornek.com/api/v1/admin/clients' \
-H "Authorization: Bearer $API_KEY" \
-H 'Content-Type: application/json' \
-d '{"full_name":"Ayse Yilmaz","email":"[email protected]","password":"Str0ngP@ssw0rd"}'const res = await fetch('https://panel.ornek.com/api/v1/admin/clients', {
method: 'POST',
headers: {
Authorization: `Bearer ${apiKey}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
full_name: 'Ayse Yilmaz',
email: '[email protected]',
password: 'Str0ngP@ssw0rd',
}),
});
const body = await res.json();$ch = curl_init('https://panel.ornek.com/api/v1/admin/clients');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $apiKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'full_name' => 'Ayse Yilmaz',
'email' => '[email protected]',
'password' => 'Str0ngP@ssw0rd',
]),
]);
$created = json_decode(curl_exec($ch), true);
curl_close($ch);$response = Api::Clients()->CreateClient([
'full_name' => 'Ayse Yilmaz',
'email' => '[email protected]',
'password' => 'Str0ngP@ssw0rd',
'type' => 'individual',
'country_code' => 'TR',
'currency_code' => 'TRY',
]);
if (isset($response['error'])) {
// email_exists en sık karşılaşılan durumdur.
throw new Exception($response['error']['message']);
}
$clientId = $response['data']['id'];{
"data": {
"id": 43,
"full_name": "Ayse Yilmaz",
"name": "Ayse",
"surname": "Yilmaz",
"email": "[email protected]",
"status": "active",
"country_id": 792,
"currency_id": 1,
"group_id": 0,
"balance": 0.00
}
}{
"error": {
"code": "email_exists",
"message": "A client with this email already exists."
}
}Müşteri Güncelleme
Yalnızca gönderdiğiniz alanı değiştirir; göndermediğiniz alana dokunmaz. Tüm gövde alanları opsiyoneldir.
active, blocked veya cancelled.individual veya corporate.USD.true işareti açar, false kaldırır, alanı hiç göndermemek değiştirmez.curl -X PATCH 'https://panel.ornek.com/api/v1/admin/clients/42' \
-H "Authorization: Bearer $API_KEY" \
-H 'Content-Type: application/json' \
-d '{"status":"blocked","never_suspend":false}'const res = await fetch('https://panel.ornek.com/api/v1/admin/clients/42', {
method: 'PATCH',
headers: {
Authorization: `Bearer ${apiKey}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ status: 'blocked', never_suspend: false }),
});
const body = await res.json();$ch = curl_init('https://panel.ornek.com/api/v1/admin/clients/42');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'PATCH',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $apiKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'status' => 'blocked',
'never_suspend' => false,
]),
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);// Yalnız iki alan gönderiliyor; kalan profil olduğu gibi kalır.
$response = Api::Clients()->UpdateClient([
'id' => 42,
'status' => 'blocked',
'never_suspend' => false,
]);Müşteri Silme
Müşteriyi siler ve silinen kimliği geri döndürür.
curl -X DELETE 'https://panel.ornek.com/api/v1/admin/clients/42' \
-H "Authorization: Bearer $API_KEY"const res = await fetch('https://panel.ornek.com/api/v1/admin/clients/42', {
method: 'DELETE',
headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();$ch = curl_init('https://panel.ornek.com/api/v1/admin/clients/42');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'DELETE',
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $apiKey],
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);$response = Api::Clients()->DeleteClient(['id' => 42]);
if (($response['data']['deleted'] ?? false) === true) {
// Kayıt gitti; ona bağlı kendi verinizi de temizleyin.
}Müşteri Kimlik Bilgilerini Doğrulama
Tek bir soruyu yanıtlar: bu e-posta ve parola canlı bir müşteri hesabına mı ait? Hiçbir şey oluşturmaz, değiştirmez. Kimlik bilgilerini kendi arayüzünüz topluyorsa ve arkasındaki müşteri kimliğine ihtiyacınız varsa kullanılır.
Kurulumun kendi şifrelemesiyle sarılmış bir bcrypt özetidir. Dönseydi yönetici anahtarına sahip herkes tahminlerini çevrimdışı doğrulayabilirdi. Yanıt yalnızca müşteri kimliğini taşır.
true. Eşleşmeyen kimlik bilgisi valid: false olarak değil, hata olarak döner.email ya da password eksik.curl -X POST 'https://panel.ornek.com/api/v1/admin/clients/validate' \
-H "Authorization: Bearer $API_KEY" \
-H 'Content-Type: application/json' \
-d '{"email":"[email protected]","password":"correct horse battery staple"}'const res = await fetch('https://panel.ornek.com/api/v1/admin/clients/validate', {
method: 'POST',
headers: {
Authorization: `Bearer ${apiKey}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ email: '[email protected]', password }),
});
if (res.ok) {
const body = await res.json();
console.log(body.data.user_id); // kimlik bilgilerinin arkasındaki müşteri
}$ch = curl_init('https://panel.ornek.com/api/v1/admin/clients/validate');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $apiKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'email' => '[email protected]',
'password' => $password,
]),
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);$response = Api::Clients()->ValidateClient([
'email' => '[email protected]',
'password' => $password,
]);
// Yanlış ikili hata olarak döndüğü için bu satıra ulaşmak zaten eşleştiler demektir.
$clientId = $response['data']['user_id'] ?? 0;Müşteri Adına Oturum Açma
Bir müşteri için tek kullanımlık giriş bileti üretir ve bileti harcayan adresi döndürür. Müşteriyi o adrese gönderirsiniz, giriş yapmış olarak varır. Entegrasyonunuz parolayı hiç görmez.
Ziyaretçinin kim olduğunu zaten bilen sistemler içindir: kendi portalınız, bir kontrol paneli, bir destek aracı. login_as_client PHP oturumunu yerinde değiştirdiğinden API'ye açılmaz; bu uç onun bilet tabanlı karşılığıdır.
Tek kullanımlık — adres açıldığı anda harcanır. Tekrar kullanılan bağlantı açıklamalı bir mesajla giriş formuna düşer. 60 saniye geçerli, üretilip hemen izlenmek üzere tasarlandı. Müşteri başına bir tane: yeni bilet önceki bileti sessizce geçersiz kılar. Bu kuruluma sınırlı, başka bir yeri gösteren destination yok sayılır ve müşteri panosuna düşer. Giriş kapısı da yine işler. Hesap durumu, ülke engeli ve modül vetoları bilet harcanırken parola girişindeki gibi değerlendirilir. Bilet kim olduğunu kanıtlar, şu anda giriş yapabilir mi sorusunu değil.
user_id eski adı olarak hâlâ kabul edilir.services gibi bir route anahtarı. Verilmezse panosu.destination bir route anahtarıysa route parametreleri.{client_id}-{gizli} biçiminde.client_id eksik.curl -X POST 'https://panel.ornek.com/api/v1/admin/clients/sso' \
-H "Authorization: Bearer $API_KEY" \
-H 'Content-Type: application/json' \
-d '{"client_id":42,"destination":"services","destination_values":[128]}'const res = await fetch('https://panel.ornek.com/api/v1/admin/clients/sso', {
method: 'POST',
headers: {
Authorization: `Bearer ${apiKey}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ client_id: 42, destination: 'services', destination_values: [128] }),
});
const body = await res.json();
window.location = body.data.url; // hemen harcayın; ömrü 60 saniye$ch = curl_init('https://panel.ornek.com/api/v1/admin/clients/sso');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $apiKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'client_id' => 42,
'destination' => 'services',
'destination_values' => [128],
]),
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);$response = Api::Clients()->CreateClientSsoToken(['client_id' => 42]);
$link = $response['data']['url'];Tuzaklar
Listede grup bir nesnedir (group), detayda yalnız kimliktir (group_id). Ad soyad da listede tek alandır, detayda ikiye ayrılır. Listeden okuyup detay bekleyen bir eşleyici sessizce boş alan üretir.
Telefon ve doğum tarihi alanlarında boş bir değer göndermek alanı siler. Bir alanı korumak istiyorsanız onu gövdeye hiç koymayın; kısmi güncelleme tam da bunun içindir.
Biçim işaretleri atılır ve yalnız rakamlar kalır. +90 555 010 00 00 gönderirseniz geri okuduğunuzda 905550100000 alırsınız; karşılaştırma yapan kod bunu hesaba katmalıdır.
İlgili Makaleler
Geri bildiriminiz için teşekkürler!
Yukarıda bulamadığınız her şey için destek ekibimiz her zaman yanınızda.