Destek Talepleri

1.7k görüntülenme Markdown

Destek talebi açan, yanıtlayan, kapatan ve puanlayan on bir uç.

Genel Bakış

Destek talebi bir konuşmadır: müşteri açar, personel yanıtlar, konuşma kapanır. On bir uç bu konuşmanın her adımını kapsar.

Talep açmadan önce iki sözlüğü okumak gerekir: hangi departmanların hangi alanları sorduğu ve hangi erişim gruplarının şifreli bilgi kabul ettiği.

Şifre gibi bilgiler mesaj gövdesine yazılmaz. Erişim grupları için ayrı bir alan vardır ve oradaki parola tipli değerler şifreli saklanır.

Referans

Departmanları Listeleme

get/api/v1/client/tickets/departments
Tickets/GetTicketDepartments açılış şeması

Talep açılabilecek departmanları kendi alan şemalarıyla döndürür.

Dönen alanlar data[] — 4
idintDepartmanın numarası.
namestringDepartman adı.
descriptionstringNe için olduğu.
custom_fieldsobject[]Açılışta sorulacak alanlar.
idintAlanın numarası. Gövdedeki haritanın anahtarı budur.
namestringAlanın etiketi.
typestringGiriş türü.
requiredboolBoş bırakılabilir mi.
optionsobject[]Seçimli alanlarda seçenekler. Değer ve etiket taşır; gönderilen değerdir.
Hatalar 2
ticket_system_disabled422Operatör destek sistemini kapatmış.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl 'https://panel.ornek.com/api/v1/client/tickets/departments' \
  -H "Authorization: Bearer $CLIENT_KEY"
const res = await fetch('https://panel.ornek.com/api/v1/client/tickets/departments', {
  headers: { Authorization: `Bearer ${clientKey}` },
});

const { data } = await res.json();
renderDepartmentForm(data[0].custom_fields);
$ch = curl_init('https://panel.ornek.com/api/v1/client/tickets/departments');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $clientKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Alan semasi DEPARTMAN BASINA degisir: formu secilen departmanin semasindan kurun.
$deps = Kernel::internal('client:Tickets/GetTicketDepartments', ['owner_id' => $uid])['data'];
$schema = array_column($deps, 'custom_fields', 'id')[$did] ?? [];

Erişim Gruplarını Listeleme

get/api/v1/client/tickets/access-groups
Tickets/GetTicketAccessGroups şifreli alanlar

Mesaja eklenebilecek erişim bilgisi gruplarını şemalarıyla döndürür.

Dönen alanlar data[] — 3
idintGrubun numarası. Erişim satırındaki grup alanına bu değer verilir.
namestringGrubun adı.
custom_fieldsobject[]Grubun erişim alanları.
idintAlanın numarası. Gövdedeki haritanın anahtarı budur.
namestringAlanın etiketi.
typestringGiriş türü.
requiredboolBoş bırakılabilir mi.
optionsobject[]Seçimli alanlarda seçenekler. Değer ve etiket taşır; gönderilen değerdir.
Hatalar 2
ticket_system_disabled422Operatör destek sistemini kapatmış.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl 'https://panel.ornek.com/api/v1/client/tickets/access-groups' \
  -H "Authorization: Bearer $CLIENT_KEY"
const res = await fetch('https://panel.ornek.com/api/v1/client/tickets/access-groups', {
  headers: { Authorization: `Bearer ${clientKey}` },
});

const { data } = await res.json();
const server = data.find((g) => g.name.includes('Server'));
$ch = curl_init('https://panel.ornek.com/api/v1/client/tickets/access-groups');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $clientKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Parola tipli alanlar SIFRELI saklanir; duz metin mesaj govdesine yazmak yerine bunu kullanin.
$groups = Kernel::internal('client:Tickets/GetTicketAccessGroups', ['owner_id' => $uid])['data'];
$creds = [['group_id' => $groups[0]['id'], 'fields' => $values]];

Talepleri Listeleme

get/api/v1/client/tickets
Tickets/GetTickets durum sırası

Hesabın destek taleplerini durum sırasıyla döndürür.

