Download the PHP package voxyfy/anadolupay without Composer

On this page you can find all versions of the php package voxyfy/anadolupay. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.

FAQ

After the download, you have to make one include require_once('vendor/autoload.php');. After that you have to import the classes with use statements.

Example:
If you use only one package a project is not needed. But if you use more then one package, without a project it is not possible to import the classes with use statements.

In general, it is recommended to use always a project to download your libraries. In an application normally there is more than one library needed.
Some PHP packages are not free to download and because of that hosted in private repositories. In this case some credentials are needed to access such packages. Please use the auth.json textarea to insert credentials, if a package is coming from a private repository. You can look here for more information.

  • Some hosting areas are not accessible by a terminal or SSH. Then it is not possible to use Composer.
  • To use Composer is sometimes complicated. Especially for beginners.
  • Composer needs much resources. Sometimes they are not available on a simple webspace.
  • If you are using private repositories you don't need to share your credentials. You can set up everything on our site and then you provide a simple download link to your team member.
  • Simplify your Composer build process. Use our own command line tool to download the vendor folder as binary. This makes your build process faster and you don't need to expose your credentials for private repositories.
Please rate this library. Is it a good library?

Informations about the package anadolupay

AnadoluPay

Latest Version on Packagist Tests Total Downloads

Türk bankalarının sanal POS'ları için tek arayüz.

Türkiye'de banka entegrasyonu yazmak, aynı işi on yedi kez farklı şekilde yapmaktır. Garanti tutarı kuruş cinsinden tam sayı ister, NestPay ondalıklı dizgi. Garanti hash'i ayraçsız birleştirip büyük harfe çevirir, NestPay alanları sıralayıp | ile birleştirir, PosNet ; kullanır. Kuveyt Türk size form alanları değil hazır bir HTML sayfası döner. VakıfBank provizyon adımında kart bilgisini bir daha ister. Bunların hiçbiri dokümantasyonda yan yana yazmaz; her birini ayrı ayrı öğrenirsiniz.

Bu paket o farkları tek bir sözleşmenin arkasına alır:

Bankayı değiştirmek için 'garanti' yerine 'akbank' yazmak yeterlidir.

Çalışan bir örnek uygulama için: Voxyfy/anadolupay-laravel

Laravel'e değil düz Node.js/TypeScript'e bağlı kalmak isteyenler için aynı protokol bilgisiyle taşınan bir port da var: Voxyfy/anadolupay-node (npm) — test etmek için Voxyfy/anadolupay-node-example.

Aynı "çok sağlayıcı, tek arayüz" mimarisini kargo firmaları için uygulayan bir kardeş proje de var: Voxyfy/anadoluship (npm) — MNG, UPS, Yurtiçi, Aras, PTT ve Sürat Kargo için Node.js/TypeScript SDK'sı.

LLM API'lerine (OpenAI/Anthropic/Gemini) müşteri verisi gönderirken KVKK riskini azaltmak için de bir kardeş kütüphane var: Voxyfy/anadolushield (npm) — TCKN, VKN, IBAN, telefon, isim gibi kişisel verileri LLM'e göndermeden önce maskeler.

KVKK/GDPR uyumlu çerez rızası için de bir kardeş kütüphane var: Voxyfy/anadolucookie — framework'e bağımlı olmayan çerez rıza (cookie consent) banner kütüphanesi.

Ne yapmaz: Arayüz üretmez, sipariş durumu tutmaz, stok düşmez, fatura kesmez. Ödeme akışını yürütür ve yanıtı normalleştirir; gerisi sizin uygulamanızın işi.


Canlıya çıkmadan önce okuyun

Bu paketteki protokoller bankaların public dokümantasyonuna göre yazıldı ve istek üretimi, imza ve yanıt eşlemesi birim testleriyle kilitlendi. Ancak banka driver'larının çoğu gerçek bir bankaya karşı çalıştırılmadı. (Ölçülmüş olanlar için Doğrulama durumu tablosuna bakın — hangisinin nereye kadar götürüldüğü orada yazılıdır.)

Testler benim yazdığım algoritmayı doğrular, bankanın beklediğini değil. Bir alanın sırası yanlışsa test yeşil kalır, banka işlemi reddeder. Kullanacağınız her banka için kendi test üye işyeri bilgilerinizle en az bir 3D Secure satış ve bir iade çalıştırın. Hash hesabında bankalar zaman zaman kuruluma özel farklılıklar tanımlıyor.

Bu uyarı banka driver'ları içindir. iyzico driver'ı bunun dışındadır: sandbox ortamında uçtan uca çalıştırılıp doğrulanmıştır — bkz. Doğrulama durumu.


Doğrulama durumu

Her driver aynı ölçüde doğrulanmış değil. Bu tablo hangisinin nereye kadar ölçüldüğünü gösterir; "test var" ile "gerçekten çalışıyor" aynı şey değildir.

