Kart — 3D Secure
POST /payments/direct/payment ile paymentMethod: "CARD" ve force3D: true gönderdiğinizde kart kendi sunucunuzdan banka doğrulamasıyla çekilir. Kart çekilmeden önce alıcı işlemi kendi bankasıyla onaylar (SMS kodu, banka uygulaması onayı, biyometri). Sorumluluk devri (liability shift) istediğinizde ve kartı kaydetmek istediğinizde kullanın. Platform banka gidiş-dönüşünü sizin yerinize yürütür; siz ödemeyi başlatır, alıcıyı yönlendirir ve sonucu alırsınız.
Tüm tutarlar minor unit (kuruş) tam sayıdır: "amount": 10050 = ₺100,50. Ondalık ya da float göndermeyin.
PCI DSS gerektirir. Ham kart numarasını (PAN) sunucunuzda alıp gönderdiğiniz için sistemleriniz PCI DSS kapsamına (SAQ D) girer. Kart verisi işlemek için sertifikalı değilseniz Checkout Formu kullanın.
Nasıl çalışır
İmzalı isteği gönderin
Sunucunuzdan POST /payments/direct/payment çağırın: paymentMethod: "CARD", force3D: true, callbackUrl ve card. Ödeme AWAITING_3D durumunda açılır ve yanıt bir REDIRECT aksiyonu taşır.
Alıcıyı yönlendirin
Alıcının tarayıcısını action.redirect.url adresine gönderin (GET /payments/threed/:token). Bu adres herkese açıktır; yoldaki tek kullanımlık token kimlik bilgisinin kendisidir. Platform alıcıyı bankanın 3D Secure sayfasına iletir.
Alıcı bankada doğrulanır
Banka alıcıdan doğrulama ister (SMS kodu, uygulama onayı). Bu adım alıcı ile bankası arasındadır.
Platform çekimi tamamlar
Banka doğrulama sonucunu platforma döndürür. Platform sonucu doğrular ve yalnız doğrulama başarılıysa çekimi yapar.
Sunucunuza imzalı bir form POST gelir
Alıcının tarayıcısı callbackUrl adresinize, sonucu taşıyan bir HTML form POST'u ile gönderilir. Bu POST alıcı arayüzünü yönetmek içindir; teslimat kararını ona göre vermeyin.
Webhook ile teyit edin
Nihai durum webhook olarak da gönderilir (payment.captured, payment.failed). Siparişi webhook'a ya da GET /payments/:id sorgusuna göre teslim edin.
Başarılı yönlendirme başarılı ödeme değildir. 3D Secure'da iki aşama vardır: doğrulama (alıcının kendini bankaya kanıtlaması) ve yetkilendirme (paranın çekilmesi). Ödeme doğrulamayı geçip yetkilendirmede düşebilir: yetersiz bakiye, banka reddi, limit. "Alıcı bankadan döndü" diye ürün göndermeyin; payment.captured webhook'unu ya da GET /payments/:id teyidini bekleyin.
Kimlik doğrulama
Uç Step-Up ister: Authorization: Bearer at_… token'ınız ve isteğin Ed25519 imzası. Her istek şu başlıkları taşır:
| Başlık | Değer |
|---|---|
Authorization | Bearer at_test_… (test) ya da Bearer at_live_… (canlı) |
X-Key-Id | Kayıtlı Ed25519 public key'inizin kimliği |
X-Date | ISO 8601 istek zamanı; sunucu saatine göre ±5 dakika içinde |
X-Nonce | İstek başına benzersiz, tek kullanımlık değer |
Digest | Ham JSON gövdesinin SHA-256=<base64> özeti |
X-Signature | Kanonik dizgi üzerinde Base64 Ed25519 imzası |
Idempotency-Key | Zorunlu, en fazla 200 karakter; bkz. Idempotency |
İmzanın nasıl kurulacağı Kimlik Doğrulama sayfasındadır. Uç hesabınızda Payment Gateway ürününün açık olmasını ister.
İstek
POST https://api-gateway.lunixi.com/api/v1/payments/direct/payment
Content-Type: application/jsonKart alanları
| Alan | Tip | Zorunlu | Açıklama |
|---|---|---|---|
paymentMethod | string | Evet | CARD |
force3D | boolean | Evet | true. Boolean olmalıdır; "true" gibi metin değer 400 VALIDATION_ERROR alır. Gönderilmezse ya da false ise çekim 2D yapılır → Kart — 2D |
card | object | Evet | Kart bilgisi; bkz. card |
callbackUrl | string | Hayır | http ya da https adresi, en fazla 2048 karakter. Alıcının tarayıcısı sonuçla bu adrese POST edilir. Göndermezseniz alıcı platformun sonuç sayfasını görür ve sayfanıza dönmez |
installment | integer | Hayır | Taksit sayısı, varsayılan 1. 2 ve üzeri için installmentQuoteToken gerekir |
installmentQuoteToken | string | Hayır | Taksit quote'undan aldığınız bağlayıcı token; bkz. Taksit |
preauth | boolean | Hayır | true: banka doğrulamasından sonra tutar bloke edilir, ödeme AUTHORIZED olur; bkz. Ön provizyon. Verilmezse ya da false ise tutar çekilir |
card, force3D, installment ve installmentQuoteToken yalnız paymentMethod: "CARD" ile gönderilebilir. Kartta sağlayıcıyı yönlendirme seçer; providerCode gönderilmez.
Sipariş alanları
| Alan | Tip | Zorunlu | Açıklama |
|---|---|---|---|
amount | integer | Evet | Tutar, minor unit tam sayı; en az 1. Sepet toplamıdır: alıcının ödediği ürün ve hizmet bedeli, vade farkı hariç. basketItems gönderirseniz kalemlerin price toplamına eşit olmalıdır. Kartta taksit seçilirse vade farkını sistem ekler. Örnek: 10050 |
currency | string (enum) | Evet | ISO 4217 kodu: TRY, USD, EUR, GBP, RUB, AED, SAR, QAR, KWD, JPY, CHF, CAD, AUD, CNY, AZN. Hesabınızda açık olmayan para birimi reddedilir |
orderId | string | Evet | Sizin sipariş numaranız, en fazla 128 karakter. Örnek: ORD-84722 |
customerId | string | Hayır | Sizin müşteri anahtarınız. Cüzdanla ödemede alıcıyı tanımlar; 3D Secure ile kart kaydında kart bu anahtarın altına yazılır. Örnek: cust_7788 |
description | string | Hayır | Ödeme açıklaması |
locale | string | Hayır | Mesaj dili, varsayılan tr |
paymentChannel | string | Hayır | Ödeme kanalı. Örnek: WEB |
paymentGroup | string | Hayır | Ürün grubu. Örnek: PRODUCT |
buyer | object | Hayır | Alıcı bilgisi; bkz. buyer |
shippingAddress | object | Hayır | Teslimat adresi; bkz. Adres |
billingAddress | object | Hayır | Fatura adresi; bkz. Adres |
basketItems | array | Hayır | Sepet kalemleri; bkz. basketItems[] |
metadata | object | Hayır | Kendi kayıtlarınız için serbest anahtar-değer nesnesi. Ön provizyonu metadata ile değil preauth alanıyla isteyin |
Tutar yalnız amount ile gönderilir; kaldırılan tutar alanları 400 payment.amount.field_removed alır. Tanımlı olmayan bir alan gönderirseniz istek 400 VALIDATION_ERROR ile reddedilir.
card
| Alan | Tip | Zorunlu | Açıklama |
|---|---|---|---|
cardHolderName | string | Ham kartta | Kart üzerindeki ad soyad |
cardNumber | string | Ham kartta | Kart numarası |
expireMonth | string | Ham kartta | İki haneli ay, 01–12 |
expireYear | string | Ham kartta | İki haneli yıl. Örnek: 30 |
cvcNumber | string | Ham kartta | 3 ya da 4 haneli güvenlik kodu. Kayıtlı kart çekiminde de bankaların çoğu ister |
cardUserKey | string | Kayıtlı kartta | Kartın kayıtlı olduğu müşteri anahtarı |
cardToken | string | Kayıtlı kartta | Kayıtlı kartın kalıcı referansı (storedCardToken). Checkout Formu'nun tek kullanımlık kart token'ı burada kullanılamaz |
cardSave | boolean | Hayır | true: kart, ödeme başarılı olursa customerId anahtarının altına kaydedilir. Yalnız 3D Secure istekte (force3D: true) gönderilebilir; 2D istekte 400 payment.card.save_requires_3ds alır |
cardName | string | Hayır | Kaydedilen karta verdiğiniz ad; cardSave: true ile birlikte. Örnek: İş kartım |
expireMonthveexpireYeargönderildiğinde iki haneli olmalıdır.- Ham kartla çekimde
cardHolderName,cardNumber,expireMonth,expireYearvecvcNumbergönderilir. Kayıtlı kartla çekimde ham kart alanları yerinecardUserKeyvecardTokengönderilir.
buyer
buyer opsiyoneldir. Gönderirseniz aşağıdaki "Evet" alanlarının hepsi dolu olmalıdır. Checkout Formu intent'inde (POST /payments/intents, POST /payments/marketplace/intents) bu zorunluluk yoktur: alanların hepsi isteğe bağlıdır, gönderdiğiniz alanların tipi ve uzunluğu doğrulanır.
| Alan | Tip | Zorunlu | Örnek |
|---|---|---|---|
id | string | Hayır | CUST-1 |
name | string | Evet | Ada |
surname | string | Evet | Yılmaz |
identityNumber | string | Evet | 11111111111 |
email | string (e-posta) | Evet | [email protected] |
gsmNumber | string | Evet | +905000000000 |
city | string | Evet | İstanbul |
country | string | Evet | Turkey |
zipCode | string | Evet | 34732 |
ip | string | Evet | Alıcının IP adresi |
registrationDate | string | Hayır | 2024-04-21 15:12:09 |
lastLoginDate | string | Hayır | 2026-10-05 12:43:35 |
registrationAddress | string | Hayır | Kayıtlı adres |
Zorunluluk kuralı, customerId ile farkı ve hata alan yolları: Alıcı Bilgileri.
Adres
shippingAddress ve billingAddress aynı yapıdadır. Nesneyi gönderirseniz beş alan da zorunludur.
| Alan | Tip | Örnek |
|---|---|---|
contactName | string | Ada Yılmaz |
address | string | Altunizade Mah. … |
city | string | İstanbul |
country | string | Turkey |
zipCode | string | 34742 |
İki adresin farkı ve hata alan yolları: Adres Bilgileri.
basketItems[]
| Alan | Tip | Zorunlu | Açıklama |
|---|---|---|---|
id | string | Evet | Kalem kodu |
name | string | Evet | Kalem adı |
category1 | string | Evet | Ana kategori |
category2 | string | Hayır | Alt kategori |
itemType | string (enum) | Evet | PHYSICAL ya da VIRTUAL |
price | integer | Evet | Kalem tutarı, minor unit tam sayı, en az 0 |
Kalemlerin price toplamı amount'a eşit olmalıdır; eşit değilse istek 400 VALIDATION_ERROR ile reddedilir. Vade farkı kalemlere yazılmaz.
Örnek istek
# Step-Up imza başlıklarının nasıl hesaplandığı için Kimlik Doğrulama sayfasına bakın.
curl -X POST https://api-gateway.lunixi.com/api/v1/payments/direct/payment \
-H "Authorization: Bearer at_test_5f3e2b1a..." \
-H "Content-Type: application/json" \
-H "X-Key-Id: mk_test_sk_..." \
-H "X-Date: 2026-10-11T09:00:00.000Z" \
-H "X-Nonce: 7d2c4e1a-3b9f-4a6d-8c51-2e0f9b7a6d34" \
-H "Digest: SHA-256=..." \
-H "X-Signature: ..." \
-H "Idempotency-Key: ORD-84721-1" \
-d '{
"paymentMethod": "CARD",
"force3D": true,
"amount": 10050,
"currency": "TRY",
"orderId": "ORD-84721",
"customerId": "cust_7788",
"callbackUrl": "https://merchant.example.com/payments/3d-result",
"card": {
"cardHolderName": "Ada Yilmaz",
"cardNumber": "5400000000000004",
"expireMonth": "12",
"expireYear": "30",
"cvcNumber": "123"
}
}'Yanıt
Banka gidiş-dönüşü tamamlanana kadar ödeme AWAITING_3D durumunda bekler. Yanıt HTTP 202 ile ve zarf status: "partial", code: "AWAITING_3D" olarak döner:
{
"status": "partial",
"code": "AWAITING_3D",
"message": "…",
"data": {
"paymentId": "9c6f2b1a-4e8d-4a3f-b5e6-2d7c1a9b8e30",
"orderId": "ORD-84721",
"status": "AWAITING_3D",
"paymentMethod": "CARD",
"providerCode": "<providerCode>",
"action": {
"id": "3ds_9c6f2b1a-4e8d-4a3f-b5e6-2d7c1a9b8e30",
"type": "REDIRECT",
"expiresAt": "2026-10-11T09:15:00.000Z",
"redirect": { "url": "/api/v1/payments/threed/<yönlendirme-token>" }
}
},
"statusCode": 202,
"requestId": "…"
}| Alan | Açıklama |
|---|---|
paymentId | Ödeme kimliği; capture, iade ve sorgu çağrılarında kullanılır |
status | AWAITING_3D |
providerCode | Ödemeyi yürüten sağlayıcının kodu; kartta sağlayıcıyı yönlendirme seçer. <providerCode> bir yer tutucudur |
action.type | REDIRECT |
action.redirect.url | Alıcının gideceği yönlendirme adresi |
action.expiresAt | Yönlendirmenin son geçerlilik zamanı (ISO 8601) |
action.redirect.urlgörelidir;https://api-gateway.lunixi.comköküne göre çözün ve alıcının tarayıcısını bu adrese gecikmeden yönlendirin (tarayıcıGETisteği).- Yönlendirme adresi tek kullanımlıktır. İkinci açılışta alıcı hata sayfası görür.
AWAITING_3D'de terk edilen ödemeyi platform kendisi sonuçlandırır: sağlayıcıya gerçek sonucu sorar ve ödemeyi gerçek durumuna bağlar (çekim yoksaFAILED, çekim yapılmışsaCAPTURED).- Kart 3D Secure aksiyonu için confirm çağrılmaz; sonuç dönüşte doğrulanır ve webhook ile bildirilir.
İstek doğrulamadan önce reddedilirse (limit, risk, geçersiz taksit quote'u) yanıt HTTP 400 ile döner: zarf status: "failure", data.status: "FAILED", code ret sebebini taşır. code alanına göre dallanın; message metni değişebilir. Zarfın alanları için bkz. Hata Yönetimi.
Sunucunuza gelen imzalı callback
Banka gidiş-dönüşünden sonra alıcının tarayıcısı callbackUrl adresinize bir HTML form POST (application/x-www-form-urlencoded) ile gönderilir. Gövde şu alanları taşır:
| Alan | Anlamı |
|---|---|
paymentId | Ödemenin kimliği |
orderId | Sizin sipariş numaranız (istekte verdiyseniz) |
status | success, failure ya da pending (sonuç hâlâ doğrulanıyor) |
success | "true" / "false" |
code | Makine tarafından okunabilir sonuç kodu |
message | Okunabilir sonuç mesajı |
_timestamp | İmzalama zamanı, ISO 8601 |
_signature | v2=<hex>: ${paymentId}.${_timestamp}.${canonical} üzerinde HMAC-SHA256, hex özet |
Kanonik dizgi, _signature dışındaki bütün alanların (_timestamp dahil) anahtara göre sıralanıp key=value biçiminde yazılması ve satır sonu (\n) ile birleştirilmesiyle oluşur.
Bu callback bilgilendirme amaçlıdır; teslimat kararını ona göre vermeyin. _signature ve _timestamp platformun ürettiği bütünlük alanlarıdır; merchant tarafında bu imzayı doğrulayacağınız bir sır dağıtılmaz. Siparişi ödenmiş saymadan önce durumu GET /payments/:id ile ya da payment.captured webhook'u ile teyit edin.
Callback'i alıcının arayüzünü yönetmek (sonuç sayfası göstermek, oturumu sürdürmek) için kullanın. Alıcının tarayıcısı callbackUrl adresinize hiç ulaşmayabilir (kapanan sekme, bağlantı kaybı); webhook ise her durumda gönderilir.
Durum geçişleri
| Nereden | Nereye | Ne zaman |
|---|---|---|
INITIATED | AWAITING_3D | 3D ödeme kabul edildi, yönlendirme adresi üretildi |
AWAITING_3D | CAPTURED | Banka doğrulaması ve çekim başarılı |
AWAITING_3D | AUTHORIZED | Ön provizyonda banka doğrulaması başarılı, tutar bloke edildi |
AWAITING_3D | FAILED | Alıcı doğrulamayı geçemedi ya da yarıda bıraktı, ya da yetkilendirme reddedildi |
AWAITING_3D | NEEDS_RECONCILIATION | Sonuç belirlenemedi (ör. banka dönüşü kayboldu); platform sağlayıcıya tekrar sorar ve nihai durumu bağlar |
Kayıtlı kart
Kartı kaydetme
Kart, 3D Secure ile yapılan bir ödeme sırasında kaydedilir; ayrı bir "kartı kaydet" çağrısı yoktur. force3D: true ile birlikte customerId gönderin ve ham kartla birlikte card.cardSave: true ekleyin; isterseniz card.cardName ile karta ad verin. Kart, doğrulama ve çekim başarılı olursa customerId anahtarının altına kaydedilir; ödeme başarısız olursa kaydedilmez.
Ödeme yanıtı bu ödemede yeni kaydedilen bir kartı taşıdığında kart data.savedCard içindedir:
| Alan | Açıklama |
|---|---|
storedCardToken | Kayıtlı kartın kalıcı referansı; sonraki çekimlerde card.cardToken olarak gönderilir |
cardUserKey | Kartın kayıtlı olduğu müşteri anahtarı |
maskedNumber, binNumber, lastFour | Kartın maskeli numarası, BIN'i ve son dört hanesi |
expireMonth, expireYear | Son kullanma ayı ve yılı |
cardBrand, cardType, cardFamily, bankCode, cardName | Varsa kartın marka, tip, aile, banka ve ad bilgisi |
deduplicated | true: kart zaten kayıtlıydı, yeni kayıt açılmadı ve mevcut referans döndü |
Kayıtlı kartları her zaman GET /payments/cards ile okuyabilirsiniz. Kart saklamanın panelden açılması ve kartların listelenmesi için bkz. Kart Saklama.
Kayıtlı kartla 3D ödeme
Ayrı bir uç yoktur. card nesnesine ham kart alanları yerine cardUserKey ve cardToken koyun:
{
"paymentMethod": "CARD",
"force3D": true,
"amount": 10050,
"currency": "TRY",
"orderId": "ORD-84724",
"callbackUrl": "https://merchant.example.com/payments/3d-result",
"card": {
"cardUserKey": "cust_7788",
"cardToken": "9f3c1a7e-…",
"cvcNumber": "123"
}
}Checkout Formu'nun tek kullanımlık kart token'ı burada kullanılamaz; cardToken kalıcı kayıt referansıdır.
Taksit
Alıcı bir taksit seçeneği seçtiyse installment ile birlikte taksit quote'undan aldığınız installmentQuoteToken'ı gönderin.
installment2ve üzeriyseinstallmentQuoteTokenzorunludur.amountsepet toplamı olarak kalır; vade farkını siz göndermezsiniz. Sistem vade farkını bağlayıcı quote'tan hesaplar ve çekilen tutara ekler: çekilen tutar =amount+ vade farkı. Gösterdiğiniz tutar neyse çekilen tutar odur.- Sorgudaki ve webhook'taki tutar alanları bu çekilen tutarı gösterir.
- Token yoksa, süresi dolmuşsa ya da istekle uyuşmuyorsa ödeme
FAILEDolur ve yanıt400 INSTALLMENT_QUOTE_REJECTEDdöner. Yeni bir quote alıp yeni birIdempotency-Keyile tekrar gönderin.
Ön provizyon
Tutarı çekmeden önce bloke etmek için istekte "preauth": true gönderin. Alıcı banka doğrulamasını tamamladığında para çekilmez: ödeme CAPTURED yerine AUTHORIZED olur ve payment.authorized gönderilir. Tutarı daha sonra capture ile çeker ya da void ile blokeyi kaldırırsınız.
- Sağlayıcının ön provizyonu 3D Secure ile de desteklemesi gerekir. Desteklemeyen sağlayıcılar adaylardan çıkarılır; uygun sağlayıcı kalmazsa ödeme
FAILEDolur ve ret koduPREAUTH_3DS_NOT_SUPPORTED'dır. - 3D Secure ile ön provizyonu destekleyen hiçbir sağlayıcı yoksa istek ödeme başlamadan
422 payment.preauth.three_ds_unsupportedile reddedilir. Talimat hiçbir koşulda anında çekime dönüştürülmez. - Capture, kısmi capture, void, süre dolumu ve hatalar: Ön Provizyon, Capture & İptal.
Idempotency
Idempotency-Key zorunludur (en fazla 200 karakter). Yoksa istek işlenmeden 400 payment.operation.idempotency_key_required alır. Ödemeyi değil denemeyi tanımlayan bir değer kullanın (örneğin ORD-84721-1).
| Durum | Sonuç |
|---|---|
| Aynı anahtar, aynı istek | İlk denemenin sonucu döner; ikinci ödeme açılmaz. Açık REDIRECT aksiyonu varsa yanıtta yine yer alır |
| Aynı anahtar, farklı istek (ör. farklı tutar) | 409 payment.idempotency.conflict |
| Aynı anahtarla ilk istek hâlâ işleniyor | 429 payment.idempotency.processing; kısa bir süre sonra aynı anahtarla tekrar deneyin |
Başarısız bir siparişi yeniden denemek için (başka kart, yeniden doğrulama) yeni bir Idempotency-Key gönderin. Aynı anahtarı kullanırsanız önceki denemenin sonucu döner. Aynı siparişi önce 2D sonra 3D ile denerken de yeni anahtar kullanın; aksi hâlde istek 409 ile reddedilir.
Hatalar
| Durum | Yanıt | Ne yapmalı |
|---|---|---|
| Eksik, hatalı ya da tanımsız alan | 400 VALIDATION_ERROR | details içindeki alanı düzeltin |
| Kaldırılan bir tutar alanı gönderildi | 400 payment.amount.field_removed | Tutarı yalnız amount ile gönderin |
Sepet toplamı amount'a eşit değil | 400 VALIDATION_ERROR | Kalemlerin price toplamını amount'a eşitleyin |
Idempotency-Key yok | 400 payment.operation.idempotency_key_required | Her deneme için bir anahtar gönderin |
| Bearer token yok ya da süresi dolmuş | 401 UNAUTHENTICATED | Yeni token alın |
| İmza doğrulanamadı | 401 INVALID_SIGNATURE | Kanonik dizgiyi Kimlik Doğrulama'daki sırayla kurun |
| Nonce daha önce kullanıldı | 401 NONCE_REPLAY | Her istek için yeni X-Nonce üretin |
X-Date ya da Digest hatalı | 401 INVALID_DATE, DIGEST_MISSING, INVALID_DIGEST | Bkz. Hata Yönetimi |
| Token ile imza anahtarı farklı merchant'a ait | 403 AUTH_MERCHANT_MISMATCH | Aynı hesabın anahtarlarını kullanın |
| IP izinli listede değil | 403 IP_NOT_ALLOWED | Panelden IP listesini güncelleyin |
| Hesap askıda | 403 MERCHANT_SUSPENDED | Destekle iletişime geçin |
| Ürün açık değil | 403 PRODUCT_NOT_ENABLED | Payment Gateway ürününün hesabınızda ve API anahtarınızda açık olduğunu doğrulayın |
| Ürün yetkisi o an doğrulanamadı | 503 PRODUCT_ENTITLEMENT_UNAVAILABLE | Geçicidir; kısa süre sonra tekrar deneyin |
| Taksit quote'u geçersiz ya da eksik | 400 INSTALLMENT_QUOTE_REJECTED, ödeme FAILED | Yeni quote alıp yeni Idempotency-Key ile gönderin |
| 3D Secure ile ön provizyon desteklenmiyor | 422 payment.preauth.three_ds_unsupported ya da ödeme FAILED, ret kodu PREAUTH_3DS_NOT_SUPPORTED | Para bloke edilmedi; bkz. Ön Provizyon |
| Limit kuralı reddetti | 400 payment.limit.exceeded, ödeme FAILED | Limitlerinizi kontrol edin |
| Risk değerlendirmesi reddetti | 400 RISK_BLOCKED, ödeme FAILED | Ödemeyi teslim etmeyin |
| Yönlendirme adresi süresi dolmuş ya da kullanılmış | GET /payments/threed/:token hata sayfası gösterir | Yeni Idempotency-Key ile yeni ödeme başlatın |
| Banka doğrulaması başarısız | Callback status=failure, ödeme FAILED, payment.failed | Alıcının başka kartla denemesine izin verin |
| Doğrulama sonrası yetkilendirme reddi | Callback status=failure, ödeme FAILED, payment.failed | Reddi gösterin; teslimat yapmayın |
| Sonuç kesinleşmedi | Callback status=pending, ödeme NEEDS_RECONCILIATION | Yeni ödeme açmayın; webhook'u bekleyin |
| Aynı anahtar, farklı istek | 409 payment.idempotency.conflict | Yeni deneme için yeni anahtar kullanın |
| Aynı anahtarla istek sürüyor | 429 payment.idempotency.processing | Kısa süre sonra aynı anahtarla tekrar deneyin |
| Geçici kesinti | 503 | GET /payments/:id ile durumu kontrol edin; aynı Idempotency-Key ile tekrar denemek ikinci ödeme açmaz |
Yöntem ve sağlayıcı seçimine ait ortak kodlar: Payment — Hata kodları.
Webhook'lar
| Event | Ne zaman |
|---|---|
payment.captured | Çekim tamamlandı, para çekildi. Siparişi bunun üzerine teslim edin |
payment.failed | Doğrulama ya da yetkilendirme başarısız oldu (terk edilip çekimsiz sonuçlanan ödemeler dahil) |
payment.authorized | Ön provizyonda banka doğrulaması tamamlandı ve tutar bloke edildi (AUTHORIZED); para henüz çekilmedi. Bkz. Ön Provizyon |
Olayların data'sında paymentMethod: "CARD" ve ödemeyi yürüten sağlayıcının providerCode'u bulunur. Teslimat ve imza doğrulama için bkz. Webhook'lar.
Sonraki adımlar
- Kart — 2D — banka doğrulaması olmadan çekim
- Taksit & BIN — taksit tablosu ve bağlayıcı quote
- Kart Saklama — kayıtlı kartların yönetimi
- İade — çekim sonrası para iadesi
- Webhook'lar — ödeme olayları