# Satış Ortağı Ödeme Talepleri

https://dev.wisecp.com/tr/satis-ortagi-odeme-talepleri

Ortakların açtığı ödeme taleplerini gören ve sonuçlandıran üç uç.

## Genel Bakış

Satış ortağı kazandığı komisyonu doğrudan alamaz; bir **ödeme talebi** açar ve ekip bunu onaylar. Bu makale o talepleri gören ve sonuçlandıran üç ucu anlatır.

Talep beş durumdan birindedir: bekliyor, işlemde, tamamlandı, reddedildi, iptal edildi. Yalnız **tamamlandı** durumu paranın gerçekten çıktığı andır ve ortağın bakiyesinden düşer.

Bakiye hareketi bu yüzden kritiktir: onay parayı düşürür, silme geri verir, ret ise **bakiyeye dokunmaz**. Üçünü aynı sanmak ortağa yanlış borç gösterir.

## Referans

### Ödeme Taleplerini Listeleme

get/api/v1/admin/affiliates/withdrawals

`Affiliates/GetWithdrawals` admin

Satış ortaklarının açtığı ödeme taleplerini döndürür.

Sorgu 4

pageintKaçıncı sayfa.

limitintSayfa başına kayıt. En çok 100.

searchstringAd, şirket, e-posta, ödeme yöntemi ve talep numarasında arar.

statusstringDurum süzgeci: `awaiting`, `process`, `completed`, `rejected` ya da `cancelled`.

Dönen alanlar data[] — 15 + meta — 4

idintTalebin numarası.

affiliate_idintTalebi açan satış ortağının kayıt numarası.

owner_idintOrtağın arkasındaki müşteri numarası.

user_idintAynı müşteri numarası. Sorgu birleştirmesinden gelen ikinci ad.

full_namestringMüşterinin adı soyadı.

company_namestringŞirket adı.

emailstringE-posta adresi.

amountstringİstenen tutar. Dört ondalıklı metin.

currencyintTutarın para birimi numarası.

gatewaystringOrtağın seçtiği ödeme yöntemi.

gateway_infostringYönteme ait bilgi. Hesap numarası ya da e-posta gibi.

statusstringTalebin durumu.

status_msgstringDuruma yazılmış açıklama.

ctimestringTalebin açıldığı an.

updated_atstringSon değişiklik anı.

totalintToplam talep. Meta altında döner.

pageintBulunulan sayfa.

limitintSayfa boyutu.

next_pageintSonraki sayfa. Son sayfada sıfır.

Hatalar 1

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl 'https://panel.ornek.com/api/v1/admin/affiliates/withdrawals?status=awaiting' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/affiliates/withdrawals?status=awaiting', {
  headers: { Authorization: `Bearer ${apiKey}` },
});

const { data, meta } = await res.json();
const owed = data.reduce((s, w) => s + Number(w.amount), 0);
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/affiliates/withdrawals?status=awaiting');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// Tutarlar HER TALEBIN kendi para biriminde; toplamadan once cevirmeniz gerekir.
$rows = Api::Affiliates()->GetWithdrawals([], ['status' => 'awaiting'])['data'];
$byCurrency = [];
foreach ($rows as $w) $byCurrency[$w['currency']] = ($byCurrency[$w['currency']] ?? 0) + (float) $w['amount'];
```

### Talepleri Toplu İşleme

post/api/v1/admin/affiliates/withdrawals/bulk

`Affiliates/BulkWithdrawals` admin bakiyeye dokunur

Birden çok ödeme talebini onaylar, reddeder ya da siler.

Gövde 2

actionstringreqYapılacak iş: `approve`, `reject` ya da `delete`.

idsint[]reqİşlenecek talep numaraları. Bulunamayan numara sessizce atlanır.

Dönen alanlar data — 2

actionstringUygulanan iş.

processedint[]Gönderdiğiniz numaralar. Gerçekten değişenler değil.

Hatalar 3

action_invalid422İş adı üç değerden biri değil.

ids_required422Talep numarası verilmedi.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl -X POST 'https://panel.ornek.com/api/v1/admin/affiliates/withdrawals/bulk' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"action":"approve","ids":[3,5]}'
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/affiliates/withdrawals/bulk', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ action: 'approve', ids: [3, 5] }),
});

const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/affiliates/withdrawals/bulk');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['action' => 'approve', 'ids' => [3, 5]]),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// ONAY bakiyeden duser, RET bakiyeyi GERI VERMEZ; parayi iade eden tek is silmedir.
Api::Affiliates()->BulkWithdrawals(['action' => 'approve', 'ids' => [3, 5]]);
// yanlis onayladiysaniz: reject degil delete
Api::Affiliates()->BulkWithdrawals(['action' => 'delete', 'ids' => [3]]);
```