Seviye Ne anlama gelir
Uçtan uca Sağlayıcının sandbox'ında gerçek bir ödeme tamamlandı
Test vektörü İmza, sağlayıcının kendi yayınladığı vektörle birebir eşleşiyor
Dokümana göre Protokol dokümandan uygulandı, sağlayıcıya karşı ölçülmedi
Driver Seviye Dayanak
iyzico Uçtan uca 2026-08-09, sandbox 3D Secure satış
kuveytturk Uçtan uca (ödeme) 2026-08-09 — 3D doğrulama ve provizyon (OTORİZASYON VERİLDİ); sorgu/iade doğrulanmadı
craftgate Test vektörü Resmî istemci depolarındaki üç vektör
moka Uçtan uca 2026-08-09, test servisinde 3D Secure satış tamamlandı
tosla Uçtan uca 2026-08-09 — 3D satış, durum, taksit, iade ve iptal doğrulandı
paratika Dokümana göre Vektör yayınlanmıyor
NestPay bankaları Uçtan uca 2026-08-09, Ziraat test terminali — 3D satış, durum, iade ve iptal. ziraat, akbank ve isbank ayrıca kendi mağazalarında ölçüldü; kalan altı banka yalnızca bu ortak ölçüme dayanır
halkbank, teb, sekerbank, ing, alternatifbank (NestPay) Dokümana göre Uçlar canlı ve ayakta (entegrasyon.asseco-see.com.tr ortak ucu ve kendi sanalpos.* adresleri 200 dönüyor; torus-stage-halkbank 503, torus-stage-alternatifbank DNS'te yok, diğerleri stage'de de ayakta). Ancak bu beş banka için hiçbir yerde (bankanın kendi sitesi, Payten dokümanları, mewebstudio/pos gibi topluluk paketleri) açık test clientid/storekey/API kullanıcısı yayınlanmıyor — isbank ve turkiyefinans'ın aksine. Ölçüm için bankadan veya Payten'den ([email protected]) test üye işyeri istenmesi gerekiyor; kör tahminle deneme yapılmadı, çünkü yanlış kimlik de doğru kimlik gibi mdStatus hatası üretebiliyor ve bu ayrım ölçmeden yapılamıyor
isbank (NestPay) Uçtan uca 2026-08-11, İş Bankası'nın kendi mağazası (entegrasyon.asseco-see.com.tr, mağaza 700655000200) — 3D Secure tam turu (3DS 2.2.0, mdStatus 1, provizyon Approved, sorgu paid, iade Approved) örnek projeden tamamlandı; ayrıca 3D'siz satış, taksitli satış, iptal, iade, kısmi iade, ön provizyon, kapama ve sorgu. Dolaşımdaki yapılandırmaların ISBANK07'yi storekey sanması yüzünden bu driver uzun süre mdStatus 7 veriyordu — ISBANK07 API şifresidir, storekey TRPS0200
turkiyefinans (NestPay) Kısmen ölçüldü 2026-08-11, bankanın kendi yayınladığı NestPay test dokümanındaki mağaza (280000100) — 3D formu bankaca kabul edilip 3DS akışına girdi ve storekey TRPS2828 doğrulandı (yanlış anahtar mdStatus 7 veriyor). Provizyon, iade, iptal ve sorgu ölçülemedi: API kullanıcısı TFKBAPI bu mağazada yetkili değil, her istek 99 / Insufficent permissions dönüyor. Dokümandaki ikinci mağaza 280000200 artık yok (mdStatus 6)
qnb (NestPay) Kısmen ölçüldü 2026-08-11, Asseco/Finansbank'ın resmî "NestPay Test Dokümanı"ndaki paylaşılan mağaza (600100000) — 3D Secure tam turu (3DS 2.2.0, mdStatus 1, imza ve CAVV doğrulandı) örnek projeden iki farklı test kartıyla tamamlandı. Provizyon ikisinde de aynı jenerik hatayla düştü: ProcReturnCode 99, ERRORCODE ISO8583-19 ("Tekrar girin, tekrar deneyin"). Kart değişkeni elendiği için Türkiye Finans'takiyle aynı kalıp: paylaşılan kimlik 3D'yi geçirir ama provizyona yetkili değil. Gerçek ortam (www.fbwebpos.com) artık DNS'te çözülmüyor; test ortamı ortak Asseco ucunda (entegrasyon.asseco-see.com.tr) çalışıyor
akbank (NestPay) Uçtan uca 2026-08-11, Akbank'ın kendi test mağazası (entegrasyon.asseco-see.com.tr, mağaza 100100000) — 3D Secure tam turu (3DS 2.2.0, mdStatus 1, provizyon Approved) örnek projeden tamamlandı; ayrıca 3D'siz satış, taksitli satış, iptal, iade, kısmi iade, ön provizyon, kapama ve durum sorgusu. Storekey tahmin edilmedi, yanlış değerlerin mdStatus 7 vermesiyle ölçülerek ayrıldı
garanti (GVPS) Uçtan uca 2026-08-11, banka test terminali — 3D Secure tam turu (mdStatus 1, dönüş hash'i doğrulandı, provizyon 00 Approved) örnek projeden tamamlandı; ayrıca 3D'siz satış (sekiz test kartının yedisi), taksitli satış, sipariş sorgusu ve hareket dökümü. İade, iptal ve ön provizyon ölçülemedi: terminal bunları 05 / RPC-05 ile reddediyor. Driver kusuru değil — istek biçiminin on dört çeşitlemesi aynı yanıtı verdi, PROVAUT ile denendiğinde 92 / 0652 yetkiniz yok gelmesi kimliğin doğru kabul edildiğini gösteriyor
vakifbank (PayFlex) Uçtan uca 2026-08-10, banka sandbox'ı — 3D Secure satış tamamlandı; ayrıca non-3D satış, durum, iade (kısmî ve tam), iptal, ön provizyon ve kapama
akbank-pos Uçtan uca 2026-08-10, Akbank test store — 3D Secure satış ve iptali örnek projeden tamamlandı; ayrıca non-3D satış, kısmî/tam iade, ön provizyon, kapama ve işlem geçmişi. Dönüş imzası bankanın ürettiği hash ile birebir eşleşti
qnb-payfor (PayFor) Uçtan uca 2026-08-10, QNB demo ortamı — 3D Secure satış (Onaylandı), durum sorgusu ve iptal; dönüş imzası bankanın ürettiği ResponseHash ile iki ayrı gerçek dönüşte birebir eşleşti
ziraat-payflex Kısmen ölçüldü 2026-08-10, Innova preprod — 3D başlatma (MPI Enrollment) bankanın kendi test ortamında geçti; banka üye işyeri ve şifreyi kabul edip tam VERes döndürdü (PaReq, ACSUrl, TermUrl, MD). Satış/iade/iptal ölçülemedi: VPOS ucu ayrı bir iş yeri şifresi ve TerminalNo istiyor (5001). 3D'ye kayıtlı test kartı da bulunamadı — denenen altı kart Status N veya kart hatası verdi
paycell Kısmen ölçüldü 2026-08-10, Turkcell test ortamı — kart token alındı ve token yanıtının imzası sağlayıcının ürettiğiyle birebir eşleşti (test vektörü olarak kilitlendi); 3D oturumu da gerçek ortamda açıldı. Ödeme adımı ölçülemedi: yayınlanmış ortak test üye işyeri (9998) kart provizyonunda 4000 Bank error döndürüyor
yapikredi (PosNet) Kısmen ölçüldü 2026-08-10, setmpos.ykb.com — şifreleme, 3D form, bankanın ACS sayfası ve oosResolveMerchantData gerçek ortamda geçildi; dönüş MAC'i bankanın ürettiğiyle birebir eşleşti ve test vektörü olarak kilitlendi. Finansallaştırma ölçülemedi: banka IP tanımlaması istiyor (0148 UNAUTHORIZED REQUEST) ve yayınlanmış test kartlarının hepsi eskimiş
denizbank (InterPos) Dokümana göre 3D form imzası bağımsız bir implementasyonla birebir aynı; ölçüm yapılamadı — test ortamı IP tanımlaması istiyor ve test üye işyeri bilgileri yayınlanmıyor
tami Dokümana göre — çelişkili dev.tami.com.tr dokümantasyonundan uygulandı, sandbox kimliği henüz yok. securityHash formülü için doküman kendi içinde çelişkili (bkz. Tami); iade/iptal aynı uca gidiyor, ön provizyon kapama ucu tahmin
Diğer banka driver'ları Dokümana göre Banka entegrasyon dokümanları

iyzico'da tam olarak ne doğrulandı

2026-08-09'da iyzico sandbox'ında, örnek projeden, tarayıcıyla tamamlanan bir 3D Secure satış (100,00 TL, tek çekim, resmî test kartı) şunları kanıtladı:

Aynı oturumda şu işlemler de sandbox'a karşı çalıştırıldı:

İşlem Sonuç
Durum sorgusu paid, 100,00 TL, maskeli kart — sipariş numarasıyla
Durum sorgusu (bulunamayan kayıt) found: false / unknown — sessizce "ödendi" demiyor
BIN sorgusu Akbank · master_card · debit
Taksit sorgusu Debit kartta tek seçenek, kredi kartta 1/2/3/6/9/12 — taksit kart tipine ve işyeri anlaşmasına bağlı
İade (tutarsız) Kusur bulundu ve düzeltildi: price gönderilmiyordu, iyzico 5004 ile reddediyordu
İade (düzeltme sonrası) Başarılı — iade yanıt imzası da doğrulandı; iyzico işlemi transactionType: CANCEL olarak kaydetti

Bunlar doğrulanmadı: diğer ödeme modelleri (3d_pay, 3d_host, regular) ve canlı ortam. Sandbox'ta çalışan bir akış canlıda da çalışır diye bir garanti yoktur; üye işyeri tanımınız farklı olabilir.

iyzico'nun ayrı bir iptal işlemi yoktur — bu yüzden driver SupportsCancellation arayüzünü uygulamaz. Aynı gün yapılan tam iadeyi iyzico kendisi iptal olarak işler; yukarıdaki testte yanıt transactionType: CANCEL döndü. Yani iptal etmek için refund() çağırmanız yeterli.


İçindekiler Kurulum · Doğrulama durumu · Örnek proje · Desteklenen bankalar · Nasıl çalışır · Yapılandırma · Ödeme akışı · İade ve iptal · Ödeme modelleri · Yetenekler · Tutarlar · Bankaların tuhaflıkları · Hata yönetimi · Event'ler · Loglama · Test ortamı · Test kartları · Güvenlik · Yeni banka eklemek · Yol haritası

Kurulum

PHP 8.2+, Laravel 12 veya 13. Auto-discovery açıktır, ek adım yoktur.

Laravel 13 en az PHP 8.3 ister; PHP 8.2 kullanıyorsanız Laravel 12'de kalırsınız. CI her iki kombinasyonu da koşar.

Uçtan uca kurulmuş bir Laravel projesi görmek isterseniz anadolupay-laravel deposu ödeme başlatma, 3D dönüşü ve iade akışlarını örnekliyor.

Desteklenen bankalar

Türkiye'deki sanal POS'lar birkaç ortak altyapı ailesine iner. Aynı aileyi kullanan bankalar aynı driver'ı paylaşır; aralarındaki fark yalnızca uç nokta ve kimlik bilgisidir.

Aynı banka birden fazla satırda görünebilir. Bir bankanın iki farklı sanal POS ürünü varsa her biri ayrı bir driver'dır: ayrı protokol, ayrı kod, ayrı doğrulama durumu. Birinin ölçülmüş olması diğeri hakkında hiçbir şey söylemez. Bankanın adının yanındaki parantez hangisi olduğunu belirtir — örneğin akbank (NestPay) ile akbank-pos (yeni JSON API) akraba bile değildir. Ayrıca akbank-pos aşağıdaki ödeme kuruluşları tablosunda yer alır. Hangisinin size tanımlandığını sanal POS sözleşmenizden teyit edin.

Tablodaki Test sütunu, o driver'ın sağlayıcının kendi ortamına karşı koşulup koşulmadığını söyler — geri kalan sütunlar yalnızca protokolün uygulandığını gösterir, çalıştığını değil:

İşaret Anlamı
Sağlayıcının sandbox'ında uçtan uca gerçek bir ödeme tamamlandı
Kısmen ölçüldü — bazı akışlar doğrulandı, hepsi değil
Henüz ölçülmedi; yalnızca dokümana göre uygulandı
⏳ ortak driver Driver aynı altyapıyı paylaşan başka bir bankanın test ortamında uçtan uca doğrulandı (NestPay ailesi Ziraat'te, PayFlex VakıfBank'ta, PayFor QNB'de). Kod yolu ortaktır, fark yalnızca uç nokta ve kimlik bilgisidir — yine de bu bankanın kendi terminaline karşı ölçülmemiştir
⏳ IP kısıtlı Ölçüm banka tarafında IP tanımlaması yapılmadan koşulamıyor
Driver Banka Altyapı Test 3D 3D Pay 3D Host Non-secure İade İptal
akbank Akbank (NestPay) Asseco / Payten
isbank İş Bankası Asseco / Payten
ziraat Ziraat Bankası (NestPay) Asseco / Payten
halkbank Halkbank Asseco / Payten ⏳ ortak driver
qnb QNB Finansbank (NestPay) Asseco / Payten ◐ 3D geçti, provizyona yetkisiz
teb TEB Asseco / Payten ⏳ ortak driver
sekerbank Şekerbank Asseco / Payten ⏳ ortak driver
ing ING Asseco / Payten ⏳ ortak driver
alternatifbank Alternatif Bank Asseco / Payten ⏳ ortak driver
turkiyefinans Türkiye Finans Asseco / Payten
garanti Garanti BBVA GVPS
yapikredi Yapı Kredi PosNet (XML)
albaraka Albaraka Türk PosNet V1 (JSON)
vakifbank VakıfBank PayFlex V4
ziraat-payflex Ziraat Bankası (PayFlex) PayFlex V4
denizbank DenizBank InterPos ⏳ IP kısıtlı
qnb-payfor QNB Finansbank / Enpara (PayFor) PayFor
ziraat-katilim Ziraat Katılım PayFor ⏳ ortak driver
kuveytturk Kuveyt Türk BOA / TDV2.0
vakif-katilim Vakıf Katılım BOA

Ödeme kuruluşları:

Driver Kuruluş Test 3D 3D Pay 3D Host Non-secure İade İptal
akbank-pos Akbank (yeni JSON API)
paytr PayTR
param Param ⚠️ TMSF kayyımlığında, altyapı fiilen kapalı
tosla Tosla (AkÖde)
craftgate Craftgate
moka Moka United
paratika Paratika (Payten)
paycell Paycell (Turkcell)
iyzico iyzico
fake geliştirme için sahte driver

Aynı bankanın iki driver'ı varsa ikisi de gerçektir; hangisinin tanımlandığını sanal POS sözleşmenizden teyit edin:

Nasıl çalışır

Bankalar arasındaki fark yüzeyde protokol (XML / JSON / SOAP / form), derinde imza algoritmasıdır. Paket bu iki katmanı ayırır:

Bir driver yalnızca yedi metodu doldurur: build3dFormFields(), checkCallbackHash(), is3dAuthSuccess(), provision(), mapCallbackResponse(), mapProvisionResponse(), extractOrderId().

Akış kontrolü, hata yönetimi, HTTP ve loglama temel sınıfta tek yerde durur. Bir bankada düzeltilen akış hatası hepsinde düzelir; bu, on yedi kopyanın ayrı ayrı bakımını yapmaktan farkı.

Dönen PaymentResponse ve VerificationResponse bankadan bağımsızdır: hangi driver'ı kullanırsanız kullanın success, paymentId ve status aynı anlama gelir. Bankanın ham yanıtı raw içinde korunur — normalleştirme bilgi kaybı yaratmaz.

Yapılandırma

Yalnızca kullandığınız bankanın değişkenlerini doldurun. Diğer preset'ler boş kalabilir; yalnızca çağrıldıklarında hata verirler.

Aynı kavramın bankalarda farklı adları var:

Config Bankadaki karşılığı
merchant_id ClientId · MerchantId · ShopCode · merchantSafeId
terminal_id TerminalId · TerminalNo · terminalSafeId
username Name · UserCode · ProvUserID
password API şifresi
secret_key store key · hash key · GUID (3D anahtarı)

Tüm anahtarlar için yayınladığınız config/anadolupay.php dosyasına bakın.

Sipariş numarası

Sipariş numarasını kendiniz veriyorsanız hiçbir şey değişmez. Vermek istemiyorsanız orderId'yi boş geçin; paket ön eki yapılandırmadan alıp numarayı üretir:

Numara A-Z0-9 ile sınırlıdır ve rastgeledir; sayaç tutulmaz. Sebebi: sipariş numarası bankada kalıcı bir anahtardır — aynı numara ikinci kez gönderilirse işlem reddedilir ve numara iade/sorgulamada da kullanıldığı için sonradan değiştirilemez. Sayaç bunun için kalıcı depolama ve kilit gerektirir.

İki sınırı bilerek seçin:

Ödeme akışı

Türk banka sanal POS'larında 3D Secure bir GET yönlendirmesi değil, bankanın 3D geçidine yapılan bir form POST'udur. Akış üç adımdır:

1 · Ödemeyi başlat

toHtmlForm() otomatik gönderilen bir sayfa üretir. Formu kendiniz render etmek isterseniz:

Kuveyt Türk, Vakıf Katılım ve Param form alanı yerine hazır bir HTML sayfası döner; bu durumda formFields boştur ve içerik $response->htmlContent içindedir. toHtmlForm() iki durumu da doğru ele alır — elle uğraşmak yerine onu kullanın.

2 · Dönüşü doğrula

verify() sırayla: dönüş hash'ini doğrular (eşleşmezse InvalidSignatureException), 3D doğrulama durumunu kontrol eder, klasik 3D Secure modelinde bankaya provizyon isteğini gönderir. 3D Pay ve 3D Host'ta provizyon banka tarafında tamamlandığı için ikinci istek atılmaz.

PayFlex (VakıfBank / Ziraat) sipariş bağlamı ister. Banka provizyon adımında kart bilgisini ve tutarı yeniden sorar ama bunları dönüşte göndermez — siz sağlarsınız:

İade ve iptal

Gün sonu kapanmadan önce iade değil iptal kullanın — daha hızlı ve komisyonsuzdur:

Bazı bankalar işlemi sipariş numarasıyla değil, kendi referanslarıyla eşler. Bu referansı ödeme sırasında saklayıp metadata ile geçin:

Banka Gereken alan Nereden gelir
Garanti ref_ret_num provizyon yanıtı Transaction.RetrefNum
Yapı Kredi host_ref_num provizyon yanıtı hostlogkey
PayFlex transaction_id provizyon yanıtı TransactionId
Vakıf Katılım remote_order_id provizyon yanıtı OrderId

cancel() ve status() şu an PaymentGatewayInterface'de değil, driver'lara özel metotlardır. Yani statik tip güvenliği yoktur; desteklemeyen bir driver'da çağırırsanız runtime'da patlar. Hangi driver'ın hangisini desteklediği tabloda yazıyor.

Ödeme modelleri

Sabit Ne yapar Ne zaman
MODEL_3D_SECURE Doğrulama sonrası ayrı provizyon isteği Varsayılan; en yaygın
MODEL_3D_PAY Doğrulama ve provizyon tek adımda bankada Daha az round-trip isteyen kurulumlar
MODEL_3D_HOST Kart formu da bankada toplanır Kart verisi sunucunuza hiç uğramaz — PCI kapsamını daraltır
MODEL_NON_SECURE 3D yok, doğrudan provizyon Mail order / abonelik

3D Host modelinde card vermeniz gerekmez.

Yetenekler

Her banka her işlemi sunmaz. Bu bir eksiklik değil, sağlayıcı sınırıdır: PayTR iptal (void) API'si sunmaz, Akbank'ın yeni API'si tekil durum sorgusu sunmaz, Kuveyt Türk ön provizyon sunmaz.

Paket bunu tip düzeyinde bildirir — desteklenmeyen bir metodu çağırmadan önce instanceof ile kontrol edin:

Driver Durum İptal Ön prov. Geçmiş BIN Taksit Tekrar
akbank, isbank, ziraat, halkbank, qnb, teb, sekerbank, ing, alternatifbank, turkiyefinans
garanti
yapikredi, albaraka
vakifbank, ziraat-payflex
denizbank
qnb-payfor, ziraat-katilim
kuveytturk
vakif-katilim
akbank-pos
paytr
param ⚠️
tosla
craftgate
moka
paratika
iyzico

Arayüzler: SupportsStatusQuery, SupportsCancellation, SupportsPreAuthorization, SupportsOrderHistory, SupportsBinQuery, SupportsInstallmentQuery, SupportsRecurringPayments.

Durum sorgusu

Zaman aşımı gibi belirsiz durumları kapatmanın tek yolu budur.

Bankaların birbirine benzemeyen durum kodları (A, 1, SUCCESS, Başarılı) tek bir sözlüğe indirgenir. Tanınmayan bir kod unknown döner — sessizce "başarılı" sayılmaz.

Ön provizyon isPaid() için false döndürür: tutar bloke edilmiştir ama tahsil edilmemiştir.

Ön provizyon

Bloke süresiz değildir; bankaya göre 1-30 gün içinde kapatılmazsa düşer.

Taksit ve BIN

BIN sorgusuna kart numarasının tamamını göndermeyin; ilk 6-8 hane yeter.

Tekrarlayan ödeme

Plan ilk ödemeyle birlikte bankaya bildirilir; sonraki çekimleri banka kendisi başlatır.

Desteklenen frekanslar bankaya göre değişir — Garanti yıllık, PayFlex haftalık tekrar sunmaz. supportedRecurringFrequencies() ile sorgulayın; desteklenmeyen bir frekans PaymentFailedException fırlatır.

Tutarlar

Tutarlar paket içinde her zaman kuruş cinsinden tam sayı olarak taşınır. 0.1 + 0.2 !== 0.3 olduğu için float ile hesaplanan bir tutar imzaya giren dizgiyi bir kuruş kaydırabilir ve banka işlemi reddeder.

float vermek çalışmaya devam eder — iki ondalık haneye yuvarlanıp kuruşa çevrilir. Tutarı zaten kuruş olarak tutuyorsanız (veritabanında int kolon gibi) Money::fromMinorUnits() kesinlik kaybı olmayan tek yoldur.

Driver'lar tutara yalnızca $data->money() üzerinden erişir ve bankanın istediği biçime orada çevirir:

Örnek (199,90 TL) Kullanan
toMinorUnitsString() "19990" Garanti, PosNet, Kuveyt Türk, Tosla
toDecimalString() "199.90" Akbank POS, PayFlex, iyzico
toNaturalString() "199.9" NestPay, PayFor, InterPos

Bankaların tuhaflıkları

Driver'lar bunları sizin için hallediyor. Burada olmalarının sebebi, bir şey ters gittiğinde nereye bakacağınızı bilmeniz.

Tutar formatı üç farklı. Garanti, PosNet, Kuveyt Türk ve Tosla kuruş cinsinden tam sayı ister (199.9019990). NestPay ve PayFor PHP'nin doğal float gösterimini ister (199.9"199.9", 100.0"100"). Akbank POS ve PayFlex iki ondalıklı dizgi ister ("199.90"). Hash tam olarak gönderilen dizgi üzerinden hesaplandığı için bu formatlar değiştirilemez.

Taksit alanı tek çekimde bile dört farklı. NestPay boş dizgi, PosNet '00', PayFor ve Kuveyt Türk '0', Param '1' bekler. PayFlex alanı hiç göndermez.

Para birimi kodu her yerde ISO 4217 sayısal değil. Kuveyt Türk dört haneli kullanır (0949), PosNet V1 harf kısaltması (TL, US, EU).

PayFor aynı gün içindeki işlemi iade ettirmez. Gün sonu kapanmadan Refund denenirse banka V014 ("Bu işlem geri alınamaz, lütfen asıl işlemi iptal edin.") döndürür; aynı gün için cancel() kullanın. Kart hamiline para iadesi açısından ikisi aynı sonucu verir, sadece muhasebe kaydı farklıdır.

PayFlex'te enrollment adımı diğer uçlardan ayrışır. Provizyon ve sorgu istekleri prmstr alanında URL-kodlanmış XML ister; enrollment ise düz form alanı bekler. XML gönderilirse banka alanları hiç okumadan yanıltıcı bir 2030 Invalid expire date döndürür. Son kullanma tarihi de iki biçimdedir: enrollment YYMM, provizyon YYYYMM.

PayFlex 3D'de PaReq her zaman klasik bir 3DS bloğu değildir. BKM "GO Güvenli Öde" kurulumunda base64'ü, kendi kendini gönderen bir HTML sayfasıdır ve doğrulama sayfası ACSUrl'de değil o sayfanın form hedefindedir; ACSUrl'e POST edilirse banka "400 Hatalı İstek" sayfası verir. Driver bunu ayırt eder.

PayFlex 3D provizyonu kart bilgisi istemez. Banka işlemi MpiTransactionId üzerinden bulur; bazı kurulumlar kart gönderilmesini 1127 ile reddeder. Bu yüzden verify() çağrısında order['card'] isteğe bağlıdır — vermezseniz kart alanları hiç gönderilmez ve PAN'ı istekler arasında saklamanız gerekmez.

PayFlex durum sorgusu tek bir durum alanı döndürmez. IsCanceled, IsReversed, IsRefunded, TotalRefundAmount ve IsCaptured bayraklarından türetilir. Kısmî iade edilmiş bir işlem paid kalır; refunded yalnızca tamamı iade edildiğinde döner.

Garanti iade için ayrı kullanıcı ister. refund ve void işlemlerinde securityData normal şifreyle değil iade şifresiyle hesaplanır. İki ayrı kullanıcı tanımlamazsanız iadeler reddedilir.

PosNet üç sunucu isteği yapar. Önce oosRequestData ile veri paketleri alınır, sonra 3D geçidine POST edilir, dönüşte oosResolveMerchantData ile çözülüp oosTranData ile provizyon tamamlanır. Sipariş numarası 20 haneye sıfırla doldurulur; iade/iptalde 24 hane olur ve 3D siparişler TDSC ön eki alır.

Ziraat Katılım'ın dönüş hash'i banka tarafında tutarsız üretiliyor. Bu yüzden o preset'te verify_hash varsayılan olarak kapalıdır. Bankanız düzelttiyse ZIRAAT_KATILIM_VERIFY_HASH=true yapın.

PayTR ve Moka bildirimi OK yanıtı bekler. Webhook'unuz gövdede düz metin OK döndürmezse bildirim tekrar tekrar gönderilir (Moka iki kez daha dener).

Paratika iki hash alanı döndürür ve biri kullanımdan kalkmıştır. SD_SHA512 örnek yanıtlarda önce görünür ama dokümanda "Do not use!" işaretlidir; doğrusu sdSha512dir. Ayrıca durum sorgusu bir sipariş için tüm işlemleri döndürür; sadece satış kaydına bakarsanız iade edilmiş sipariş "ödendi" görünür.

Tosla zaman damgasını Türkiye saatinde ister. timeSpan GMT+3'te ve en fazla 1 saat farkla kabul edilir. UTC'de çalışan bir uygulamada damga üç saat geride kalır ve her istek 998 Validasyon Hatası alır — mesaj sebebi söylemez. Paket damgayı Europe/Istanbul üretir.

Moka'da üç ayrı kimlik vardır ve birbirinin yerine geçmezler:

Alan Nedir Nerede kullanılır
OtherTrxCode Sizin sipariş numaranız durum sorgusu, iptal, iade
VirtualPosOrderId / trxCode Moka'nın işlem kodu (3D dönüşünde gelir) iptal, iade
DealerPaymentId Moka'nın sayısal ödeme kaydı yalnızca detay sorgusu

Paket verdiğiniz değeri sipariş numaranız sayar; Moka'nın kendi kodunu kullanacaksanız metadata['virtual_pos_order_id'] ile bildirin. Biçime bakarak tahmin edilmez: kod dokümanda ORDER-… görünse de gerçek bir bayide Test-df91b14d-… biçiminde geldi.

Durum sorgusundan dönen paymentId DealerPaymentId'dir; onu iptal veya iadeye verirseniz PaymentNotFound alırsınız.

Moka'da durum sorgusu ödeme numarasını değil sipariş numaranızı ister. GetDealerPaymentTrxDetailList ucu OtherTrxCode (sizin sipariş numaranız) ya da PaymentId (Moka'nın sayısal kaydı) kabul eder. Dönüşteki trxCode bunların hiçbiri değildir — iptal ve iade için kullanılır.

Moka'da her banka her bayide tanımlı değildir. Sanal POS'u tanımlanmamış bir bankanın kartıyla ödeme başlatırsanız VirtualPosNotAvailable alırsınız. Hata kartın bankasıyla ilgilidir — tutar veya taksit değiştirmek çözmez.

Moka'da BIN sorgusu farklı bir sarmalayıcı ister. Diğer servisler PaymentDealerRequest, BIN sorgusu BankCardInformationRequest bekler. Paket bunu kendisi ayırır; kendi isteğinizi yazıyorsanız dikkat edin.

Moka başarıyı ayrı bir alanda söylemez. 3D dönüşündeki resultCode başarılı işlemlerde boş gelir; sonuç hashValue içindedir. Ödeme başlatılırken dönen CodeForHash saklanmazsa dönüş yorumlanamaz.

Param IP kısıtı uygular ve eski test adresi kapandı. posws ve testposws sunucuları whitelist dışındaki adreslerden gelen isteği WAF seviyesinde 403 ile reddeder — yani kimlik bilgileriniz doğru olsa bile sunucunuzun IP'si Param'a bildirilmeden hiçbir çağrı geçmez. Ayrıca çok sayıda kaynakta geçen test-dmz.param.com.tr adresi artık 404 dönüyor; güncel test adresi testposws.param.com.tr'dir.

⚠️ Param'ın (Türk Elektronik Para A.Ş.) altyapısı fiilen kapalı — IP kısıtı bunun bir sonucu, sebebi değil. TCMB 2026-04-30'da Param'ın ödeme hizmetleri ve e-para ihraç yetkisini geçici olarak durdurdu; 2026-05-04'te mahkeme yürütmeyi durdurunca şirket kesintisiz çalışmaya devam etti, ama 2026-07-13'te mahkeme bu kararı geri çekti ve TMSF, İstanbul Cumhuriyet Başsavcılığı soruşturması kapsamında Param ve grup şirketlerine kayyum olarak atandı. 2026-08-05 tarihli basın duyurusunda TMSF, ParamPOS üye işyeri alacaklarının 100.000 TL'ye kadarının ödeneceğini açıkladı — yani POS hizmeti normal işlemiyor, tasfiye/iade süreci işliyor. Bu durumdayken param driver'ını yeniden doğrulamaya çalışmak (yeni IP bildirmek, test üye işyeri istemek) anlamsız: muhatap kurumun kendisi kayyım denetiminde. Kod repoda kalıyor ama aktif olarak sürdürülmüyor.

Craftgate iki ayrı anahtar kullanır. API istekleri Secret Key ile, 3D dönüşü panelde ayrıca üretilen 3D Secure Callback Key ile imzalanır. İkisini karıştırmak "imza geçersiz" hatası verir. Webhook'ların üçüncü bir anahtarı vardır (Merchant Hook Key).

Craftgate'te ödeme formu POST edilmez. 3ds-init ucu hazır bir HTML sayfası döner; PaymentResponse::$htmlContent içinde gelir ve doğrudan tarayıcıya basılır. Ayrıca kısmi iade ödeme değil işlem bazındadır: metadata['payment_transaction_id'] vermezseniz paket sessizce tam iade yapmak yerine hata verir.

Taşıma hatalarında iki ayrı soru vardır. safeToRetry isteğin bankaya ulaşmadığından emin miyiz, outcomeUncertain ise işlemin gerçekleşmiş olma ihtimali var mı demektir. Banka isteği okumadan reddettiyse (4xx) sonuç kesindir — hiçbir şey olmamıştır; zaman aşımı ve 5xx'te ise durum sorgusuyla teyit gerekir.

Kuveyt Türk'te sorgu ve iade ayrı bir SOAP servisindedir. Ödeme ve provizyon XML uçlarına giderken durum sorgusu, iade ve iptal VirtualPosService.svc/Basic adresine gider. Bu uç JSON gövdeyi 415 ile reddeder ve paketin bu bölümü henüz doğrulanmamıştır. Ayrıca query_api tanımlanmazsa varsayılan canlı adrestir — test terminaliyle çalışırken mutlaka test adresini verin.

NestPay sorgu yanıtında tutarlar kuruş cinsindendir. Birleşik ORDERSTATUS alanındaki ORIG_TRANS_AMT ve CAPTURE_AMT kuruştur; ondalık sanılırsa tutar yüz katı raporlanır. Paket bunu ayırır.

NestPay dönüşünde boş alanlar null olmamalı. Banka boş alanları hash'e boş dizgi olarak katar. Laravel'in varsayılan ConvertEmptyStringsToNull middleware'i bunları null yapar; paket null'ı boş dizgi sayarak bunu telafi eder. Dönüş yükünü kendiniz işliyorsanız aynı kurala uyun, yoksa imza hiçbir zaman tutmaz.

Bankanın dönüş POST'u siteler arasıdır. SameSite=lax çerezi bu istekte gönderilmez; dönüşte oturum boş gelir. Sipariş bağlamını oturumda değil, okUrlin sorgu dizgisinde taşıyın. Doğrulamaya yalnızca POST gövdesini verin — sorgu parametreleri bankanın imzasına dâhil değildir.

NestPay hash'i alanları sıralar. Alanlar doğal sırada (harf duyarsız) sıralanır, hash/encoding/nationalidno çıkarılır, sona secret key eklenir, | ve \ karakterleri kaçırılır. Forma yeni bir alan eklerseniz hash'e de girer — banka bunu bilmiyorsa işlem reddedilir.

Hata yönetimi ve yeniden deneme

Ödeme entegrasyonlarında en tehlikeli hata, belirsiz olandır. Banka "reddettim" derse ne yapacağınız bellidir; ama istek zaman aşımına uğradığında paranın çekilip çekilmediğini bilmezsiniz. Paket bu ikisini tip düzeyinde ayırır:

TransportException yakaladığınızda ödemeyi başarısız saymayın — durumu banka üzerinden sorgulayın veya müşteriye "işleminiz kontrol ediliyor" deyin.

Yeniden deneme

Retry yalnızca bankaya ulaşılamayan durumlarda yapılır: bağlantı reddedildi, DNS çözülemedi, TLS kurulamadı. Bu hatalarda isteğin bankaya varmadığı bilinir.

Zaman aşımı ve HTTP hataları tekrar denenmez. Her ikisinde de istek bankaya ulaşmış ve işlenmiş olabilir; körlemesine ikinci bir ödeme isteği göndermek çift çekim demektir. Bu davranış testle kilitlidir.

Varsayılan 0dır — yani retry kapalıdır. Açmadan önce sipariş durumunu kendi tarafınızda takip ettiğinizden emin olun.

Event'ler

Ödeme akışının dört noktasında event yayınlanır. Hiçbiri kart verisi taşımaz, çünkü dinleyicilerin çoğu bu veriyi loglar veya kuyruğa yazar.

Event Ne zaman Taşıdığı
PaymentInitiated müşteri bankaya yönlendirilmeden önce driver, orderId, Money, model, taksit
PaymentVerified dönüş doğrulanıp provizyon tamamlanınca driver, orderId, paymentId, success, status
PaymentFailed akış bir istisnayla kesilince driver, orderId, reason, exception
RefundIssued iade isteği gönderilince driver, paymentId, Money, refundId, success

PaymentVerified success: false ile de gelebilir — bu, doğrulama akışının hatasız tamamlandığı ama ödemenin alınmadığı anlamına gelir. PaymentFailed ise akışın kesildiği durumdur; istisna yutulmaz, event'ten sonra yukarı çıkar.

ANADOLUPAY_EVENTS=false ile kapatılabilir.

Mükerrer ödeme koruması

Aynı sipariş numarası için pencere içinde ikinci bir createPayment() çağrısı DuplicatePaymentException fırlatır. Asıl hedef kullanıcının "Öde" düğmesine iki kez basmasıdır.

Pencere bilinçli olarak kısadır (varsayılan 30 sn): ödeme gerçekten başarısız olduğunda müşterinin aynı sipariş numarasıyla tekrar denemesi meşrudur. Başlatma isteği hata alırsa kilit hemen bırakılır.

Kilit Cache::add() ile alınır — atomiktir, yani iki eşzamanlı istekten yalnızca biri geçer. Bunun çalışması için array dışında bir cache sürücüsü (redis, memcached, database) gerekir.

Bu bir kolaylıktır, kesin garanti değildir. Mükerrer çekime karşı asıl savunma, siparişin durumunu kendi veritabanınızda tutmak ve ödemesi alınmış siparişler için akışı hiç başlatmamaktır.

Loglama

Banka bir işlemi reddettiğinde size yalnızca bir kod döner (ProcReturnCode=99). Sorunun hangi alanda olduğunu ancak gönderdiğiniz gövdeyi görerek anlarsınız. Entegrasyon geliştirirken açın:

Maskeleme iki katmanlıdır. Birincisi alan adına göre (cvv, password, secret_key…). İkincisi değerin biçimine göre: Luhn kontrolünden geçen her 13–19 haneli sayı, alan adı ne olursa olsun maskelenir. İkinci katman olmadan, on altı driver'ın farklı adlandırdığı kart alanlarından birini gözden kaçırmak kart verisini loga düşürürdü.

Luhn kontrolü yanlış pozitifleri de eler — PosNet'in 20 haneye doldurulmuş sipariş numaraları ve NestPay'in MD taşıyan Number alanı okunabilir kalır.

Başarısız HTTP yanıtları warning, gerisi debug seviyesindedir.

Loglama varsayılan olarak kapalıdır. Maskeleme uygulansa bile bu kayıtların nereye yazıldığı bilinçli bir tercih olmalıdır: kalıcı bir kanal seçiyorsanız erişimini kısıtlayın ve saklama süresi tanımlayın.

iyzico

iyzico bankalardan iki noktada ayrılır ve paket ikisini de sizin yerinize halleder:

İmza Nerede İmzalanan
Authorization istek başlığı randomKey + uriPath + gövdeIYZWSv2 base64(apiKey:…&randomKey:…&signature:…)
Yanıt / callback gövdedeki signature uca göre değişen alanlar, : ayraçlı
Webhook X-IYZ-SIGNATURE-V3 başlığı secretKey + eventType + …, ayraçsız

Yanıt imzasında alan sırası uca göre sabittir; örneğin 3DS callback'i conversationData:conversationId:mdStatus:paymentId:status sırasını kullanır. Tutarlardaki sondaki sıfırlar imzadan önce atılır (10.5010.5).

İade /v2/payment/refund ucundan yapılır:

iyzico'da tutar zorunludur. Diğer driver'larda tutarı boş bırakmak "tamamını iade et" demektir; iyzico'da böyle bir uç yoktur ve tutarsız istek 5004 price gönderilmesi zorunludur ile reddedilir. Paket bu durumda ödemenin tutarını /payment/detail ucundan okuyup gönderir — yani tutarsız çağrı da çalışır, ama arka planda fazladan bir sorgu yapar.

Kısmi iade yapılmış bir ödemede okunan tutar kalan bakiyeden büyük olur ve iyzico işlemi reddeder. Bu bilinçli bir tercihtir: fazla iade etmektense hata vermek doğrudur. Öyle bir ödemede tutarı açıkça verin.

Ayrı bir iptal işlemi yoktur. Driver SupportsCancellation uygulamaz; çünkü iyzico aynı gün yapılan tam iadeyi kendisi iptal olarak işler — yanıtta transactionType: CANCEL döner. Gün içi iptal için refund() çağırın.

Paratika

Paratika, NestPay driver'larının arkasındaki Payten/Asseco'nun kendi ödeme kuruluşudur. İstek imzası kullanmaz; kimlik doğrulama her isteğe eklenen üç alandır. İmza yalnızca 3D dönüşünde vardır.

Akış her modelde bir oturum anahtarıyla başlar. Paket bunu sizin yerinize yapar; dört ödeme modeli dört farklı uca karşılık gelir:

Model Ne olur
3d_pay Tarayıcı post/sale3d/{token}a POST eder; Paratika hem 3D doğrulamayı hem satışı yapar
3d Tarayıcı post/auth3d/{token}a POST eder; yalnızca doğrulama yapılır, satış dönüşte tamamlanır
3d_host Müşteri Paratika'nın ödeme sayfasına yönlendirilir
regular Kart bilgisiyle doğrudan SALE

Dönüş imzasında iki alan gelir ve biri tuzaktır. Örnek yanıtlarda SD_SHA512 önce görünür ama dokümanda "Deprecated / Legacy — Do not use!" diye işaretlidir. Paket güncel olanı doğrular:

PARATIKA_SECRET_KEY, API şifresinden farklı bir değerdir.

Durum sorgusu bir liste döndürür. Paratika bir sipariş numarasına ait tüm işlemleri verir: satış, iade, iptal. İade edilmiş bir satışın kendi kaydı hâlâ AP (onaylı) görünür — tek kayda bakan entegrasyon iade edilmiş siparişi "ödendi" sanır. Paket listenin tamamını yorumlar: tam iade refunded, kısmi iade paid + refundedAmount, iptal cancelled.

İade tutarı verilirse Paratika bunu kendi tarafında PTREFUND olarak kaydeder; ayrı bir aksiyon göndermeniz gerekmez.

Moka United

Moka'nın kimlik doğrulaması bir istek imzası değil, sabit bir paroladır:

Her istekte aynı değer gider — yani gövdeyi korumaz. Bu paketin diğer driver'larındaki hash'lerden farkı budur.

Asıl dikkat edilmesi gereken yer 3D dönüşü. Moka ödemenin başarılı olup olmadığını ayrı bir alanda söylemez; dönüşteki resultCode başarılı işlemlerde boş gelir. Sonuç yalnızca hashValue içinde taşınır:

CodeForHash ödeme başlatılırken bir kez döner. Saklamazsanız dönüşü yorumlayamazsınız — bu yüzden paket sonucu tahmin etmeye çalışmaz, hata verir:

Dönüşte:

Hash ne T ne F varyantıyla eşleşiyorsa InvalidSignatureException atılır.

İptal ve iade ayrı uçlardır ve aynı şey değildir. Aynı gün saat 22.00'ye kadar cancel() (DoVoid) işlemi anında iptal eder. refund() (DoCreateRefundRequest) ise bir iade talebi oluşturur: yanıtta RefundRequestId döner, ödemenin durumu hemen değişmez ve RefAmount bir süre 0 kalır. Gerçek test servisinde ölçüldü — talep başarıyla kabul edildikten sonra sipariş hâlâ paid görünüyordu.

Yani refund() başarılı dönmesi "para geri gitti" demek değil, "talep alındı" demektir. Aynı gün geri ödeme istiyorsanız cancel() kullanın. İade tutarı verilmezse kalan tutarın tamamı talep edilir.

Referans olarak hem Moka'nın numarası hem sizinki kullanılabilir; paket ORDER- ile başlayan değerleri Moka'nın numarası (VirtualPosOrderId), diğerlerini kendi sipariş numaranız (OtherTrxCode) sayar.

Moka da PayTR gibi bildirimlere düz metin OK yanıtı bekler; paketin webhook rotası bunu kendisi döndürür.

Craftgate

Craftgate tek bir bankanın sanal POS'u değil, birden çok POS'u tek API arkasında toplayan bir orkestrasyon platformudur. Akış bu yüzden banka driver'larından ayrılır: müşteri bir banka geçidine form POST edilmez, 3ds-init ucu hazır bir HTML sayfası döner.

Üç ayrı anahtar kullanılır; hangisinin nerede kullanıldığını karıştırmak en sık yapılan hatadır:

Anahtar Nerede İmzalanan
Secret Key x-signature istek başlığı baseUrl + path + apiKey + secretKey + rndKey + gövdebase64(sha256(…))
3D Secure Callback Key 3D dönüşündeki hash alanı key###status###completeStatus###paymentId###conversationData###conversationId###callbackStatussha256 (onaltılık)
Merchant Hook Key webhook imzası eventType + eventTimestamp + status + payloadIdbase64(hmac-sha256(…))

Webhook imzasını driver doğrular:

Kısmi iade işlem bazındadır. Craftgate bir ödemeyi birden çok satıcı işlemine bölebildiği için hangi işlemin iade edileceğini paket kendi başına seçemez:

payment_transaction_id vermezseniz paket sessizce tam iade yapmaz, hata verir. Tam iade için tutarı hiç göndermeyin. Gün içi iptal ayrı bir uç değildir; Craftgate mutabakata girmemiş işlemi iade isteğinde kendisi void olarak geçer.

Tami

⚠️ Henüz gerçek bir sandbox'a karşı doğrulanmadı. Aşağıdaki üç nokta dokümantasyondan (dev.tami.com.tr) çıkarıldı ama test edilmedi — sandbox kimlik bilgisi elinize geçtiğinde ilk iş bunları doğrulamak olmalı.

Tami de Craftgate gibi bir orkestrasyon platformu; /payment/auth ucu 3D başlatmayı ve non-secure satışı birlikte karşılar, 3D doğrulaması banka callbackUrl'e POST ettiğinde ise para ayrı bir /payment/complete-3ds isteğiyle çekilir:

İki katmanlı kimlik doğrulama:

Anahtar Nerede Formül
secret_key PG-Auth-Token başlığı merchantNumber:terminalNumber:base64(sha256(merchantNumber+terminalNumber+secretKey))
username/password (JWK kid/k) Gövdedeki securityHash alanı HS512 ile imzalanmış JWT (JWS compact) — payload, securityHash alanı hariç gövdenin JSON'u

Bilinen sınırlar:

Test ortamı

Test kartları için ayrı bir belge var: TEST-KARTLARI.md — iyzico, Garanti, Akbank, PayTR, Craftgate, Moka ve Paratika'nın listeleri (hata senaryosu kartları dahil), diğer bankalar için kartı nereden alacağınız. Her bölümde hangi kartla ölçüm yaptığımız ve hangisinden kaçınmanız gerektiği yazılıdır.

Preset'lerdeki uç noktalar canlı ortamı gösterir. Test için ilgili *_PAYMENT_API / *_GATEWAY_3D değişkenlerini bankanızın test adresiyle değiştirin ve *_TEST_MODE=true yapın.

Garanti, çoğu bankanın aksine test üye işyeri bilgilerini geliştirici portalında açıkça yayınlar — bankadan ayrıca bir şey istemeniz gerekmez. Bu değerlerle çalıştığı 2026-08-11'de doğrulandı:

Ödeme ve iade iki ayrı kullanıcı ister (PROVAUT / PROVRFN); test ortamında ikisinin şifresi de aynıdır. Test yönetim paneli sanalpostest.garanti.com.tr adresinde: kullanıcı 99999999999, parola Destek.9, şifre 147852.

Bu terminalde iade ve iptal banka tarafından reddedilir (05 / RPC-05); ön provizyon da 14 verir. Driver'ın hatası değildir — istek biçiminin on dört ayrı çeşitlemesi (tam/kısmi tutar, OriginalRetrefNum ile ve olmadan, void/refund) aynı yanıtı verir, terminalde bu yetkiler tanımlı değildir.

Sahte driver

Gerçek istek atmadan akışı denemek için fake driver'ını kullanın. Gerçek driver'ların yetenek arayüzlerini uygular ve yaptığı işlemleri bellekte tutar — ödeyip sonra status() sorarsanız gerçekten paid döner, iade ederseniz refunded olur.

Varsayılan olarak her işlem başarılıdır; testlerin rastgele kırılmaması için sahte geçidin öngörülebilir olması gerekir. Hata yollarını denemek isterseniz:

Gerçek kartlarla denemek isterseniz TEST-KARTLARI.md.

Güvenlik

Güvenlik açığı bildirimi: [email protected]

Yeni banka eklemek

AbstractBankGateway sınıfını genişletin ve yedi metodu implement edin:

Sonra config/anadolupay.php içindeki banks dizisine bir preset ekleyin. Akış, hata yönetimi, HTTP ve loglama temel sınıftan gelir.

İmza için test yazın. Sabit girdilerle üretilmiş bir özet değerine kilitleyin — mevcut driver'ların hepsinde örneği var (tests/Bank/HashTest.php). İmza sessizce bozulabilen tek şeydir.

Yol haritası

Bilinen eksikler. Bir maddeye başlamadan önce issue açmanız çakışmayı önler.

Öncelikli

İşlem kapsamı

Doğrulama

Yeni bankalar

Çoğu mevcut NestPay driver'ını kullanır; yeni kod değil, preset ve doğrulanmış uç nokta gerekir.

Preset eklenmemiş olması o bankayla çalışamayacağınız anlamına gelmez: altyapısı bilinen bir bankanın uç noktalarını config/anadolupay.php içinde kendiniz tanımlayabilirsiniz — bkz. Yeni banka eklemek.

Yeni ödeme kuruluşları

Altyapı

Katkı

Detaylar için CONTRIBUTING, sürüm geçmişi için CHANGELOG.

Lisans

MIT — bkz. LICENSE.


All versions of anadolupay with dependencies

PHP Build Version
Package Version
Requires php Version ^8.2
illuminate/http Version ^12.0|^13.0
illuminate/support Version ^12.0|^13.0
psr/log Version ^2.0|^3.0
Composer command for our command line client (download client) This client runs in each environment. You don't need a specific PHP version etc. The first 20 API calls are free. Standard composer command

The package voxyfy/anadolupay contains the following files

Loading the files please wait ...