Pay-in Extra v1.1.1
TR EN
İşyeri Girişi

Merchant API entegrasyon rehberi

v1.1.1

Bir talebin ne zaman kabul edildiğini, güvenli yeniden denemeyi ve doğrulanmış ödeme sonuçlarının nasıl işleneceğini tek sözleşme üzerinden uygulayın.

Sözleşme
v1.1.1
Revizyon 2026-08-15
Taşıma
HTTPS
REST · JSON
Temel adres
https://payinextra.com/api/v1
Üretim API kökü

01 · Hızlı başlangıç

İlk ödeme talebinin oluşturulması

Tutar alanları kuruş bazında iletilir. Örneğin 12550 değeri ₺125,50 tutarını ifade eder. 201 yanıtında doğrudan IBAN veya güvenli bir ödeme sayfası bulunur; müşteriye yalnız yanıtta verilen ödeme talimatını gösterin.

01

API erişimini yapılandırın

İşyeri paneli üzerinden etkin bir API anahtarı oluşturun.

02

Talebi iletin

Her POST talebi için benzersiz bir idempotency anahtarı kullanın.

03

Sonucu doğrulayın

Finansal sonucu webhook veya işlem sorgulama API’si üzerinden kesinleştirin.

curl --request POST   --url https://payinextra.com/api/v1/payments/deposits   --header 'Content-Type: application/json'   --header 'X-API-Key: YOUR_API_KEY'   --header 'X-Merchant-Id: YOUR_MERCHANT_ID'   --header 'X-Idempotency-Key: 550e8400-e29b-41d4-a716-446655440000'   --data '{
    "amount": 12550,
    "currency": "TRY",
    "paymentMethod": "bank_transfer",
    "merchantReference": "order-2026-000045",
    "customer": {
      "name": "Ahmet Yılmaz",
      "reference": "customer-1742",
      "email": "ahmet@example.com"
    },
    "metadata": {
      "cartId": "cart-8GQ39"
    }
  }'
{
  "paymentId": "pay_01H9YE1N5CB3X7S9HESY7Y5XGK",
  "type": "deposit",
  "status": "pending",
  "paymentMethod": "bank_transfer",
  "merchantReference": "order-2026-000045",
  "amount": 12550,
  "currency": "TRY",
  "paymentPageUrl": null,
  "metadata": {
    "selectedWallet": {
      "id": "pay_01H9YE1N5CB3X7S9HESY7Y5XGK",
      "iban": "TR120006200119000006672315",
      "accountName": "PAY-IN EXTRA TAHSILAT",
      "bankName": "Ornek Banka"
    }
  },
  "expiresAt": "2026-07-25T15:30:00.000Z"
}

02 · Kabul sınırı

HTTP yanıtı işlemin platform tarafından sahiplenilip sahiplenilmediğini belirler

Durum kodunu yalnız teknik başarı olarak yorumlamayın. Aşağıdaki sınır, yeni talep açılıp açılamayacağını ve callback beklenip beklenmeyeceğini belirler.

201

Kabul edildi

Yatırımda ödeme talimatı üretildi; çekimde sağlayıcı kabulü kalıcı olarak kaydedildi.

202

Sahiplenildi, sonuç bekleniyor

Yalnız çekimde kullanılır. Yeni talep açmayın; aynı paymentId üzerinden mutabakatı bekleyin.

4xx / 5xx

Normal akışa kabul edilmedi

Yanıttaki error.code aksiyonunu uygulayın. Bu talep için normal sonuç callback’i beklemeyin.

Yanıt yok

Taşıma sonucu belirsiz

Yeni anahtar üretmeyin. Aynı gövde ve aynı idempotency anahtarıyla tekrar edin.

Yatırım kabul şartı

Banka transferi yatırımı yalnız müşterinin ödeme yapabileceği bilgi üretildiğinde kabul edilir.

metadata.selectedWallet.iban geçerlidir veya
paymentPageUrl güvenli HTTPS adresidir
202 Accepted · yalnız çekim
{
  "paymentId": "pay_01H9YE1N5CB3X7S9HESY7Y5XWQ",
  "type": "withdrawal",
  "status": "pending",
  "failureCode": "PROVIDER_RESULT_UNKNOWN",
  "failureReason": "Processing outcome requires reconciliation",
  "merchantReference": "withdrawal-2026-0088",
  "amount": 25000,
  "approvedAmount": null,
  "currency": "TRY",
  "payoutMethod": "havale"
}
Geç gelen sağlayıcı başarısı

Kabul edilmemiş bir banka transferi yatırımı daha sonra sağlayıcı tarafından başarılı doğrulanırsa ilk POST kararı ve idempotent replay değişmez. Geç başarı callback’i yalnız sağlayıcı kanıtı ilk yetkili tarafından incelenip farklı bir admin tarafından mağaza mutabakatına onaylandıktan sonra gönderilir.

