# Müşteri Hesap ve İletişim Kancaları

https://dev.wisecp.com/tr/musteri-hesap-ve-iletisim-kancalari

Müşteri hesabı ve site iletişiminin on dört kancası: API anahtarları, profil, para birimi, iletişim formu ve bülten.

## Genel Bakış

Müşterinin ve ziyaretçinin site üzerinde bıraktığı izler burada: API anahtarları, profil, para birimi tercihi, iletişim formu ve bülten.

Bu kancaların çoğunda veri **doğrulanmamış bir kaynaktan** gelir: iletişim formunu dolduran ziyaretçi, bültene abone olan adres, bulunamayan sayfayı isteyen bot. Dış servise taşımadan önce kendiniz denetleyin.

## Referans

### API anahtarı izinlerinin değişmesini izleme

actionclient.api_key_updated

`AccountApiKeys` yalnız yeni izinler

Bir API anahtarının izinleri değiştikten sonra çalışır. İzin genişlemesi bir güvenlik olayıdır.

Parametreler 3

$owner_idintAnahtarın sahibi.

$idintAnahtar kaydının kimliği.

$permsarrayAnahtarın **yeni** izin kümesi. ? Eski küme geçilmez: "izin genişledi mi" sorusunu cevaplamak istiyorsanız önceki hâli **kendiniz saklamış** olmalısınız.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:client.api_key_updated', 10, function ($owner_id, $id, $perms) {
    // Eski izin kumesi gecilmez: karsilastirma icin kendiniz saklayin.
    Acme::recordScopes($id, $perms);
});
```

### API anahtarının yenilenmesini izleme

actionclient.api_key_regenerated

`AccountApiKeys` kayıt kalır

Bir API anahtarının değeri yenilendikten sonra çalışır. **Kayıt aynı kalır, kimlik değişir**: eski değerle yapılan çağrılar artık geçmez.

Parametreler 2

$owner_idintAnahtarın sahibi.

$idintKaydın kimliği; yenilemeden sonra da aynıdır.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:client.api_key_regenerated', 10, function ($owner_id, $id) {
    // Eski deger artik gecmez: kendi onbelleginizi tazeleyin.
    Acme::invalidateCachedKey($id);
});
```

### API anahtarının silinmesini izleme

actionclient.api_key_deleted

`AccountApiKeys` kayıt yok

Bir API anahtarı silindikten sonra çalışır.

Parametreler 2

$owner_idintAnahtarın sahibi.

$idintSilinen kaydın kimliği; satır artık yoktur.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:client.api_key_deleted', 10, function ($owner_id, $id) {
    Acme::revokeIntegration($id);
});
```

### Müşteri profilinin güncellenmesini izleme

actionclient.profile_updated

`AccountProfile` hesap, giriş değil

Müşteri profili güncellendikten sonra çalışır.

Parametreler 3

$uidintProfili güncellenen **hesabın** kimliği. ? Giriş yapanın kimliği **değildir**: uygun izne sahip bir alt kullanıcı başka bir hesabın profilini güncelleyebilir. Denetim kaydına aktörü yazacaksanız oturumdan ayrıca okuyun.

$data_updatesarrayAna kayıtta yazılan alanlar, **yalnız yeni değerler**: adı, telefonu, dili, para birimi.

$info_updatesarrayEk bilgide yazılanlar: müşteri tipi, şirket bilgileri, adres alanları.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:client.profile_updated', 10, function ($uid, $data_updates, $info_updates) {
    // $uid HESABIN kimligi, giris yapanin degil.
    Acme::syncCrm($uid, $data_updates + $info_updates);
});
```

### Para birimi değişimini izleme

actionclient.currency_changed

`website` misafirde boş

Ziyaretçi site para birimini değiştirdiğinde çalışır. Değişiklik **çoktan uygulanmıştır**.

Parametreler 3

$new_cidintYeni para birimi.

$old_cidintÖnceki para birimi.

