ankapix / sanalpos-entegrasyonlari
Türk bankaları ve ödeme kuruluşları için tek API'li PHP sanal POS / ödeme geçidi entegrasyon kütüphanesi (EST/NestPay, GVP, PosNet, İyzico, PayTR, Param ve daha fazlası).
Package info
gitlab.com/Ankapix/sanalpos-entegrasyonlari
pkg:composer/ankapix/sanalpos-entegrasyonlari
Requires
- php: >=7.4
- ext-curl: *
- ext-dom: *
- ext-json: *
- ext-openssl: *
- ext-simplexml: *
- guzzlehttp/guzzle: ^7.0
- symfony/http-foundation: ^5.0
- symfony/serializer: ^5.0
Requires (Dev)
- php-coveralls/php-coveralls: ^2.5
- phpunit/phpunit: ^8.5.8
README
Türk bankaları ve ödeme kuruluşları için tek API'li PHP sanal POS / ödeme geçidi entegrasyon kütüphanesi.
Onlarca bankanın birbirinden farklı protokollerini (XML, SOAP, HTML form-post, JSON/REST)
tek bir PHP arayüzünün arkasına gizler. Banka değiştirmek için yalnızca bank slug'ını
değiştirirsiniz — uygulama kodunuz aynı kalır.
mews/posprojesinden fork'lanmış,Ankapix\SanalPosnamespace'ine taşınmış ve Türkiye pazarındaki yeni banka/aggregatörlerle genişletilmiştir.
İçindekiler
- Özellikler
- Desteklenen Bankalar
- Gereksinimler
- Kurulum
- Hızlı Başlangıç
- 3D Secure Akışı
- Banka Bazında
accountAlanları - Taksit Sorgulama & Kart Tipi
- İade / İptal / Durum Sorgu
- Ödeme Modelleri
- Yanıt Şeması
- Yeni Banka / Ortam Ekleme
- Örnekler
- Katkı
- Lisans
Özellikler
- Tek API, çok banka —
regular,3d,3d_pay,3d_pay_hostingödeme modelleri. - Auth / PreAuth / PostAuth işlem tipleri (
pay/pre/post). - İade, iptal, durum sorgu, işlem geçmişi — banka destekliyorsa.
- Normalize edilmiş yanıt — her banka farklı dönse de yanıt aynı alan adlarıyla okunur.
- Tek dosyalık sürücü kayıt defteri (
config/sanalpos.php); yeni banka eklemek kod değil konfigürasyon işidir.
Desteklenen Bankalar
| Banka / Kuruluş | Slug | Sürücü |
|---|---|---|
| Akbank (EST) | akbank_est | EstPos |
| Akbank (yeni REST) | akbank | AkbankPos |
| Ziraat Bankası (EST) | ziraat_est | EstPos |
| ZiraatPay | ziraat | ZiraatPayPos |
| İş Bankası | isbank | EstPos |
| Halkbank | halkbank | EstPos |
| TEB | teb | EstPos |
| ING | ingbank | EstPos |
| HSBC | hsbc | EstPos |
| Anadolubank | anadolubank | EstPos |
| Şeker Bank | sekerbank | EstPos |
| Alternatif Bank | alternatifbank | EstPos |
| Türkiye Finans | turkiyefinans | EstPos |
| Garanti | garanti | GvpPos |
| Yapı Kredi | yapikredi | PosNet |
| Albaraka Türk | albarakaturk | AlbarakaPos |
| Vakıf Bank (VPos) | vakifbank | VPos724 |
| Vakıf Bank (Pay) | vakifbankpay | VakifBankPay |
| Denizbank | denizbank | InterVPos |
| Kuveyt Türk | kuveytturk | KuveytPos |
| QNB Finansbank | finansbank | PayForPos |
| QNB Pay | qnbpay | QnbPayPos |
| İyzico | iyzico | IyzicoPos |
| İPara | ipara | IParaPos |
| Moka | moka | MokaPos |
| PayTR | paytr | PayTrPos |
| PayU | payu | PayuPos |
| Param | parampos | ParamPos |
| Payfull | payfull | PayfullPos |
| Paynet | paynet | PaynetPos |
| Net Tahsilat | nettahsilat | NetTahsilatPos |
| Net Tahsilat Bayi | nettahsilatbayi | NetTahsilatBayiPos |
Tam liste ve uç nokta (endpoint) URL'leri için:
config/sanalpos.php.
Gereksinimler
- PHP 7.4 – 8.5 (çekirdek 7.2+ derlenir, ancak
module/altındaki bazı gömülü SDK'lar 7.4 ister; PHP 8.0–8.5'te test edilmiştir) - Eklentiler:
ext-curl,ext-dom,ext-json,ext-openssl,ext-SimpleXML
Kurulum
Paket Packagist'te değildir; GitLab deposundan VCS repository ile çekilir.
Projenizin composer.json dosyasına:
{
"repositories": [
{
"type": "vcs",
"url": "git@gitlab.com:Ankapix/sanalpos-entegrasyonlari.git"
}
],
"require": {
"ankapix/sanalpos-entegrasyonlari": "^1.0"
}
}
Ardından:
composer update ankapix/sanalpos-entegrasyonlari
Versiyon pinleme:
dev-masteryerine^1.0kullanın. Böylecemaster'a atılan her commit üretiminizi etkilemez; yalnızca yeni birv1.xetiketi yayınlandığında, kontrollü biçimde güncellersiniz.
Hızlı Başlangıç
regular (3D'siz, doğrudan) ödeme:
require 'vendor/autoload.php';
use Ankapix\SanalPos\Pos;
$account = [
'bank' => 'akbank', // sürücüyü seçen slug
'model' => 'regular',
'client_id' => 'XXXXXXX',
'username' => 'XXXXXXX',
'password' => 'XXXXXXX',
'env' => 'test', // 'test' | 'production'
];
$pos = new Pos($account);
$order = [
'id' => 'ORDER-' . time(),
'amount' => 320.00,
'installment' => 0,
'currency' => 'TRY', // TRY, USD, EUR, GBP ...
'ip' => $_SERVER['REMOTE_ADDR'],
'transaction' => 'pay', // pay=Auth, pre=PreAuth, post=PostAuth
];
$card = [
'number' => '4355084355084358',
'month' => '12',
'year' => '26',
'cvv' => '000',
];
try {
$pos = new Pos($account);
// prepare() ZORUNLU — order ve card'ı sürücüye yükler, payment() onları okur.
$pos->prepare($order, $card);
$payment = $pos->payment($card);
$response = $payment->response; // = $pos->bank->response
if ($pos->isSuccess()) {
echo "Onaylandı. Auth code: {$response->auth_code}";
} else {
echo "Başarısız ({$response->error_code}): {$response->error_message}";
}
} catch (\Ankapix\SanalPos\Exceptions\BankNotFoundException $e) {
// config/sanalpos.php'de tanımsız 'bank' slug'ı
} catch (\Ankapix\SanalPos\Exceptions\BankClassNullException $e) {
// slug var ama 'class' boş
} catch (\Exception $e) {
// ağ / banka / doğrulama hatası
}
3D Secure Akışı
3D ödemeler iki adımlıdır ve iki ayrı HTTP isteğinde gerçekleşir. success_url /
fail_url (bazı bankalarda return_url) banka geri dönüşünün vuracağı kendi callback
URL'nizdir — sipariş kimliğini (order.id) o URL'den geri okuyup ödemeyi orada doğrularsınız.
Adım 1 — 3D formu üret ve istemciye gönder. get3dForm(), otomatik submit olan
hazır HTML döndürür (form alanlarını siz kurmazsınız):
$account = [
'bank' => 'akbank_est',
'model' => '3d', // veya '3d_pay'
'client_id' => $musteriNo,
'username' => $kullaniciAdi,
'password' => $sifre,
'store_key' => $storeKey, // 3D modelinde zorunlu
'env' => 'production',
];
$order = [
'id' => $odemeNo, // kendi benzersiz ödeme kodunuz
'amount' => 320.00,
'installment' => $taksit, // 1 = tek çekim
'currency' => 'TRY',
'ip' => $request->getClientAddress(),
'success_url' => 'https://api.site.com/sanalpos/basarili/' . $odemeId,
'fail_url' => 'https://api.site.com/sanalpos/basarisiz/' . $odemeId,
'transaction' => 'pay',
'lang' => 'tr',
'rand' => microtime(),
];
$pos = new Pos($account);
$pos->prepare($order, $card);
$html = $pos->get3dForm(); // <form ... auto-submit> HTML'i
// Bu HTML'i tarayıcıya basın (ör. iframe / sayfa) — kullanıcı bankanın 3D sayfasına gider.
Adım 2 — Banka success_url'inize POST'lar; ödemeyi orada doğrulayıp tahsil edin.
Aynı account ile (karta gerek yok) siparişi yeniden kurup payment() çağırırsınız:
// success_url callback'i — order.id'yi kendi kaydınızdan geri yüklediniz
$pos = new Pos($account); // adım 1'deki ile aynı account
$pos->prepare($order); // kart YOK; banka POST'u $_POST'tan okunur
$payment = $pos->payment(); // banka dönüşünü doğrular + tahsil eder
$response = $payment->response;
if ($pos->isSuccess()) {
// ödemeyi onaylandı olarak işaretle
} else {
// $response->error_code / $response->error_message
}
model3dmi3d_paymı olacağı bankaya göre değişir; uygulamanızda bir bayrakla seçebilirsiniz (B4B'deis3dPayayarına göre'3d_pay' : '3d').
Banka Bazında account Alanları
Her sürücü farklı kimlik alanları bekler. Aşağıdaki tablo, üç ortak alanın
(bank, model, env) üzerine eklenmesi gerekenleri ve siparişe eklenen
sürücüye özgü order alanlarını listeler (gerçek kullanım: B4B SanalposController).
| Slug | Sürücü | Ek account alanları | Sürücüye özgü order alanları |
|---|---|---|---|
akbank_est, isbank, ziraat_est, halkbank, teb, ingbank, hsbc, anadolubank, sekerbank, alternatifbank, turkiyefinans | EstPos | client_id, username, password, store_key | success_url, fail_url, rand, lang |
garanti | GvpPos | client_id, terminal_id, username, password, store_key | success_url, fail_url |
finansbank | PayForPos | mbr_id, merchant_id, store_key, username, password | success_url, fail_url, rand, lang |
vakifbank | VPos724 | merchant_id, terminal_id, password | success_url, fail_url, rand |
kuveytturk | KuveytPos | merchant_id, client_id, username, password | success_url, fail_url, rand |
denizbank | InterVPos | shop_code, store_key, username, password | success_url, fail_url, rand, lang |
yapikredi, albarakaturk | PosNet / AlbarakaPos | posnet_id, merchant_id, terminal_id, store_key, promotion_code | success_url, fail_url, rand |
akbank | AkbankPos (REST) | merchant_id, terminal_id, secret_key | success_url, fail_url |
parampos | ParamPos | client_code, username, password, secret_key | success_url, fail_url |
iyzico | IyzicoPos | api_key, secret_key | success_url, surname, city, country, commission, order_list |
ipara | IParaPos | public_key, private_key | success_url, order_list |
moka | MokaPos | dealer_code, username, password | success_url, fail_url, order_list |
paytr | PayTrPos | merchant_id, merchant_key, merchant_salt | success_url, fail_url, rand, lang, order_list |
paynet | PaynetPos | secret_key, is_commission, is_slip_post, is_installment, ratio_code, agent_id | return_url, amount (kuruş, ×100) |
qnbpay | QnbPayPos | merchant_key, merchant_id, api_key, api_sec, vade_fark | success_url, fail_url, order_list |
ziraat | ZiraatPayPos | merchant_id, username, password | customerId, return_url, order_list |
vakifbankpay | VakifBankPay | merchant_id, username, password | customerId, return_url, order_list |
nettahsilat | NetTahsilatPos | merchant_id, api_url, api_vendor_url, username, password, payment_set_id, payment_bank_id, customer[] | formCode, return_url |
nettahsilatbayi | NetTahsilatBayiPos | merchant_id, api_url, username, password, payment_bank_id | return_url |
Bazı sağlayıcılar (Paynet, İyzico) tutarı kuruş bazında bekler — örnekte
amount * 100.order_listher sağlayıcıda farklı şekildedir (İyzico:code/title/category/amount, Moka/İpara:Code/Title/Quantity/Price, ZiraatPay/VakıfPay:productCode/name/amount/quantity...).
Taksit Sorgulama & Kart Tipi
Kart BIN'i (ilk 6 hane) ile taksit oranlarını sorgulamak için getInstallmentList():
$pos = new Pos($account);
// Kart tipi (örn. PayTR'de taksit tablosunu seçmek için)
$pos->setCard(['number' => $bin6]);
$kartTipi = $pos->getCardType();
// Taksit oranları — yanıt şekli sağlayıcıya göre değişir
$liste = $pos->getInstallmentList(['number' => $bin6, 'amount' => $tutar]);
foreach ($liste->response->data as $oran) {
// $oran->instalment / installments_number / getInstallmentNumber() ...
}
getInstallmentList()yanıtı sağlayıcıya göre farklıdır (Paynet, İPara, İyzico, PayTR, QNB Pay, Net Tahsilat). Uygulamanızda sağlayıcıya göre dallanın (B4B'dekitaksitActionbunun tam örneğidir).
İade / İptal / Durum Sorgu
Bu işlemler sürücü üzerinden çağrılır ($pos->bank->...):
// İade
$pos->bank->refund(['order_id' => '...', 'amount' => '100']);
// İptal
$pos->bank->cancel(['order_id' => '...']);
// Durum sorgu
$pos->bank->status(['order_id' => '...']);
// İşlem geçmişi (destekleyen bankalarda)
$pos->bank->history(['order_id' => '...']);
$response = $pos->bank->response; // her durumda normalize yanıt buradadır
Desteklenen alanlar bankaya göre değişir; ayrıntı için ilgili sürücüyü ve
examples/<banka>/regular/{refund,cancel,status,history}.phpdosyalarını inceleyin.
Ödeme Modelleri
$account['model'] ile belirlenir:
| Model | Açıklama |
|---|---|
regular | 3D'siz doğrudan çekim. |
3d | Tam 3D Secure (form → banka doğrulama → tahsilat). |
3d_pay | 3D doğrulama ve tahsilat tek adımda. |
3d_pay_hosting | Banka tarafında barındırılan 3D ödeme sayfası. |
$order['transaction']: pay (Auth), pre (PreAuth), post (PostAuth).
Para birimi $order['currency'] ISO kodu olarak verilir (TRY, USD, ...);
kütüphane ISO 4217 numeriğe (949, 840, ...) çevirir. TL, TRY ile eşdeğerdir.
Yanıt Şeması
Hangi banka olursa olsun yanıt $pos->bank->response üzerinde aynı alan adlarıyla okunur:
| Alan | Açıklama |
|---|---|
status | approved / hata durumu |
code / proc_return_code | Banka işlem kodu |
auth_code | Otorizasyon kodu |
host_ref_num | Banka referans numarası |
order_id | Sipariş kimliği |
trans_id | İşlem kimliği |
error_code / error_message | Hata bilgisi |
md_status / transaction_security / hash | 3D'ye özgü alanlar |
all / extra | Ham banka yanıtı (passthrough) |
isSuccess() / isError() yardımcıları işlem sonucunu döner.
Yeni Banka / Ortam Ekleme
Yeni banka eklemek kod değil konfigürasyon işidir. config/sanalpos.php
içine bir banks girdisi eklenir:
'yeni_banka' => [
'name' => 'Yeni Banka',
'class' => Ankapix\SanalPos\EstPos::class, // protokolü taşıyan sürücü
'urls' => [
'production' => 'https://.../api',
'test' => 'https://.../api',
'gateway' => [ // 3D form post hedefi
'production' => 'https://.../3Dgate',
'test' => 'https://.../3Dgate',
],
],
],
Banka mevcut bir platformu (EST/NestPay, GVP, PosNet ...) kullanıyorsa hazır sürücüyü
yeniden kullanın; tamamen yeni bir protokolse PosInterface'i uygulayan ve
PosHelpersTrait'i kullanan yeni bir sürücü yazın.
Örnekler
Çalışan örnekler examples/<banka>/<model>/ altındadır (her biri _config.php,
index.php, form.php/post.php, response.php 4'lüsü). Bir PHP sunucusunu
ilgili dizine yönlendirip _config.php içindeki $path değerini yerel URL'nize
göre ayarlayın.
⚠️ Bazı örnekler upstream fork'tan kalma
Mews\Posnamespace'i içerir; kopyalarkenAnkapix\SanalPosile değiştirin.
Katkı
Pull request ve issue'lar GitLab deposu üzerinden kabul edilir. Yeni banka sürücüsü eklerken mevcut sürücülerin normalize yanıt alan adlarını birebir takip edin ki çağıran kod banka-bağımsız kalsın.
Lisans
MIT lisansı altında yayınlanmıştır.