Ödeme Oluştur
Bir ödeme başlatmak için POST /v1/payments çağrılır. Bu istekle bir ödeme isteği oluşturursunuz (tutar, terminal, returnUrl); istek kartsızdır, kart bu çağrıda yer almaz. Yanıtta, alıcının tarayıcısını yönlendireceğiniz bir handoffUrl ve buna bağlı bir paymentRef döner. Kart, sonraki adımda alıcının tarayıcısından Lydia Gate 3DS Relay’e taşınır; bkz. Kart Handoff.
POST /v1/paymentsAuthorization: Bearer ldg_live_…Content-Type: application/jsonİstek gövdesi
Bölüm başlığı “İstek gövdesi”{ "amount": 125050, "partnerTxCode": "ORD-2026-8841", "terminalId": "trm_3Kd9x", "installment": 1, "description": "Sipariş #8841", "returnUrl": "https://magazan.example/odeme/sonuc"}| Alan | Zorunlu | Açıklama |
|---|---|---|
amount |
Evet | Tahsil edilecek tutar, kuruş cinsinden tamsayı (1.250,50 TL → 125050). Bkz. Tutar ve Para Birimi. |
partnerTxCode |
Evet | Sizin tarafınızda oluşturduğunuz, siparişe özgü işlem kodu. Idempotency anahtarı olarak çalışır (aşağıya bkz.): cevap kaybolduğunda yeni bir kod üretmek yerine aynı kodla tekrar deneyin. |
terminalId |
Evet | Ödemenin yönlendirileceği terminal. Size ait ve aktif olmalıdır; aksi halde terminal_not_allowed döner. Terminaller onboarding sırasında size tanımlanır; size verilen terminalId’yi kullanırsınız. |
installment |
Hayır | Taksit sayısı; tek çekim için 1 (varsayılan). Terminalinizde bu sayı için izin yoksa istek create anında installment_not_allowed ile reddedilir. Kartın hangi taksitlere uygun olduğunu ve komisyon oranlarını önceden görmek için Taksit Seçenekleri ucunu kullanabilirsiniz. |
description |
Hayır | İşlem açıklaması. |
returnUrl |
Evet | 3D dönüşünden sonra alıcının 303 ile yönlendirileceği adres. Lydia Gate bu adresi doğrular (open-redirect koruması). |
İlk create’te 201 Created, aynı isteğin idempotent tekrarında 200 OK döner — bkz. Idempotency: partnerTxCode. Her iki durumda da yanıtta kart ya da banka 3D form verisi bulunmaz; bir paymentRef ve bir handoffUrl döner:
{ "paymentCode": "pay_7Hq2bL", "status": "initiated", "paymentRef": "pr_3Kd9xQ1w2E", "handoffUrl": "https://pay.lydiagate.example/checkout", "idempotentReplay": false}| Alan | Açıklama |
|---|---|
paymentCode |
Ödemenin kalıcı kimliği; sorgu ve iade çağrılarında kullanılır. |
status |
Başlangıç durumu daima initiated. Bkz. Ödeme Yaşam Döngüsü. |
paymentRef |
Tek-kullanımlık ödeme referansı; handoff POST’unda kartla birlikte taşınır. paymentCode’dan ayrıdır; sorgu/iade çağrılarında kullanılmaz. |
handoffUrl |
Alıcının tarayıcısının/WebView’inin kart + paymentRef ile yönlendirileceği Lydia Gate 3DS Relay adresi. |
idempotentReplay |
false ise bu istek yeni bir ödeme oluşturdu (HTTP 201). true ise yanıt daha önce oluşturulmuş bir ödemenin tekrarıdır (HTTP 200): hiçbir yeni kayıt yazılmadı ve dönen paymentCode ve paymentRef ilk çağrıyla birebir aynıdır; status ise ödemenin o anki güncel durumudur (ilk çağrıdan sonra 3D akışı ilerlediyse initiated olmayabilir). Bkz. Idempotency: partnerTxCode. |
Alıcıyı handoff’a yönlendirme
Bölüm başlığı “Alıcıyı handoff’a yönlendirme”Yanıttaki handoffUrl’e, kendi checkout’unuzda topladığınız kartı ve paymentRef’i taşıyacak şekilde alıcının tarayıcısını/WebView’ini yönlendirirsiniz. Banka 3D formunu siz kurmazsınız; auto-submit formunu Lydia Gate 3DS Relay üretir. Detay (web form-POST ve mobil WebView): Kart Handoff.
Süre (TTL)
Bölüm başlığı “Süre (TTL)”Ödemenin 3D’yi tamamlamak için geçerli süresi varsayılan olarak 30 dakikadır; HalkÖde altyapısına yönlenen terminallerde bu pencere 135 dakikadır. Alıcı bu süre içinde tamamlamazsa ödeme expired durumuna geçer.
Hız limitleri
Bölüm başlığı “Hız limitleri”POST /v1/payments için her API anahtarının dakikada 60 istek bütçesi vardır. Ayrıca aynı kaynak IP için
dakikada 30 ve saatte 1.800 istek sınırı uygulanır. Aynı hesaba ait farklı API anahtarlarının 60/dk
bütçeleri birbirinden bağımsızdır; ancak aynı kaynak IP’den gelen istekler IP bütçelerini paylaşır. Bir API
anahtarının kaynak IP’yi değiştirmesi kendi 60/dk bütçesini sıfırlamaz.
Yüksek hacimli entegrasyonlarda hem API anahtarı bütçesi hem IP sınırları hesap bazında birlikte yükseltilebilir; bunun için bizimle iletişime geçin.
İdempotent tekrarlar dahil her create denemesi bu bütçeleri tüketir. Bir sınır aşıldığında ödeme okunmadan ya
da oluşturulmadan 429 rate_limited döner. Yanıttaki Retry-After header’ı daima 60’tır (hangi sınırın
dolduğu ayrıca belirtilmez); 60 saniye sonra tekrar deneyebilirsiniz.
Ayrıca bütün API-key /v1 uçları, API anahtarı veritabanında aranmadan önce aynı kaynak IP için ortak
240/dk ve platform genelinde 600/dk kaba kötüye-kullanım supabından geçer. Bunlar bu ucun iş kotası
değildir: farklı /v1 uçları aynı üst-katman IP bütçesini paylaşır ve anormal toplam yükte daha erken
429 rate_limited dönebilir.
Idempotency: partnerTxCode
Bölüm başlığı “Idempotency: partnerTxCode”partnerTxCode bir idempotency anahtarıdır: aynı kodla, aynı içerikte gönderdiğiniz bir istek yeni bir ödeme oluşturmaz — ilk çağrının cevabını tekrar eder.
| Senaryo | Yanıt |
|---|---|
| İlk create | 201 Created + idempotentReplay: false |
Aynı partnerTxCode + aynı istek |
200 OK + idempotentReplay: true — ilk çağrıyla birebir aynı paymentCode/paymentRef; status güncel durum |
Aynı partnerTxCode + farklı istek |
409 duplicate_partner_tx_code |
“Aynı istek” ne demek: aşağıdaki alanların hepsi birebir eşleşiyorsa istek aynı sayılır: partnerId (API anahtarınızdan gelir, gövdede yer almaz), terminalId, amount, installment ve para birimi (bugün her zaman TRY, istekte ayrı bir alan olarak gönderilmez). returnUrl ve description bu karşılaştırmaya girmez — aynı sipariş için farklı bir dönüş adresi göndermek meşrudur ve replay’i bozmaz.
Üç sınır:
failed/expiredbir ödeme anahtarı serbest bırakır. Bir ödeme bu durumlardan birine geçtikten sonra aynıpartnerTxCodeile gönderdiğiniz istek replay değildir; normal şekilde yeni bir ödeme oluşturur (201).- İdempotent tekrar, ödemeyi oluşturduğunuz arayüzle sınırlıdır. Bir ödeme merchant panelinden oluşturulduysa aynı
partnerTxCodeile yapılan API çağrısı replay değildir (409döner) — ve tersi. Her arayüz kendi tekrarını görür; API entegrasyonunuz yalnız API’den oluşturduğu ödemeleri tekrarlayabilir. - Ödeme linkiyle doğan ödemeler replay edilmez. Ödeme linki ile tamamlanan bir ödemenin
partnerTxCode’u otomatik üretilir (PL-öneki, örn.PL-42-1); link ödemesi hâlâ aktifken bu koduPOST /v1/payments’a gönderirseniz yanıt409 duplicate_partner_tx_code’dur — ödeme linki akışı idempotent tekrar kapsamının dışındadır. (Link ödemesifailed/expiredolduysa 1. maddedeki kural işler: anahtar serbest kalır ve yeni bir ödeme oluşur.)
Aynı partnerTxCode ile daha önce oluşturduğunuz ödemenin güncel durumunu öğrenmek için (örn. cevap kaybolduktan sonra tekrar denemeden önce durumu kontrol etmek isterseniz) GET /v1/payments?partnerTxCode=… kullanabilirsiniz — bu alias yalnızca aktif ödemeleri çözer; failed/expired bir ödeme için kesin sorgu paymentCode’la yapılır (bkz. Ödeme Sorgula).
Olası hatalar
Bölüm başlığı “Olası hatalar”| Kod | Sebep |
|---|---|
rate_limited |
API anahtarı ya da kaynak-IP hız limiti aşıldı (429). Retry-After süresi dolduktan sonra aynı partnerTxCode ile tekrar deneyin. |
duplicate_partner_tx_code |
Aynı partnerTxCode farklı bir istekle kullanılmış (ya da başka bir arayüzde oluşturulmuş bir ödemeye, ya da bir ödeme linkine ait) — kod başka bir tahsilat için kullanımda. Aynı istek tekrarlanırsa bu hata değil, 200 idempotent tekrar döner. Bkz. Idempotency: partnerTxCode. |
terminal_not_allowed |
Terminal size ait değil ya da pasif. |
amount_limit_exceeded |
Hesabınıza tek-işlem için bir min/maks tutar sınırı tanımlanmışsa, bu aralığın dışındaki tutar 422 ile reddedilir. Sınır tanımlı değilse (varsayılan) tutar kontrolü yalnızca pozitifliktir: negatif ya da 0 tutar 400 validation_error ile reddedilir. |
pos_per_tx_limit_exceeded, pos_daily_limit_exceeded, pos_weekly_limit_exceeded, pos_monthly_limit_exceeded, pos_time_window_limit_exceeded |
Terminalinizin bağlı olduğu banka bağlantısına tanımlı bir limit (işlem-başı, günlük, haftalık, aylık ya da belirli bir saat aralığı) doldu (422). Ödeme oluşturulmaz; partnerTxCode tüketilmez, aynı istekle daha sonra tekrar deneyebilirsiniz. Bu limitler 3D başlangıcında da devreye girebilir; bkz. Ödeme Akışı ve Hata Kodları. |
installment_not_allowed |
Terminalinizde bu taksit sayısı için izin yoksa istek create anında (bu çağrıda) reddedilir. Kartın markasına bağlı diğer nedenler (kart takside uygun değil, bu marka × taksit sayısı terminalinizde sunulmuyor) kart bu çağrıda henüz bilinmediğinden hâlâ yalnızca handoff/3D devri sırasında değerlendirilir. Kurtarma yolu: Hata Kodları. |
Tam liste: Hata Kodları.