$memberarrayGiriş yapmış üyenin oturum verisi. **Misafirde boştur**: bu kanca giriş yapmamış ziyaretçide de çalışır.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:client.currency_changed', 10, function ($new_cid, $old_cid, $member) {
    // Misafirde uye verisi BOS gelir.
    if (!$member) return;

    Acme::rememberCurrency((int) ($member['id'] ?? 0), $new_cid);
});
```

### Bulunamayan sayfayı izleme

actionclient.page_not_found

`website` bot trafiği dâhil

İstenen adres çözülemediğinde çalışır. Kırık bağlantıları bulmanın en doğrudan yoludur.

Parametreler 1

$urlstringİstenen tam adres. ? Bu kanca **tarama botlarının** denediği adreslerde de çalışır ve bir sitede bunlar insan trafiğinden çok olabilir. Her çağrıda kayıt yazan bir dinleyici, kendi tablosunu çöple doldurur.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:client.page_not_found', 10, function ($url) {
    // Bot trafigi insan trafiginden cok olabilir: suzun.
    if (Acme::looksLikeScanner($url)) return;

    Acme::noteBrokenLink($url);
});
```

### İletişim formunun gönderilmesini izleme

actionclient.contact_submitted

`ClientContact` ziyaretçiden gelir

Ziyaretçi iletişim formunu gönderdikten sonra çalışır.

Parametreler 6

$message_idintOluşan mesaj kaydının kimliği.

$full_namestringGönderenin adı.

$emailstringGönderenin adresi.

$phonestringTelefonu; **boş olabilir**.

$messagestringMesaj gövdesi, işaretlemeden arındırılmış.

$ipstringGönderenin adresi. Bu değerlerin hepsi **ziyaretçiden gelir**: kimliği doğrulanmamıştır, dış servise göndermeden önce kendiniz denetleyin.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:client.contact_submitted', 10,
    function ($message_id, $full_name, $email, $phone, $message, $ip) {
        // Degerlerin hepsi ZIYARETCIDEN gelir: dogrulanmamistir.
        Acme::pushToCrm($message_id, $email, $message);
    });
```

### İletişim mesajının yanıtlanmasını izleme

actionclient.contact_message_replied

`ClientContact` yanıt sonrası

Yönetici bir iletişim mesajını yanıtladıktan sonra çalışır.

Parametreler 2

$messagearrayYanıtlanan özgün mesaj.

$admin_messagestringGönderilen yanıt metni.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:client.contact_message_replied', 10, function ($message, $admin_message) {
    Acme::closeCrmCase((int) ($message['id'] ?? 0));
});
```

### Mesajın istenmeyen işaretlenmesini izleme

actionclient.contact_message_spam_reported

`ClientContact` iki ayrı işaret

Bir iletişim mesajı istenmeyen olarak işaretlendikten sonra çalışır. Yanındaki iki işaret **ne kadar sert davranıldığını** söyler.

Parametreler 3

$messagearrayİstenmeyene taşınan mesaj; adres ve telefon içinde.

$block_emailsintAdres ve telefonun engel listesine eklenip eklenmediği.

$report_spamintAğ adresinin engellenip engellenmediği. Bu iki işaret bağımsızdır: biri açık öteki kapalı olabilir. İkisini bir sanan bir dinleyici yanlış rapor üretir.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:client.contact_message_spam_reported', 10,
    function ($message, $block_emails, $report_spam) {
        // Iki isaret bagimsizdir.
        if ($report_spam) Acme::shareBadAddress($message['ip'] ?? '');
    });
```

### Mesajın talebe dönüşmesini durdurma

gateclient.contact_message_to_ticket

`ClientContact` dönüşümden önce

Bir iletişim mesajı destek talebine dönüştürülmeden önce çalışır.

Parametreler 3

$messagearrayDönüştürülecek mesaj.

$departmentintHedef departman.

$staffintAtanacak personel; **sıfır** ise atama yapılmayacaktır.

Dönüş 1

string|null**Boş olmayan bir metin işlemi engeller** ve ziyaretçiye hata olarak gösterilir. Boş dönüş devam ettirir.

Dinleyici PHP

```php
Hook::add('gate:client.contact_message_to_ticket', 10,
    function ($message, $department, $staff) {
        if (Acme::blockedSender($message['email'] ?? '')) return 'Bu gonderici icin talep acilamaz.';

        return null;
    });