Sorgu 5
pageintKaçıncı sayfa.
limitintSayfa başına satır. En çok 100.
statusstringDurum süzgeci. Müşteriye gösterilen durum sözlüğünü kabul eder.
departmentintDepartman süzgeci.
searchstringKonu, referans ve departman adında arar.
Dönen alanlar data[] — 11 + meta — 4
ticket_idintTalebin numarası.
refstringMüşterinin andığı referans.
subjectstringKonu.
statusstringHam durum.
statestringMüşteriye gösterilen durum.
priorityintÖncelik. Birden dörde: düşük, orta, yüksek, acil.
departmentobjectDepartman. Numara ve ad taşır.
ratingintTalebe verilen puan.
created_atstringAçıldığı an.
unreadboolOkunmamış bir personel yanıtı var mı.
last_replyobjectSon görünür mesaj. Anı ve kimin yazdığını taşır.
totalintToplam talep. Meta altında döner.
pageintBulunulan sayfa.
limitintSayfa boyutu.
next_pageintSonraki sayfa.
Hatalar 3
ticket_system_disabled422Operatör destek sistemini kapatmış.
status_invalid422Durum bilinen bir değer değil.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl 'https://panel.ornek.com/api/v1/client/tickets?status=answered' \
  -H "Authorization: Bearer $CLIENT_KEY"
const res = await fetch('https://panel.ornek.com/api/v1/client/tickets?status=answered', {
  headers: { Authorization: `Bearer ${clientKey}` },
});

const { data } = await res.json();
const waiting = data.filter((t) => t.unread);
$ch = curl_init('https://panel.ornek.com/api/v1/client/tickets?status=answered');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $clientKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Okunmamis isareti YALNIZ listede gorunur: detayi okumak onu temizler, once listeden sayin.
$rows = Kernel::internal('client:Tickets/GetTickets', ['owner_id' => $uid])['data'];
$badge = count(array_filter($rows, fn ($t) => $t['unread']));

Talep Açma

post/api/v1/client/tickets
Tickets/CreateTicket ek kabul eder

Yeni bir destek talebi açar.

Gövde 9
department_idintreqDepartmanın numarası.
subjectstringreqKonu.
messagestringreqAçılış mesajı. En az beş karakter; düz metindir ve işaretleme ayıklanır.
priorityintÖncelik. Verilmezse orta alınır.
service_idintTalebi bir hizmete bağlar.
custom_fieldsobjectDepartman alanlarının yanıtları. Alan numarasını değere eşler; kutu tipli alanlar dizi alır.
credentialsobject[]Erişim bilgileri. Her satır bir grup numarası ve alan haritası taşır; mesaja şifreli işlenir.
attachmentsarrayEkler. Kodlanmış içerik olarak gönderilir; adres reddedilir.
encrypt_messageboolMesaj gövdesi şifreli saklansın mı.
Dönen alanlar 201 — data — 13
dataobjectAçılan talebin tam detayı. Okuma ucuyla aynı şekildedir.
Hatalar 10
not_found404Bağlanmak istenen hizmet bu hesabın değil.
ticket_system_disabled422Operatör destek sistemini kapatmış.
subject_required422Konu boş.
department_invalid422Departman bilinmiyor ya da kapalı.
message_too_short422Mesaj beş karakterden kısa.
custom_field_required422Zorunlu bir departman alanı boş. Hangi alan olduğu yanıtın ayrıntısında gelir.
access_group_invalid422Erişim satırı bilinmeyen bir grup taşıyor.
credential_field_required422Zorunlu bir erişim alanı boş.
attachment_invalid422Ek adres olarak gönderilmiş ya da doğrulamayı geçemedi.
ticket_rejected422Bir kanca talebi reddetti.
İstek
curl -X POST 'https://panel.ornek.com/api/v1/client/tickets' \
  -H "Authorization: Bearer $CLIENT_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"department_id":4,"subject":"Cannot reach my server","message":"SSH times out since this morning.","priority":3}'
const res = await fetch('https://panel.ornek.com/api/v1/client/tickets', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${clientKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    department_id: 4,
    subject,
    message,
    credentials: [{ group_id: 1, fields: { 30: ip, 32: password } }],
  }),
});

const { data } = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/client/tickets');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $clientKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode($ticket),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Ekler talep KAYDEDILMEDEN once dogrulanir: bozuk dosya yarim bir talep birakmaz.
Kernel::internal('client:Tickets/CreateTicket', ['owner_id' => $uid] + $ticket);

Talebi ve Mesajları Okuma

get/api/v1/client/tickets/{id}
Tickets/GetTicket okundu işaretler

Talebin üst bilgilerini ve bütün mesaj dizisini döndürür.

