GELİŞTİRİCİ DOKÜMANLARI

Partner Ödeme API

Dış sistemlerinizden (e-ticaret, randevu, CRM, Laravel/PHP, Node, WordPress) TepePlatform üzerinden kart tahsilatı alın. iyzico 3D Secure altyapısını kendiniz entegre etmeniz gerekmez — tek bir HTTP POST ile ödeme oturumu açar, müşterinizi hosted checkout sayfasına yönlendirir, sonucu imzalı webhook ile alırsınız.

1 · Akış

1. [Partner Backend] ───▶ POST /api/partner/payments/init (HMAC imzalı) 2. [TepePlatform] ───▶ { sessionId, checkoutUrl, iframeUrl } 3. [Partner Frontend] ───▶ Müşteriyi checkoutUrl'e yönlendir 4. [TepePlatform] ───▶ Kart formu + 3D Secure + iyzico tahsilat 5. [TepePlatform] ───▶ POST partner.callbackUrl (imzalı webhook) 6. [Partner Backend] ───▶ Siparişi "paid" işaretle

2 · Kimlik Doğrulama — HMAC SHA-256

Her istek üç başlık taşır. İmza, secret anahtarınız ile aşağıdaki canonical string'in HMAC-SHA256 hex digest'idir:

HTTP_METHOD\n
PATH\n
TIMESTAMP\n
BODY

// Örnek: POST /api/partner/payments/init
// timestamp = 1729185000
// body      = {"orderRef":"APPT-1","amountMinor":250000,...}

Zorunlu başlıklar:

  • X-TP-Api-Keypk_live_... (partner paneli size verir)
  • X-TP-Timestamp — UNIX epoch saniye; ±5 dk tolerans (NTP şart).
  • X-TP-Signature — hex HMAC-SHA256 digest.

PHP örneği:

$timestamp = (string) time();
$body      = json_encode($payload, JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES);
$canonical = "POST\n/api/partner/payments/init\n{$timestamp}\n{$body}";
$signature = hash_hmac('sha256', $canonical, $secret);

3 · POST /api/partner/payments/init

Yeni ödeme oturumu açar ve müşteriyi yönlendireceğiniz URL'i döner.

Request body

{
  "orderRef":    "APPT-2025-11824",
  "amountMinor": 250000,
  "currency":    "TRY",
  "description": "Aymira Koçaklı Randevu — Beylikdüzü · Bacak Lazer Epilasyon",
  "customer": {
    "name":  "Ayşe Yılmaz",
    "email": "ayse@example.com",
    "phone": "+905551234567",
    "address": "Cihangir Mah. ...",
    "identity": "12345678901"
  },
  "redirectSuccess": "https://clinicpark.beauty/odeme/basarili?ref=APPT-2025-11824",
  "redirectFailure": "https://clinicpark.beauty/odeme/hata?ref=APPT-2025-11824",
  "expiresInSec": 1800
}

Response (200)

{
  "ok": true,
  "sessionId":   "clxabc...",
  "orderRef":    "APPT-2025-11824",
  "status":      "PENDING",
  "amountMinor": 250000,
  "currency":    "TRY",
  "checkoutUrl": "https://tepeplatform.com/dijitalplatform/odeme/partner/clxabc...",
  "iframeUrl":   "https://tepeplatform.com/dijitalplatform/odeme/partner/clxabc...?embed=1",
  "expiresAt":   "2026-04-17T12:34:56.000Z"
}

Alan kuralları

AlanTipKural
orderRefstringzorunlu · partner için unique
amountMinorinteger≥ 100 (1 TL) · kuruş cinsinden
currencystringsadece 'TRY'
customer.namestring2–120 karakter
customer.emailstringgeçerli e-posta
customer.phonestringE.164 önerilir (+90…)
expiresInSecinteger60–86400 · default 1800

4 · GET /api/partner/payments/{'{'}sessionId{'}'}

Oturumun güncel durumunu sorgular.

{
  "ok": true,
  "sessionId": "clxabc...",
  "status":    "SUCCESS",        // PENDING | AWAITING_3DS | SUCCESS | FAILED | CANCELLED | EXPIRED | REFUNDED
  "amountMinor": 250000,
  "cardLast4": "5454",
  "iyzicoPaymentId": "...",
  "completedAt": "2026-04-17T12:05:22.000Z"
}

