WinPay Entegrasyon BelgeleriEnglish →

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ı.