Dönen alanlar data — 13
ticket_idintTalebin numarası.
refstringMüşterinin andığı referans.
subjectstringKonu.
statusstringHam durum.
statestringMüşteriye gösterilen durum.
priorityintÖncelik. Birden dörde: düşük, orta, yüksek, acil.
departmentobjectDepartman. Numara ve ad taşır.
ratingintTalebe verilen puan.
created_atstringAçıldığı an.
lockedboolPersonel talebi kilitlemiş mi. Kilitliyken yanıt ve yeniden açma çalışmaz.
can_replyboolYanıt yazılabilir mi.
related_serviceobjectBağlı hizmet. Numara, ad, tür ve durum taşır.
last_reply_atstringSon mesajın anı.
messagesobject[]Görünür mesajlar, eskiden yeniye. Personelin iç notları hiç görünmez.
message_idintMesajın numarası. Personel yanıtını puanlarken bu numara verilir.
authorobjectYazan. Tür ve ad taşır.
is_htmlboolGövde işaretleme taşıyor mu. Personel mesajlarında doğru olabilir.
bodystringMesajın kendisi.
created_atstringYazıldığı an.
ratingintBu yanıta verilen puan. Yalnız personel mesajlarında dolar.
attachmentsobject[]Ekler. Numara, ad ve boyut taşır; içerik indirme ucundan alınır.
credentialsobject[]Çözülmüş erişim bilgileri. Grup ve alanları taşır; parola tipli değerler gizli işaretlenir.
Hatalar 3
not_found404Böyle bir talep yok ya da başka bir müşteriye ait.
ticket_system_disabled422Operatör destek sistemini kapatmış.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl 'https://panel.ornek.com/api/v1/client/tickets/429' \
  -H "Authorization: Bearer $CLIENT_KEY"
const res = await fetch(`https://panel.ornek.com/api/v1/client/tickets/${id}`, {
  headers: { Authorization: `Bearer ${clientKey}` },
});

const { data } = await res.json();
renderThread(data.messages, data.can_reply);
$ch = curl_init('https://panel.ornek.com/api/v1/client/tickets/' . $id);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $clientKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Bu okuma OKUNDU isaretler: bildirim sayaci kuran bir is bunu cagirdiginda rozet duser.
$t = Kernel::internal('client:Tickets/GetTicket', ['owner_id' => $uid, 'id' => $id])['data'];
$html = array_filter($t['messages'], fn ($m) => $m['is_html']);

Yanıt Yazma

post/api/v1/client/tickets/{id}/reply
Tickets/ReplyTicket ek kabul eder

Açık bir talebe yanıt ekler.

Gövde 4
messagestringreqYanıt metni. En az beş karakter.
credentialsobject[]Erişim bilgileri.
attachmentsarrayEkler.
encrypt_messageboolGövde şifreli saklansın mı.
Dönen alanlar data — 2
ticketobjectTalebin yeni durumu. Yanıt talebi bekliyor durumuna çeker.
messageobjectKaydedilen yanıt. Mesaj dizisindeki şekliyle gelir.
Hatalar 7
not_found404Böyle bir talep yok ya da başka bir müşteriye ait.
ticket_system_disabled422Operatör destek sistemini kapatmış.
ticket_not_open422Talep kapalı ya da kilitli.
message_too_short422Mesaj beş karakterden kısa.
access_group_invalid422Erişim satırları şemayı geçemedi.
attachment_invalid422Ek reddedildi.
reply_rejected422Bir kanca yanıtı reddetti.
İstek
curl -X POST 'https://panel.ornek.com/api/v1/client/tickets/429/reply' \
  -H "Authorization: Bearer $CLIENT_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"message":"The firewall rule is back, thank you."}'
const res = await fetch(`https://panel.ornek.com/api/v1/client/tickets/${id}/reply`, {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${clientKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ message }),
});

const { data } = await res.json();
appendMessage(data.message);
$ch = curl_init('https://panel.ornek.com/api/v1/client/tickets/' . $id . '/reply');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $clientKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['message' => $text]),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Yanit talebi BEKLIYOR durumuna ceker: kapali bir talebe yanit yazilamaz, once yeniden acin.
$t = Kernel::internal('client:Tickets/GetTicket', ['owner_id' => $uid, 'id' => $id])['data'];
if (! $t['can_reply']) Kernel::internal('client:Tickets/ReopenTicket', ['owner_id' => $uid, 'id' => $id]);

Talebi Kapatma

post/api/v1/client/tickets/{id}/close
Tickets/CloseTicket puan verilebilir

Talebi çözüldü olarak kapatır.