```

### İletişim sayfası verisini değiştirme

filterclient.contact_page_data

`ClientContact` eklenen anahtar şablona geçer

İletişim sayfası çizilmeden önce çalışır. Ofisler ve destek saatleri çoktan aktif dile göre çözülmüştür.

Parametreler 2

$page_dataarraybağlaSayfa verisi. Eklediğiniz her anahtar **şablon değişkeni olur**: temanızda doğrudan kullanabilirsiniz.

$langstringbağlaAktif dil.

Dönüş 1

voidDönüş yoksayılır; verinin üzerine yazarsınız.

Dinleyici PHP

```php
Hook::add('filter:client.contact_page_data', 10, function (&$page_data, &$lang) {
    // Eklenen anahtar sablon degiskeni olur.
    $page_data['acme_map'] = Acme::mapEmbed($lang);
});
```

### Bülten kaydını durdurma

gateclient.newsletter_subscribe

`ClientNewsletter` kayıttan önce

Bir adres bülten listesine eklenmeden önce çalışır. Tek kullanımlık adresleri elemenin yeri burasıdır.

Parametreler 2

$emailstringAday adres; küçük harfe çevrilmiş ve biçimi doğrulanmış.

$langstringKayıt anındaki site dili.

Dönüş 1

string|null**Boş olmayan bir metin işlemi engeller** ve ziyaretçiye hata olarak gösterilir. Boş dönüş devam ettirir.

Dinleyici PHP

```php
Hook::add('gate:client.newsletter_subscribe', 10, function ($email, $lang) {
    if (Acme::disposableDomain($email)) return 'Bu adres kabul edilmiyor.';

    return null;
});
```

### Bülten kaydını izleme

actionclient.newsletter_subscribed

`ClientNewsletter` dil de saklanır

Bir adres bülten listesine eklendikten sonra çalışır.

Parametreler 3

$emailstringAbone adresi.

$langstringKayıt anındaki dil. Bu değer saklanır ve **toplu gönderimde içeriğin dilini belirler**: yanlış dil, aboneye anlamadığı bir e-posta gider.

$addedintOluşan kaydın kimliği.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:client.newsletter_subscribed', 10, function ($email, $lang, $added) {
    // Dil toplu gonderimde icerigin dilini belirler.
    Acme::syncMailingList($email, $lang);
});
```

### Bülten çıkışını izleme

actionclient.newsletter_unsubscribed

`ClientNewsletter` bağlantıyla

Bir adres listeden çıkarıldıktan sonra çalışır. Çıkış e-postadaki bağlantıyla yapılır: giriş gerekmez.

Parametreler 1

$emailstringListeden çıkarılan adres.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:client.newsletter_unsubscribed', 10, function ($email) {
    // Kendi listenizden de cikarin: yoksa gonderim surer.
    Acme::dropFromMailingList($email);
});
```

## Tuzaklar

> **Profil kancasındaki kimlik hesabın kimliğidir**
> 
> Güncelleme kancasının verdiği kimlik, profili **değiştirilen hesabındır**; işlemi yapan kişininki değil. Uygun izne sahip bir alt kullanıcı başka bir hesabın profilini güncelleyebilir. Denetim kaydına "kim yaptı" yazacaksanız oturumdan ayrıca okuyun.

> **Bulunamayan sayfa kancası bot trafiğiyle dolar**
> 
> Tarama botları var olmayan adresleri sürekli dener; bir sitede bu istekler insan trafiğini kolayca aşar. Her çağrıda kayıt yazan bir dinleyici kendi tablosunu şişirir ve gerçek kırık bağlantıları görünmez kılar. Süzgeç koyun.

## İlgili Makaleler

- [Müşteri Sitesi Kancaları](https://dev.wisecp.com/tr/musteri-sitesi-kancalari)
- [Hesap ve İletişim Kancaları](https://dev.wisecp.com/tr/hesap-ve-iletisim-kancalari)
- [Kancalar Nasıl Çalışır](https://dev.wisecp.com/tr/kancalar-nasil-calisir)