### Tek Talebi Silme

delete/api/v1/admin/affiliates/withdrawals/{wid}

`Affiliates/DeleteWithdrawal` admin

Tek bir ödeme talebini siler ve gerekiyorsa tutarı geri verir.

Dönen alanlar data — 2

deletedboolSilme çalıştı mı.

idintSilinen talebin numarası.

Hatalar 2

not_found404Talep bulunamadı.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl -X DELETE 'https://panel.ornek.com/api/v1/admin/affiliates/withdrawals/3' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res = await fetch(`https://panel.ornek.com/api/v1/admin/affiliates/withdrawals/${wid}`, {
  method: 'DELETE',
  headers: { Authorization: `Bearer ${apiKey}` },
});

const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/affiliates/withdrawals/' . $wid);
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);
```

```php
// Toplu silmeden tek farki: bulunamayan numara burada 404 verir, toplu iste sessizce atlanir.
Api::Affiliates()->DeleteWithdrawal(['wid' => $wid]);
```

## Tuzaklar

> **Ret bakiyeyi geri vermez**
> 
> Onay tutarı ortağın bakiyesinden düşer. Ret ise **yalnız durumu yazar** ve düşülen tutarı geri koymaz; bu yüzden onaylanmış bir talebi reddetmek parayı ortağın bakiyesinden kalıcı olarak eksiltir. Yanlış onaydan dönmenin yolu ret değil **silmedir**.

> **Onay, ret, tekrar onay iki kez düşer**
> 
> Onay yalnız talep **tamamlanmış değilken** bakiyeden düşer. Onayladığınız bir talebi reddedip yeniden onaylarsanız durum tamamlanmış olmaktan çıktığı için ikinci kez düşer ve ortak aynı ödeme için iki kez eksilir. Böyle bir turdan sonra bakiyeyi elle doğrulayın.

> **Dönen liste ne işlendiğini söylemez**
> 
> `processed` alanı **gönderdiğiniz numaraların** aynısıdır. Bulunamayan bir talep sessizce atlanır, ama numarası yine bu listede görünür. Toplu bir işin gerçekten oturduğunu görmek için listeleme ucundan durumları geri okuyun.

> **Bakiye sıfırın altına inmez**
> 
> Bakiyeden düşen her iş sonucu sıfırda tutar. Bakiyeden büyük bir talebi onaylarsanız bakiye sıfır olur ve **aradaki fark kaybolur**; hata dönmez. Onaydan önce talep tutarını ortağın bakiyesiyle karşılaştırın.

> **İki silme yolu, tek fark**
> 
> Tek talep silme ile toplu silme aynı işi yapar ve tamamlanmış talepte tutarı ikisi de geri verir. Tek fark bulunamayan numaradadır: tek silme `404` döndürür, toplu silme sessizce atlar. Var olduğundan emin olmadığınız numarada tek uç daha güvenlidir.

## İlgili Makaleler

- [Satış Ortakları](https://dev.wisecp.com/tr/satis-ortaklari)
- [Satış Ortaklığı Atamaları](https://dev.wisecp.com/tr/satis-ortakligi-atamalari)
- [Satış Ortaklığı Ayarları](https://dev.wisecp.com/tr/satis-ortakligi-ayarlari)
