Sistem akışı — yatırım ve çekim nasıl çalışır
WinPay bir ödeme yöntemidir: sizin adınıza tahsilat ve ödeme yapar, sonucu size bildirir. Üyenin bakiyesini siz tutarsınız; WinPay bakiye bilmez, sadece "şu kadar para geldi/gitti" der.
İki akış var. İkisinde de üç şey olur: siz istek atarsınız → para hareket eder → size callback gelir.
Yatırım (para yatırma)
Ne olur
1. Üye sitenizde "Para yatır" der, tutarı yazar
2. Siteniz WinPay'e POST /api/v1/deposits/init atar
3. WinPay bir ödeme linki (payment_url) döner
4. Siteniz üyeyi o linke yönlendirir
5. Üye sayfada tutarı onaylar; IBAN, alıcı adı ve karekod görür
6. Üye bankasından transferi yapar, "Ödemeyi gönderdim" der
7. Ödeme doğrulanır
8. WinPay sitenize callback gönderir (imzalı)
9. Siteniz üyenin bakiyesini callback'teki tutar kadar artırır
10. Üye parayı hesabında görür
Sizin tarafınızda, adım adım
ADIM 1: Üye formu gönderir
│ ├─ Kendi veritabanınıza bir kayıt açın: request_id (benzersiz), üye, tutar
│ └─ Durum: "bekliyor"
│
ADIM 2: WinPay'e istek
│ └─ POST /api/v1/deposits/init (gövde: request_id, member_id, amount)
│ Başlıklar: X-API-Key, X-WinPay-Timestamp, X-WinPay-Signature
│ Cevap: transaction_id, payment_url, expires_at (20 dk)
│
ADIM 3: Üyeyi yönlendir
│ └─ Tarayıcıyı payment_url adresine gönderin (iframe değil)
│
ADIM 4: Bekle
│ └─ Bakiyeye DOKUNMAYIN. 201 cevabı "talep alındı" demek, "para geldi" değil.
│
ADIM 5: Callback gelir
│ ├─ İmzayı doğrulayın (callback_secret ile, ham gövde üzerinden)
│ ├─ event_id daha önce işlendi mi? İşlendiyse 200 dönüp çıkın
│ ├─ request_id sizin kaydınız mı? Değilse 400
│ └─ status = approved ise: bakiye += approved_amount (amount DEĞİL)
│ status = rejected / expired ise: bakiye değişmez
│
ADIM 6: 200 dönün (bakiyeyi yazdıktan SONRA)
Zaman çizelgesi
| An | Ne oluyor |
|---|---|
| 0 sn | Üye "para yatır" dedi, siteniz isteği attı, link geldi |
| 1 sn | Üye ödeme sayfasında |
| 1–2 dk | Üye bankasından transferi yaptı, "gönderdim" dedi |
| Doğrulama sonrası | Callback sitenize ulaştı, bakiye yazıldı |
| 20 dk | Bu süre içinde onaylanmayan talep expired olur |
Çekim (para çekme)
Ne olur
1. Üye "Para çek" der, tutar ve IBAN girer
2. Siteniz bakiyeyi kontrol eder, tutarı bloke eder
3. Siteniz WinPay'e POST /api/v1/withdrawals/init atar
4. WinPay talebi alır (201) — henüz para gitmedi
5. Transfer üyenin IBAN'ına yapılır
6. WinPay sitenize callback gönderir
7. status = completed → çekimi kapatın; status = rejected → bloke ettiğiniz tutarı iade edin
Sizin tarafınızda, adım adım
ADIM 1: Üye formu gönderir
│ ├─ Bakiye yeterli mi? Değilse hata verin, hiç istek atmayın
│ ├─ Tutarı bloke edin (bakiyeden düşün, "bekliyor" durumunda tutun)
│ └─ request_id üretin (benzersiz, örn. wd-20260913-000123)
│
ADIM 2: WinPay'e istek
│ └─ POST /api/v1/withdrawals/init (request_id, member_id, amount, iban, account_name)
│ Cevap: transaction_id, status = pending_assignment
│
ADIM 3: Bekle — ikinci bir istek ATMAYIN
│
ADIM 4: Callback gelir
│ ├─ İmza + event_id + request_id kontrolleri (yatırımla aynı)
│ ├─ completed → çekim tamam, bloke kalıcı
│ └─ rejected → bloke ettiğiniz tutarı üyeye geri verin
│
ADIM 5: 200 dönün
Kim kime konuşuyor
Sizin sunucunuz WinPay Üyenin bankası
│ │ │
├─ POST /deposits/init ──► │ │
│ ◄── payment_url ──────── │ │
│ │ │
└─ üyeyi linke gönder ───► │ ödeme sayfası │
│ ◄──── üye transferi yapar ───┤
│ │
│ ödeme doğrulanır │
◄── callback (imzalı) ──── │ │
│ │ │
├─ bakiyeyi güncelle │ │
└─ 200 OK ───────────────► │ │
Bilmeniz gereken kavramlar
request_id — her talep için sizin ürettiğiniz benzersiz kimlik. Aynı request_id ile aynı
isteği tekrar atarsanız yeni işlem açılmaz, mevcut işlem döner (zaman aşımında tekrar için
güvenli). Aynı request_id ile farklı gövde → 409.
İmza — her isteğinizde X-WinPay-Signature başlığı: HMAC-SHA256(zaman + "." + gövde, api_secret).
Zaman damgası ±5 dakika içinde olmalı (sunucu saatiniz NTP ile doğru olsun).
Callback — WinPay'in sizin HTTPS adresinize attığı POST. Başlığında
X-WinPay-Signature = HMAC-SHA256(gövde, callback_secret). Gövdedeki event_id ile
mükerreri yakalarsınız.
approved_amount — üye ödeme sayfasında sizin gönderdiğinizden farklı bir tutar seçebilir.
Bakiyeye her zaman callback'teki approved_amount yazılır, ilk amount değil.
Durumlar — yalnız iki tanesi "para hareket etti" demek: yatırımda approved, çekimde
completed. pending_approval üyenin "ödedim" demesidir, para geldi demek değildir.
Ne ters gidebilir
| Durum | Ne olur | Ne yapmalısınız |
|---|---|---|
| Üye ödemez | Talep 20 dakikada expired olur, callback gelir |
Bakiye değişmez; üyeye "süre doldu" gösterin |
| Üye farklı tutar öder | Callback approved_amount farklı gelir |
O tutarı yazın |
| Callback size ulaşmaz | WinPay artan aralıklarla tekrar dener (saatlerce) | Ucunuz 2xx dönene kadar tekrar gelir; geç gelen bildirimi atmayın |
| Aynı callback iki kez | Ağ tekrarı | event_id kaydınız varsa ikinci kez bakiye yazmayın |
| Sunucu saatiniz kaymış | Tüm istekler 401 | NTP kurun |
| IP'niz değişti | 403 | Yeni IP'yi bize bildirin |
| Çekim reddedildi | Callback rejected |
Bloke tutarı üyeye iade edin |
| Tutara uygun hesap yok | 503 | Üyeye "şu an kullanılamıyor" gösterin, biraz sonra tekrar |
Önemli sayılar
| Konu | Değer |
|---|---|
| Ödeme linki ömrü | 20 dakika |
| İmza zaman penceresi | ±300 saniye |
| İstek sınırı (init uçları) | 600 / dakika, API anahtarı başına |
| Callback zaman aşımı | 10 saniye (o sürede 2xx dönmelisiniz) |
| Callback tekrarı | Artan aralıklarla, en fazla 1 saat arayla |
| Tutar biçimi | "1000.00" — nokta, en fazla 2 basamak, string |
| IBAN | TR, 26 karakter |
Sonraki adım
Geliştirici: Entegrasyon rehberi. Alan tanımları: API referansı.