GET /payments/{paymentId} gerçek succeeded durumunu ve approvedAmount değerini, sağlayıcı kanıtı ilk yetkili tarafından incelenip farklı bir admin tarafından mağaza mutabakatına onaylandıktan sonra gösterir. Bu iki onay tamamlanmadan sorgu mağazanın daha önce gördüğü başarısız durumu korur. GET /payment-requests/{merchantReference} ise her zaman ilk API kabul kararını korur.

Aynı paymentId için daha önce deposit.failed olayı alınmış olsa bile onaydan sonra yeni bir deposit.succeeded olayı ve yeni eventId gelebilir. Her olayı eventId ile tekilleştirin ve alınan olayları sequence değerine göre monoton işleyin.

03 · Güvenlik

Her istekte gerekli kimlik bilgilerini iletin

API anahtarı yalnızca güvenli sunucu ortamında saklanmalıdır. Tarayıcı, mobil uygulama veya kaynak kod deposu içerisinde bulundurulmamalıdır.

X-API-Key
YOUR_API_KEY

İşyeri paneli üzerinden oluşturulan gizli API anahtarıdır.

X-Merchant-Id
YOUR_MERCHANT_ID

İsteğin sahibi olan işyerine atanmış benzersiz kimliktir.

X-Idempotency-Key
UUID v4

Her yeni POST işlemi için üretilmesi gereken benzersiz anahtardır.

IP erişim kısıtlaması

API anahtarının yalnızca yetkili sistemler tarafından kullanılabilmesi için işyeri panelinde izin verilen sunucu IP adreslerinin tanımlanması önerilir.

04 · Finansal güvenlik

Yeniden deneme işlemlerinde mükerrer kayıtları önleyin

Bağlantı zaman aşımında aynı istek içeriği, aynı X-Idempotency-Key değeriyle yeniden gönderilmelidir. Yeni bir anahtar kullanılması bağımsız bir işlem talebi olarak değerlendirilir.

Güvenli yeniden deneme

1. Anahtarı sipariş kaydıyla ilişkilendirerek kalıcı biçimde saklayın.

2. Zaman aşımı durumunda aynı istek içeriğini ve aynı anahtarı kullanın.

3. Belirsiz sonuçları merchantReference sorgusu üzerinden doğrulayın.

Hatalı kullanım örnekleri

Aynı anahtarı farklı tutar veya müşteri bilgileriyle kullanmayın.

Zaman aşımı sonrasında farklı bir kanal üzerinden yeni ödeme talebi oluşturmayın.

Webhook tekrarlarını yalnızca paymentId alanına göre tekilleştirmeyin.

05 · API referansı

Temel API uç noktaları

Ana servis adresi: https://payinextra.com/api/v1

POST
/payments/deposits Para yatırma talebi oluşturma

Geçerli IBAN veya güvenli ödeme sayfası üretilebildiğinde talebi kabul eder.

201
POST
/payments/withdrawals Para çekme talebi oluşturma

Kesin sağlayıcı kabulünde 201, sonucu mutabakat bekleyen sahiplenilmiş talepte 202 döndürür.

201 / 202
GET
/payments/{paymentId} İşlem durumu sorgulama

Para yatırma, para çekme veya kripto işleminin güncel platform durumunu döndürür.

200
GET
/payment-requests/{merchantReference} İşyeri referansı ile sorgulama

İlk API kararını ve idempotent kabul sonucunu işyeri referansıyla doğrular.

200
GET
/get-balance Bakiye bilgisi sorgulama

TRY cinsinden kullanılabilir, blokeli ve ödeme işlemine uygun bakiyeleri kuruş bazında döndürür.

200

Kripto İşlemleri

Yetki gerektirir

Kripto işlem yetkileri, işyeri hesabı için ayrıca etkinleştirilmelidir.

/payments/crypto-deposits /payments/crypto-withdrawals /payments/crypto-payouts

06 · Asenkron sonuç

Tekil ve güvenilir işlem sonucu

İşyeri callback bildirimi iç yönlendirme denemelerini değil, kabul edilmiş işlemin veya çift onaylı geç başarının doğrulanmış yaşam döngüsünü taşır. amount ilk talebi, approvedAmount ise gerçekten kesinleşen tutarı ifade eder.

Yatırım olayları

deposit.pending deposit.processing deposit.succeeded deposit.corrected deposit.failed deposit.refunded

Çekim olayları

withdrawal.pending withdrawal.succeeded withdrawal.failed withdrawal.cancelled

Payout olayları