Gövde 1
ratingintKapatırken verilen puan. Yalnız talep henüz puansızken işlenir.
Dönen alanlar data — 3
ticket_idintTalebin numarası.
statusstringYeni ham durum.
statestringYeni gösterilen durum.
Hatalar 3
not_found404Böyle bir talep yok ya da başka bir müşteriye ait.
ticket_system_disabled422Operatör destek sistemini kapatmış.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl -X POST 'https://panel.ornek.com/api/v1/client/tickets/429/close' \
  -H "Authorization: Bearer $CLIENT_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"rating":5}'
const res = await fetch(`https://panel.ornek.com/api/v1/client/tickets/${id}/close`, {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${clientKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ rating: 5 }),
});

const { data } = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/client/tickets/' . $id . '/close');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $clientKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['rating' => 5]),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Kapatirken puan vermek TEK SANSTIR: talep zaten puanliysa gonderilen puan sessizce atlanir.
Kernel::internal('client:Tickets/CloseTicket', ['owner_id' => $uid, 'id' => $id, 'rating' => 5]);

Talebi Yeniden Açma

post/api/v1/client/tickets/{id}/reopen
Tickets/ReopenTicket kilitliyse olmaz

Kapalı bir talebi yeniden açar.

Gövde —
——Gövde gerekmez, boş gönderin. Talebi adresteki numara belirler.
Dönen alanlar data — 3
ticket_idintTalebin numarası.
statusstringYeni ham durum.
statestringYeni gösterilen durum.
Hatalar 4
not_found404Böyle bir talep yok ya da başka bir müşteriye ait.
ticket_system_disabled422Operatör destek sistemini kapatmış.
ticket_locked422Personel talebi kilitlemiş.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl -X POST 'https://panel.ornek.com/api/v1/client/tickets/429/reopen' \
  -H "Authorization: Bearer $CLIENT_KEY"
const res = await fetch(`https://panel.ornek.com/api/v1/client/tickets/${id}/reopen`, {
  method: 'POST',
  headers: { Authorization: `Bearer ${clientKey}` },
});

const { data } = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/client/tickets/' . $id . '/reopen');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $clientKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// KILITLI talep yeniden acilamaz: bu durumda yeni bir talep acmak tek yoldur.
$t = Kernel::internal('client:Tickets/GetTicket', ['owner_id' => $uid, 'id' => $id])['data'];
if ($t['locked']) $openNewTicket();

Talebi Puanlama

post/api/v1/client/tickets/{id}/rating
Tickets/RateTicket bir kez

Talebe bir ile beş arasında puan verir.

Gövde 1
ratingintreqVerilen puan. Birden beşe.
Dönen alanlar data — 2
ticket_idintTalebin numarası.
ratingintİşlenen puan.
Hatalar 5
not_found404Böyle bir talep yok ya da başka bir müşteriye ait.
ticket_system_disabled422Operatör destek sistemini kapatmış.
rating_invalid422Puan bir ile beş arasında değil.
already_rated422Talep zaten puanlanmış. Puan değiştirilemez.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl -X POST 'https://panel.ornek.com/api/v1/client/tickets/429/rating' \
  -H "Authorization: Bearer $CLIENT_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"rating":5}'
const res = await fetch(`https://panel.ornek.com/api/v1/client/tickets/${id}/rating`, {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${clientKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ rating }),
});

if (res.status === 422) hideRatingWidget();
$ch = curl_init('https://panel.ornek.com/api/v1/client/tickets/' . $id . '/rating');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $clientKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['rating' => $n]),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Puan KESINDIR: bir kez verildikten sonra degistirilemez, arayuzde onay isteyin.
$t = Kernel::internal('client:Tickets/GetTicket', ['owner_id' => $uid, 'id' => $id])['data'];
if ($t['rating'] === null) Kernel::internal('client:Tickets/RateTicket',
    ['owner_id' => $uid, 'id' => $id, 'rating' => $n]);

Personel Yanıtını Puanlama

post/api/v1/client/tickets/{id}/replies/{rid}/rating
Tickets/RateTicketReply bir kez

Tek bir personel yanıtına puan verir.

Gövde 1
ratingintreqVerilen puan. Birden beşe.
Dönen alanlar data — 2
message_idintPuanlanan yanıtın numarası.
ratingintİşlenen puan.
Hatalar 5
not_found404Talep bulunamadı ya da verilen numara görünür bir personel yanıtı değil.
ticket_system_disabled422Operatör destek sistemini kapatmış.
rating_invalid422Puan bir ile beş arasında değil.
already_rated422Yanıt zaten puanlanmış.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl -X POST 'https://panel.ornek.com/api/v1/client/tickets/429/replies/878/rating' \
  -H "Authorization: Bearer $CLIENT_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"rating":4}'