5 · Webhook (async onay)

Ödeme son duruma ulaştığında partner'ın callbackUrl'üne imzalı POST gönderilir. Başarısızlıkta 3 deneme (3s, 10s, 30s backoff).

Başlıklar

X-TP-Signature:  sha256=<hex>            # hmac_sha256(secret, rawRequestBody)
X-TP-Event:      payment.success         # .success | .failed | .cancelled | .expired | .refunded
X-TP-Session-Id: clxabc...
Content-Type:    application/json
User-Agent:      TepePlatform-Webhook/1.0

Body

{
  "event": "payment.success",
  "sessionId": "clxabc...",
  "orderRef":  "APPT-2025-11824",
  "status":    "SUCCESS",
  "amountMinor": 250000,
  "currency":   "TRY",
  "cardLast4":  "5454",
  "iyzicoPaymentId": "...",
  "completedAt": "2026-04-17T12:05:22.000Z",
  "customer": { "name":"...", "email":"...", "phone":"..." },
  "timestamp": "2026-04-17T12:05:23.114Z"
}

Doğrulama (kritik güvenlik)

// Laravel
$expected = 'sha256=' . hash_hmac('sha256', $request->getContent(), $secret);
if (! hash_equals($expected, $request->header('X-TP-Signature'))) {
    abort(401);
}
Dikkat:İmza doğrulamadan gelen webhook'u kabul ederseniz saldırgan sahte "payment.success" uydurabilir ve ürünü/hizmeti bedava verir. Secret asla istemci (tarayıcı/mobil) koduna konmaz.

6 · Hosted Checkout — iki mod

A. Tam Sayfa Redirect (önerilen)

// Laravel
return redirect()->away($session['checkoutUrl']);

B. iframe Embed — partner sitesinden çıkmadan ödeme.

<iframe
  src="https://tepeplatform.com/dijitalplatform/odeme/partner/{sessionId}?embed=1"
  width="100%"
  height="720"
  style="border:0; max-width:960px;"
  allow="payment"
></iframe>

<script>
  window.addEventListener('message', (ev) => {
    if (ev.origin !== 'https://tepeplatform.com') return;
    if (ev.data?.type === 'tepeplatform:payment' && ev.data.status === 'success') {
      // Müşteriye teşekkür ekranı vb.
    }
  });
</script>
iframe ile gömmek için partner kaydınızın allowedOrigins alanında sitenizin origin'i bulunmalıdır (ör. https://clinicpark.beauty). PCI-DSS gereği kart formu her iki modda da TepePlatform alan adında yaşar.

7 · Test Kartları

Entegrasyon sırasında kullanılacak iyzico test kartları ve sandbox ortamı bilgileri canlı moda geçiş sonrası burada listelenecektir. Partner hesaplarınız canlı üretim anahtarlarıyla çalışır; gerçek kart bilgileri tepeplatform.com üzerinde 3D Secure iyzico akışıyla alınır.

8 · Hata Kodları

HTTPerrorAnlam
401missing_auth_headersBaşlıklardan biri eksik
401timestamp_out_of_toleranceSunucu saatiniz ±5dk dışında (NTP çalıştırın)
401unknown_api_keyHatalı/yanlış API key
401signature_mismatchİmza eşleşmiyor — canonical string hatalı
403partner_suspendedPartner hesabınız askıya alınmış
403ip_not_whitelistedIP whitelist dışında
409order_already_paidBu orderRef için zaten SUCCESS oturum var
410session_expiredSüresi dolmuş oturuma ödeme denemesi
422amountMinor_must_be_integer_ge_100Min 100 kuruş
422customer_email_invalidE-posta formatı geçersiz

9 · Örnek istemciler

  • Laravel / PHP: samples/laravel/ (TepePlatformClient.php + webhook controller)
  • Node.js: Yakında · fetch + crypto.createHmac
  • Python: Yakında · requests + hmac

API erişimi talep edin

Partner kaydı, API key + secret ve sandbox için bizimle iletişime geçin. Ortalama onboarding süresi: 1 iş günü.

Partner API başvurusu →