payout.pending payout.processing payout.succeeded payout.failed
Webhook payload · v2
{
  "event": "deposit.succeeded",
  "eventId": "evt_9f3a7c2b5e81",
  "sequence": 2,
  "version": 2,
  "paymentId": "pay_01H9YE1N5CB3X7S9HESY7Y5XGK",
  "type": "deposit",
  "status": "succeeded",
  "merchantReference": "order-2026-000045",
  "amount": 12550,
  "approvedAmount": 12550,
  "currency": "TRY",
  "occurredAt": "2026-07-25T14:42:18.000Z"
}
Onaylı tutar düzeltmesi

deposit.corrected yalnız v2 endpoint event filtresinde açıkça seçildiyse gönderilir. “Tüm olaylar” şeklindeki eski/boş filtre otomatik abonelik değildir. approvedAmount yeni, previousApprovedAmount önceki kanonik tutardır ve correctionVersion her zaman sequence ile aynıdır.

deposit.corrected · v2
{
  "event": "deposit.corrected",
  "eventId": "evt_correction_7b3f491c",
  "sequence": 3,
  "version": 2,
  "paymentId": "pay_01H9YE1N5CB3X7S9HESY7Y5XGK",
  "type": "deposit",
  "status": "succeeded",
  "merchantReference": "order-2026-000045",
  "amount": 50000,
  "approvedAmount": 50000,
  "previousApprovedAmount": 500000,
  "correctionId": "01a007f3-51b3-7160-9334-275bcfb359a3",
  "correctionVersion": 3,
  "correctionSnapshotHash": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
  "currency": "TRY",
  "occurredAt": "2026-07-25T15:02:10.000Z"
}

Doğrulama başlıkları

Content-Type: application/json
X-Webhook-Version: 2
X-Webhook-Key-Id: whk_...
X-Webhook-Event-Id: evt_...
X-Webhook-Sequence: 3
X-Webhook-Sequence-Scheme: aggregate_version_sparse_v1
X-Webhook-Event: deposit.succeeded
X-Webhook-Id: <delivery-id>
X-Webhook-Timestamp: <unix-seconds>
X-Webhook-Signature: v2=<hex-hmac-sha256>
User-Agent: Pay-inExtra-Webhooks/2.0

Webhook alıcı gereksinimleri

  • HMAC-SHA256 imzasını değiştirilmemiş ham istek içeriği üzerinden doğrulayın.
  • Timestamp alanı için en fazla 300 saniyelik tekrar oynatma penceresi uygulayın.
  • eventId değerini benzersiz olarak saklayın ve yinelenen bildirimlere yeniden işlem yapmayın.
  • aggregate_version_sparse_v1 monoton artandır; aradaki sayı boş diye işlemi bekletmeyin.
  • Olayı ve bakiyeyi veritabanına kaydettikten sonra 2xx dönün. Herhangi bir 2xx nihai ACK kabul edilir.
  • Endpoint duplicate modundaysa 409 Conflict dönebilirsiniz; sistem bunu başarılı kabul eder.

07 · Hata yönetimi

HTTP durum kodu ve error.code alanını birlikte değerlendirin

Tüm hata yanıtları, uçtan uca izlenebilirlik amacıyla X-Request-ID başlığını ve requestId alanını içerir.

