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ış
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-Key—pk_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ı
| Alan | Tip | Kural |
|---|---|---|
| orderRef | string | zorunlu · partner için unique |
| amountMinor | integer | ≥ 100 (1 TL) · kuruş cinsinden |
| currency | string | sadece 'TRY' |
| customer.name | string | 2–120 karakter |
| customer.email | string | geçerli e-posta |
| customer.phone | string | E.164 önerilir (+90…) |
| expiresInSec | integer | 60–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);
}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>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ı
| HTTP | error | Anlam |
|---|---|---|
| 401 | missing_auth_headers | Başlıklardan biri eksik |
| 401 | timestamp_out_of_tolerance | Sunucu saatiniz ±5dk dışında (NTP çalıştırın) |
| 401 | unknown_api_key | Hatalı/yanlış API key |
| 401 | signature_mismatch | İmza eşleşmiyor — canonical string hatalı |
| 403 | partner_suspended | Partner hesabınız askıya alınmış |
| 403 | ip_not_whitelisted | IP whitelist dışında |
| 409 | order_already_paid | Bu orderRef için zaten SUCCESS oturum var |
| 410 | session_expired | Süresi dolmuş oturuma ödeme denemesi |
| 422 | amountMinor_must_be_integer_ge_100 | Min 100 kuruş |
| 422 | customer_email_invalid | E-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 →