const res = await fetch(`https://panel.ornek.com/api/v1/client/tickets/${id}/replies/${rid}/rating`, {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${clientKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ rating }),
});

const { data } = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/client/tickets/' . $id . '/replies/' . $rid . '/rating');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $clientKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['rating' => $n]),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Yalniz PERSONEL yanitlari puanlanir: kendi mesajinizin numarasi bulunamadi doner.
$t = Kernel::internal('client:Tickets/GetTicket', ['owner_id' => $uid, 'id' => $id])['data'];
$staff = array_filter($t['messages'], fn ($m) => $m['author']['kind'] === 'staff');

Eki İndirme

get/api/v1/client/tickets/{id}/attachments/{aid}
Tickets/GetTicketAttachment kodlanmış içerik

Bir mesaj ekini içeriğiyle birlikte döndürür.

Dönen alanlar data — 6
attachment_idintEkin numarası.
message_idintBağlı olduğu mesaj. Eski açılış kayıtlarında boş gelebilir.
namestringÖzgün dosya adı.
sizeintDosya boyutu.
mimestringUzantıdan çıkarılan tür. Bilinmeyen uzantıda genel bir değere düşer.
contentstringDosyanın kendisi. Kodlanmış olarak gelir.
Hatalar 3
not_found404Talep ya da ek bulunamadı, size ait değil, ya da gizli bir nottan geliyor.
ticket_system_disabled422Operatör destek sistemini kapatmış.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl 'https://panel.ornek.com/api/v1/client/tickets/429/attachments/55' \
  -H "Authorization: Bearer $CLIENT_KEY"
const res = await fetch(`https://panel.ornek.com/api/v1/client/tickets/${id}/attachments/${aid}`, {
  headers: { Authorization: `Bearer ${clientKey}` },
});

const { data } = await res.json();
const blob = await (await fetch(`data:${data.mime};base64,${data.content}`)).blob();
$ch = curl_init('https://panel.ornek.com/api/v1/client/tickets/' . $id . '/attachments/' . $aid);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $clientKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Icerik JSON icinde KODLU gelir: buyuk dosyalarda bellek kullanimini hesaba katin.
$a = Kernel::internal('client:Tickets/GetTicketAttachment',
    ['owner_id' => $uid, 'id' => $id, 'aid' => $aid])['data'];

file_put_contents($a['name'], base64_decode($a['content']));

Tuzaklar

Detayı okumak okunmamış işaretini siler

Talep detayını okumak hesabın okunmamış işaretini temizler. Bildirim rozeti kuran bir iş bu ucu çağırdığında rozet müşteri görmeden düşer. Sayımı liste ucundan yapın; detayı yalnız müşteri gerçekten açtığında çağırın.

Kilitli talep yeniden açılamaz

Personel bir talebi kilitlediyse ne yanıt yazılabilir ne de yeniden açılabilir. Bu durum kapalı olmaktan farklıdır: kapalı bir talep yeniden açılır, kilitli olan açılmaz. Detaydaki kilit alanını okuyup arayüzde yeni talep açma yolunu gösterin.

Puan kesindir ve geri alınamaz

Hem talep puanı hem personel yanıtı puanı bir kez verilir; ikinci deneme reddedilir. Kapatırken puan göndermek de aynı hakkı kullanır ve talep zaten puanlıysa o değer sessizce atlanır. Arayüzde onay isteyin.

Sırlar mesaj gövdesine değil erişim alanına yazılır

Parola ve anahtar gibi bilgiler için ayrı bir yapı vardır: erişim grubu satırları. Oradaki parola tipli değerler şifreli saklanır ve yalnız sahibiyle personele çözülür. Aynı bilgiyi mesaj metnine yazmak onu düz metin olarak bırakır.

Ek adres olarak gönderilemez

Ekler kodlanmış içerik olarak gönderilir; bir adres vermek reddedilir. Ekler talep kaydedilmeden önce doğrulanır, yani bozuk bir dosya yarım bir talep bırakmaz. İndirme de aynı biçimdedir: içerik kodlanmış olarak JSON içinde gelir.

İç notlar hiç görünmez

Personelin kendi arasında yazdığı notlar mesaj dizisinde hiç yer almaz ve o notlardaki ekler indirilemez. Yani müşteri arayüzünde eksik görünen bir mesaj numarası hata değil, tasarımdır.

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.