HTTP Kod (error.code) Aksiyon Önerilen İşlem
400 MISSING_IDEMPOTENCY_KEY Düzeltin Eksik başlığı ekleyin. Aynı ticari talep için önceden üretilmiş anahtarı kullanın.
401 MISSING_CREDENTIALS · INVALID_MERCHANT · INVALID_API_KEY Düzeltin Kimlik bilgilerini doğrulayın; geçerli anahtar olmadan otomatik tekrar yapmayın.
403 IP_NOT_ALLOWED · FIREWALL_BLOCKED Düzeltin Çıkış IP adresini işyeri panelindeki izin listesine ekleyin ve aynı talebi yeniden gönderin.
403 DEPOSITS_DISABLED · WITHDRAWALS_DISABLED Düzeltin İlgili işlem türü işyeri için kapalıdır. Hesap ayarı açılmadan talebi tekrarlamayın.
404 PAYMENT_NOT_FOUND Kontrol edin paymentId veya merchantReference değerini ve isteğin doğru işyeri hesabıyla yapıldığını doğrulayın.
409 IDEMPOTENCY_KEY_REUSED Göndermeyin Anahtar farklı içerikle kullanılmıştır. İlk isteğin gövdesini geri yükleyin; yeni işlem üretmeyin.
409 DUPLICATE_REFERENCE · DUPLICATE_MERCHANT_REFERENCE Sorgulayın Referans mevcut talebe aittir. Yeni kayıt açmak yerine mevcut talebi sorgulayın.
409 REQUEST_IN_PROGRESS Aynı anahtar İlk istek tamamlanmaktadır. Kısa süre bekleyip aynı gövde ve idempotency anahtarıyla tekrar edin.
422 VALIDATION_ERROR · ERR_PROVIDER_VALIDATION Düzeltin Alanları hata ayrıntısına göre düzeltin. Düzeltilmemiş aynı talebi tekrar göndermeyin.
422 ERR_PROVIDER_REJECTED Kesin red Talep kesin olarak reddedilmiştir. Bu işlem için callback beklemeyin.
429 RATE_LIMITED Aynı anahtar Retry-After süresini bekleyip aynı istek gövdesi ve anahtarla yeniden deneyin.
502 ERR_PROVIDER_RESPONSE_INVALID İnceleyin Geçerli ödeme talimatı üretilemedi; talep kabul edilmedi ve callback beklenmemelidir.
503 ERR_PROVIDER_RESULT_UNKNOWN Mutabakat Gönderim sonucu belirsizdir. Yeni anahtar üretmeyin. Aynı anahtar yalnız kanonik sonucu döndürür; yeniden gönderim yapmaz. Talebin durumunu sorgulayın.
503 ERR_PROVIDER_UNAVAILABLE · ERR_POOL_WITHDRAWAL_CAPACITY_FULL · FINANCIAL_CUTOVER_IN_PROGRESS Yeni talep Talep kabul edilmemiştir. Aynı anahtar kanonik 503 sonucunu döndürür ve yeniden gönderim yapmaz. Geçici engel kalktıktan sonra yeni anahtar ve benzersiz merchantReference ile ayrı bir talep oluşturun.
503 ERR_POOL_NO_ACCOUNT Yeni çekim details.retryable=true olsa da aynı anahtar terminal 503 sonucunu tekrarlar. İlk çekimin kabul edilmediğini doğrulayın; uygun hesap oluştuğunda yeni anahtar ve benzersiz merchantReference ile ayrı bir çekim oluşturun.
503 API_JOURNAL_UNAVAILABLE · API_RESULT_UNAVAILABLE Aynı anahtar Güvenli kabul altyapısı geçici olarak hazır değildir. Yeni işlem oluşturmadan tekrar edin.
500 INTERNAL_ERROR · AUTHENTICATION_ERROR Aynı anahtar requestId değerini kaydedin ve aynı talebi kontrollü gecikmeyle yeniden gönderin.

08 · Son kontrol

Canlıya geçiş kontrol listesi

Canlı ortamda işlem başlatılmadan önce aşağıdaki gereksinimler test ortamında doğrulanmalıdır.

API anahtarı yalnızca güvenli sunucu sır yönetimi altyapısında saklanmaktadır.
Her POST talebi için merchantReference ve idempotency anahtarı kalıcı olarak saklanmaktadır.
Zaman aşımı sonrasındaki yeniden denemelerde aynı anahtar ve istek içeriği kullanılmaktadır.
201 yatırım yanıtında doğrudan IBAN veya güvenli paymentPageUrl bulunduğu doğrulanmaktadır.
202 çekim yanıtı yeni bir işlem açılmadan aynı paymentId üzerinden takip edilmektedir.
TRY tutarları kuruş bazında iletilmektedir (Örn: 125.50 TL = 12550 kuruş).
Webhook imzası değiştirilmemiş ham istek içeriği üzerinden HMAC-SHA256 ile doğrulanmaktadır.
Yinelenen bildirimler eventId alanındaki benzersizlik kısıtıyla engellenmektedir.
Webhook alıcısı aggregate_version_sparse_v1 sözleşmesini uygular; alınan olayları monoton işler.
Olay ve finansal etkisi kalıcı olarak kaydedilmeden 2xx dönülmez; her 2xx nihai ACK kabul edilir.
Duplicate 409 yalnızca endpoint accept_as_duplicate olarak yapılandırıldığında kullanılmaktadır.
Webhook endpointi yönlendirme (3xx) yapmadan doğrudan yanıt vermektedir.
Retry ve replay sırasında ilk eventId, payload, URL ve imza anahtarı snapshot değerlerinin korunduğu doğrulanmıştır.
Abone olunan deposit.processing olayı kalıcı olarak kaydedilip 2xx ile kabul edilmektedir.
V1 endpoint kullanılıyorsa body-HMAC ve X-Secret-Key akışı korunmakta; URL doğrudan POST isteğine cevap vermektedir.
paymentId ve requestId değerleri sistem kayıtlarında sorgulanabilir durumdadır.
Makine tarafından okunabilir API sözleşmesi

OpenAPI 1.1.1 · revizyon 2026-08-15

OpenAPI YAML Dosyasını İndirin