Stars: 210
Forks: 87
Pull Requests: 77
Issues: 78
Watchers: 16
Last Updated: 2023-09-09 21:21:29
Türk bankaları için sanal pos paketi (PHP)
License: Other
Languages: PHP
Bu paket ile amaçlanan; ortak bir arayüz sınıfı ile, tüm Türk banka sanal pos sistemlerinin kullanılabilmesidir.
EST POS (Asseco/Payten)
Desktekleyen bankalar: Akbank, TEB, İşbank, Şekerbank, Halkbank ve Finansbank
Desteklenen özellikler:
EST POS V3 EstPos altyapının daha güvenli (sha512) hash algoritmasıyla uygulaması.
Desktekleyen bankalar: Akbank, TEB, İşbank, Şekerbank, Halkbank ve Finansbank.
PayFlex MPI VPOS V4
Desktekleyen bankalar: Ziraat, Vakıfbank ve İşbank.
Desteklenen özellikler:
PayFlex Common Payment V4 (Ortak Ödeme)
Desktekleyen bankalar: Ziraat, Vakıfbank ve İşbank.
Desteklenen özellikler:
Garanti Virtual POS
Desteklenen özellikler:
PosNet
Desktekleyen bankalar: YapıKredi.
Desteklenen özellikler:
PosNetV1 (JSON API)
Desktekleyen bankalar: Albaraka Türk.
Desteklenen özellikler:
Finansbank PayFor (Enpara dahil)
Desteklenen özellikler:
InterPOS (Deniz bank)
Desteklenen özellikler:
Kuveyt POS
Desteklenen özellikler:
AbstractGateway::MODEL_NON_SECURE)AbstractGateway::MODEL_3D_SECURE)AbstractGateway::MODEL_3D_PAY)AbstractGateway::MODEL_3D_HOST)AbstractGateway::TX_STATUS)AbstractGateway::TX_HISTORY)AbstractGateway::TX_REFUND)AbstractGateway::TX_CANCEL)AccountFactory method'u kullanarak account degistirmek yeterli.AbstractGateway::MODEL_3D_PAY vs.). İşlem akışı aynı olduğu için kod değiştirmenize gerek kalmıyor.Son yapılan değişiklikler için CHANGELOG.
$ composer require mews/posKütüphane belli bir HTTP Client'ile zorunlu bağımlılığı yoktur. PSR-18 HTTP Client standarta uyan herhangi bir kütüphane kullanılabilinir. Projenizde zaten kurulu PSR-18 uygulaması varsa otomatik onu kullanır.
Veya hızlı başlangıç için:
$ composer require php-http/curl-client nyholm/psr7 mews/posDiğer PSR-18 uygulamasını sağlayan kütühaneler: https://packagist.org/providers/psr/http-client-implementation
Projenin root klasoründe bu satırı çalıştırmanız gerekiyor
$ ./vendor/bin/phpunitconfig.php (Ayar dosyası)
<?php
require './vendor/autoload.php';
// API kullanıcı bilgileri
// AccountFactory kullanılacak method Gateway'e göre değişir. Örnek kodlara bakınız.
$account = \Mews\Pos\Factory\AccountFactory::createEstPosAccount(
'akbank', //pos config'deki ayarın index name'i
'yourClientID',
'yourKullaniciAdi',
'yourSifre',
AbstractGateway::MODEL_3D_SECURE, //storetype
'yourStoreKey',
AbstractGateway::LANG_TR
);
// API kullanıcı hesabı ile paket bir değişkene aktarılıyor
try {
$pos = \Mews\Pos\Factory\PosFactory::createPosGateway($account);
//değere göre API URL'leri test veya production değerler kullanılır.
$pos->setTestMode(true);
} catch (\Mews\Pos\Exceptions\BankNotFoundException | \Mews\Pos\Exceptions\BankClassNullException $e) {
dd($e));
}form.php (kullanıcıdan kredi kart bilgileri alındıktan sonra çalışacak kod)
<?php
require 'config.php';
// Sipariş bilgileri
$order = [
'id' => 'BENZERSIZ-SIPERIS-ID',
'amount' => 1.01,
'currency' => 'TRY', //TRY|USD|EUR, optional. default: TRY
'installment' => 0, //0 ya da 1'den büyük değer, optional. default: 0
//MODEL_3D_SECURE, MODEL_3D_PAY, MODEL_3D_HOST odemeler icin zorunlu
//Success ve Fail URL'ler farklı olabilir ama kütüphane success ve fail için aynı kod çalıştırır.
'success_url' => 'https://example.com/response.php',
'fail_url' => 'https://example.com/response.php',
//gateway'e gore zorunlu olan degerler
'ip' => $ip, //EstPos, Garanti, KuveytPos, VakifBank
'email' => '[email protected]', // EstPos, Garanti, KuveytPos, VakifBank
'name' => 'John Doe', // EstPos, Garanti
'user_id' => 'Müşteri ID', // EstPos
'rand' => md5(uniqid(time())), // EstPos, Garanti, PayFor, InterPos, VakifBank. Rastegele değer.
//lang degeri verilmezse account (EstPosAccount) dili kullanılacak
'lang' => AbstractGateway::LANG_TR, //LANG_TR|LANG_EN. Kullanıcının yönlendirileceği banka gateway sayfasının ve gateway'den dönen mesajların dili.
];
$session->set('order', $order);
// Kredi kartı bilgieri
$card = \Mews\Pos\Factory\CreditCardFactory::create(
$pos,
'4444555566667777',
'25',
'12',
'123',
'john',
AbstractCreditCard::CARD_TYPE_VISA, //bankaya göre zorunlu
);
// API kullanıcısı ile oluşturulan $pos değişkenine prepare metoduyla sipariş bilgileri tanımlanıyor.
$pos->prepare($order, \Mews\Pos\Gateways\AbstractGateway::TX_PAY, $card);
try {
// $formData icerigi form olarak banka gateway'ne yonlendirilir.
// /examples/template/_redirect_form.php bakınız.
$formData = $pos->get3DFormData();
} catch (\Throwable $e) {
dd($e);
}response.php (gateway'den döndükten sonra çalışacak kod)
<?php
require 'config.php';
$order = $session->get('order');
$pos->prepare($order, \Mews\Pos\Gateways\AbstractGateway::TX_PAY);
// Ödeme tamamlanıyor,
// Ödeme modeli (3D Secure, 3D Pay, 3D Host, Non Secure) $account tarafında belirlenir.
// $card değeri Non Secure modelde ve Vakıfbank için 3DPay ve 3DSecure ödemede zorunlu.
try {
$pos->payment($card);
// Ödeme başarılı mı?
$pos->isSuccess();
// Sonuç çıktısı
dump($pos->getResponse());
// response içeriği için /examples/template/_payment_response.php dosyaya bakınız.
} catch (Mews\Pos\Exceptions\HashMismatchException $e) {
// todo
}Kendi projenizin dizinindeyken
$ cp ./vendor/mews/pos/config/pos.php ./pos_ayarlar.phpya da;
Projenizde bir ayar dosyası oluşturup (pos_ayarlar.php gibi), paket içerisinde ./config/pos.php dosyasının içeriğini buraya kopyalayın.
<?php
return [
//param birimleri Gateway'ler icinde tanımlıdır, özel bir mapping istemediğiniz sürece boş bırakınız
'currencies' => [
// 'TRY' => 949,
// 'USD' => 840,
],
// Banka sanal pos tanımlamaları
'banks' => [
'akbank' => [
'name' => 'AKBANK T.A.S.',
'class' => \Mews\Pos\Gateways\EstV3Pos::class,
'urls' => [
'production' => 'https://www.sanalakpos.com/fim/api',
'test' => 'https://entegrasyon.asseco-see.com.tr/fim/api',
'gateway' => [
'production' => 'https://www.sanalakpos.com/fim/est3Dgate',
'test' => 'https://entegrasyon.asseco-see.com.tr/fim/est3Dgate',
],
]
],
// Yeni eklenen banka
'isbank' => [
'name' => 'İŞ BANKASI .A.S.',
'class' => \Mews\Pos\Gateways\EstV3Pos::class, // Altyapı sınıfı
'urls' => [
'production' => 'xxxx', // API Url
'test' => 'xxxx', // API Test Url
'gateway' => [
'production' => 'xxxx', // 3d Kapı Url
'test' => 'xxxx', // 3d Test Kapı Url
],
]
],
]
];Bundan sonra nesnemizi, yeni ayarlarımıza göre oluşturup kullanmamız gerekir. Örnek:
//yeni ayar yolu ya da degeri
$yeni_ayarlar = require './pos_ayarlar.php';
$pos = \Mews\Pos\Factory\PosFactory::createPosGateway($account, $yeni_ayarlar);/examples dizini içerisinde.
3D ödeme örnek kodlar genel olarak kart bilgilerini website sunucusuna POST eder (index.php => form.php),
ondan sonra da işlenip gateway'e yönlendiriliyor.
Bu şekilde farklı bankalar arası implementation degişmemesi sağlanmakta (ortak kredi kart formu ve aynı işlem akışı).
Genel olarak kart bilgilerini, website sunucusuna POST yapmadan,
direk gateway'e yönlendirecek şekilde kullanılabilinir (genelde, banka örnek kodları bu şekilde implement edilmiş).
Fakat,
Redirection yapmadan iframe üzerinden veya Popup window içinde ödeme akışı
/examples/ içinde 3D ödeme ile örnek PHP ve JS kodlar yer almaktadır.
Özellikle şu alttaki dosyalarda:
form.php'ye)
postMessage API ile banktan dönen cevabı gönderir.
form.php postMessage API'dan gelen mesaji işler ve kullanıcıya gösterir.Cookie session kullanığınızda, kullanıcı gatewayden geri websitenize yönlendirilidiğinde session sıfırlanabilir.
Response'da samesite değeri set etmeniz gerekiyor. çözüm.
Shared hosting'lerde Cpanel'de gördüğünüz IP'den farklı olarak fiziksel sunucun bir tane daha IP'si olur. O IP adres Cpanel'de gözükmez, hosting firmanızdan sorup öğrenmeniz gerekmekte. Bu hatayı alırsanız hosting firmanın verdiği IP adrese'de banka gateway'i tarafından izin verilmesini sağlayın.
kutuphane ortam degerini de kontrol etmeyi unutmayiniz, ortama gore bankanin URL'leri degisir.
$pos->setTestMode(true);$pos->setTestMode(false); (default olarak false)ortam degeri hem bankaya istek gonderirken hem de gelen istegi islerken dogru deger olmasi gerekiyor.
Kütühane PSR-3 standarta uygun logger uygulamayı destekler. Örnekler: https://packagist.org/providers/psr/log-implementation .
Monolog logger kullanım örnegi:
composer require monolog/monolog$handler = new \Monolog\Handler\StreamHandler(__DIR__.'/../var/log/pos.log', \Psr\Log\LogLevel::DEBUG);
$logger = new \Monolog\Logger('pos', [$handler]);
$pos = \Mews\Pos\Factory\PosFactory::createPosGateway($account, null, null, $logger);AbstractGateway::TX_PAYAbstractGateway::TX_PRE_PAYorderId degeri isteri, bazıları ise ön provizyon sonucu dönen banka tarafındaki orderId'yi ister.
Satıcı ön otorizasyon isteği iptal etmek isterse de cancel isteği gönderir.
Post Otorizasyon İşlemin kütüphanedeki karşılığı AbstractGateway::TX_POST_PAYAbstractGateway::TX_REFUNDrefund işlemi kullanmak zorundasınız.
Genel olarak miktar bilgisi istenmez, ancak bazı Gateway'ler ister.
İşlemin kütüphanedeki karşılığı AbstractGateway::TX_CANCELMakinenizde Docker kurulu olmasi gerekiyor.
Projenin root klasöründe docker-compose up komutu çalıştırmanız yeterli.
Note: localhost port 80 boş olması gerekiyor.
Sorunsuz çalışması durumda kod örneklerine http://localhost/akbank/3d/index.php şekilde erişebilirsiniz.
http://localhost/ URL projenin examples klasörünün içine bakar.
Değerli yorum, öneri ve katkılarınızı
Sorun bulursanız veya eklenmesi gereken POS sistemi varsa lütfen issue oluşturun.
MIT