Paranoia Ödeme Kütüphanesi Tanıtımı

Share Button

Birkaç yıl önce yazdığım bir ödeme kütüphanesini, elini yüzünü biraz düzelttikten sonra kaynağını açmaya karar verdim. Kütüphanemin adı Paranoia!

Paranoia Türkiye’deki bankaların kullandığı ortak altyapı api lerinin tek bir arayüz üzerinden kullanılabilmesi için geliştirilmiş bir kütüphanedir. Implementasyonunun son derece basit olmasına özen gösterdim ancak hedeflediğim noktaya gelmesi için çözülmeyi bekleyen yaklaşık 13-14 issue su var.

Paranoia şu an yalnızca Est altyapısını destekleyen bankalarla çalışabilmektedir. Ancak pek yakında Gvp, Posnet yaltyapılarına ve Turkcell Cüzdan, İşbank parakod gibi alternatif ödeme sistemlerine de destek verecektir.

Paranoia nın mevcut durumu aşağıdaki gibidir.

 ESTGVPPOSNETTurkcell Cüzdanİşbank Parakod
Ön Otorizasyon (Pre-Authorization)HazırPek Yakında…Pek Yakında…Pek Yakında…Pek Yakında…
Post Otorizasyon (Post-Authorization)HazırPek Yakında…Pek Yakında…Pek Yakında…Pek Yakında…
Satış (sales)HazırPek Yakında…Pek Yakında…Pek Yakında…Pek Yakında…
İade (refund)HazırPek Yakında…Pek Yakında…Pek Yakında…Pek Yakında…
İptal (cancel)HazırPek Yakında…Pek Yakında…Pek Yakında…Pek Yakında…
Sipariş tarihcesi sorgulama (inquiry)Pek Yakında…Pek Yakında…Pek Yakında…Pek Yakında…Pek Yakında…
3D-Secure ile satışPek Yakında…Pek Yakında…Pek Yakında…
Puan sorgulama (pointInquiry)Pek Yakında…Pek Yakında…Pek Yakında…
Puan kullanımı (pointUsage)Pek Yakında…Pek Yakında…Pek Yakında…

Paranoia, implementasyonu son derece basit ve açık kaynak kodlu bir kütüphanedir.

Kütüphanenin Zend_Config bağımlılığı bulunmaktadır, kaynak kodlarına https://github.com/ibrahimgunduz34/paranoia adresindeki github reposundan ulaşabilirsiniz.

Ödeme işlemi:

Banka tanımlamaları, kütüphanenin config/payment.ini dosyası içinde, aşağıdaki şekilde gerçekleştirilmektedir:

[production]
isbank.adapter = "Est"
isbank.api_url = "<production api url>"
isbank.username = "<your api username>"
isbank.password = "<your api password>"
isbank.client_id = "<your client_id>"
isbank.mode = "P"

[development : production]
isbank.api_url = "https://testsanalpos.est.com.tr/servlet/cc5ApiServer"
isbank.username = "ISBANKAPI"
isbank.password = "ISBANK07"
isbank.client_id = "700100000"
isbank.mode = "T"

Konfigürasyon verilerini bankaya iletmek üzere okuyoruz.

$config = new \Zend_Config(APPLICATION_PATH . '/config/payment.ini', APPLICATION_ENV);

İşlem sırasında ihtiyacımız olan kütüphaneleri import ediyoruz.

use \Payment\Factory;
use \Payment\Request;
use \Payment\Exception\UnexpectedResponse;
use \Payment\Adapter\Container\Exception\ConnectionFailed;

Ödeme işlemini gerçekleştirmek için sipariş bilgilerimizi içeren Request nesnesini oluşturuyoruz.

$request = new Request();
$request->setCardNumber('5105105105105100')
        ->setSecurityCode('510')
        ->setExpireMonth(3)
        ->setExpireYear(2014)
        ->setOrderNumber('ORD000001')
        ->setAmount(100.35)
        ->setCurrency('TRL');

Ödeme için kullanacağımız banka adaptörünü yaratıyor ve ödeme işlemini gerçekleştiriyoruz.

$instance = Factory::createInstance($config, 'isbank');
try {
    $response = $instance->sale($request);
    if( $response->isSuccess() ) {
        echo 'Payment is performed successfuly.';   
    } else {
        echo 'Payment is failed.';
    }
} catch(UnexpectedResponse $e) {
    echo 'Provider is responded an unexpected response.';
} catch(ConnectionFailed $e) {
    echo 'Provider connection is failed.';
} catch(Exception $e) {
    echo 'Payment transaction deosn\'t performed. Please try again later.';
}

Ödeme işleminin sonucu \Payment\Response\PaymentResponse olarak dönmektedir. Bu objeden aşağıdaki metodlarla transactionid, orderid, responsecode ve response message gibi bilgileri elde edebilirsiniz.

$response->isSuccess()
$response->getResponseCode()
$response->getResponseMessage()
$response->getTransactionId()
$response->getOrder()

İade işlemi:

İade işlemini gerçekleştirmek için ödeme işlemi sırasında 1. ve 2. adımda gerçekleştirdiğimiz konfigürasyonun okunması ve kullanılacak kütüphanelerin import edilmesi işlemlerini tekrar gerçekleştirmemiz gerekiyor.

Para iadesi yapacağımız sipariş için istek nesnesi oluşturuyoruz.

$request = new Request();
$request->setOrderNumber('ORD000001')
        ->setAmount(100.35) 
        ->setCurrency('TRL');

Siparişin tutarının tamamını iade etmek isterseniz, Amount ve Currency değerlerini göndermenize gerek yoktur.

$instance = Factory::createInstance($config, 'isbank');
try {
    $response = $instance->refund($request);
    if( $response->isSuccess() ) {
        echo 'Refunded transaction is performed successfuly.';   
    } else {
        echo 'Refund transaction is failed.';
    }
} catch(UnexpectedResponse $e) {
    echo 'Provider is responded an unexpected response.';
} catch(ConnectionFailed $e) {
    echo 'Provider connection is failed.';
} catch(Exception $e) {
    echo 'Refund transaction deosn\'t performed. Please try again later.';
}

İptal işlemi:

İade işlemini gerçekleştirmek için ödeme işlemi sırasında 1. ve 2. adımda gerçekleştirdiğimiz konfigürasyonun okunması ve kullanılacak kütüphanelerin import edilmesi işlemlerini tekrar gerçekleştirmemiz gerekiyor.

Para iadesi yapacağımız sipariş için istek nesnesi oluşturuyoruz.

$request = new Request();
$request->setOrderNumber('ORD000001');

İade işlemi satış işlemi dışında diğer tüm kısmi ve tam iade işlemleri için de gerçekleştirilebilmektedir. Siparişinizle ilgili satış işlemi dışında gerçekleştirdiğiniz herhangibir iade işlemi varsa, sipariş numarasıyla birlikte transactionid bilgisini de request objesi ile göndermelisiniz.

$instance = Factory::createInstance($config, 'isbank');
try {
    $response = $instance->cancel($request);
    if( $response->isSuccess() ) {
        echo 'Transaction is cancelled successfuly.';   
    } else {
        echo 'Cancelation is failed.';
    }
} catch(UnexpectedResponse $e) {
    echo 'Provider is responded an unexpected response.';
} catch(ConnectionFailed $e) {
    echo 'Provider connection is failed.';
} catch(Exception $e) {
    echo 'Cancelation deosn\'t performed. Please try again later.';
}
Share Button

About İbrahim Gündüz

1983 yılında İstanbul’da doğdu. İlkokul yıllarında cobol ve basic le olan tanışması, yazılıma olan ilgisini arttırdı 2005 yılında. Uludağ Üniversitesi Teknik Bilimler Meslek Yüksek Okulu Elektronik bölümünden mezun olan Gündüz, çeşitli alanlarda faaliyet gösteren kurumlarda yazılım geliştirici olarak görev almıştır. Mesleki ilgi alanları, ölçeklenebilir sistemler, uygulama entegrasyonları ve ödeme sistemleridir. Halen Markafoni back end geliştirici olarak çalışmaktadır.

8 Comments

  • Halil Özgür
    Temmuz 10, 2013 - 3:24 pm | Permalink

    Yakında açılma ihtimali var mı? Varsa naçizane katkıda bulunmaya çalışabilirim. En azından merakımızı gidermiş oluruz :) Edit: https://github.com/ibrahimgunduz34/paranoia adresinde açtığını fark ettim, kısmetse oradan da devam ederim :)

    Asıl sormak istediğim arka planda olan isteklerle bitmeyen ödeme şekillerinde -daha doğrusu bunları standartlaştırmada- nasıl bir yol izliyorsun? Bunlar farklı request’ler gerektirmelerinin yanında farklı parametreler de gerektirebiliyor. Ör.:
    – Sayfadan çıkıp banka sayfasına gidilmesi gerekenler: 3DS, …
    – Ortak ödeme sayfaları
    – PayPal
    – Ajax ile ara bir request yapıp sonra tekrar ödeme sayfasına yönlenmesi gerekenler: PayU

    Bir de bu projeyi production’da kullanma açısından ne durumda kabul edebiliriz?

  • Temmuz 10, 2013 - 7:35 pm | Permalink

    Halil selamlar,
    İlgin için çok teşekkür ederim. Kartlı ödeme tarafını 1-2 sene önce rocket deyken yazmıştım. Fakat pek kaynağı açılabilecek kadar temiz değildi. Tekrar tasarlayıp kaynağını açmaya karar verdim. Est tarafı production da kullanıma hazır. /tests klasöründe belli senaryolara göre yazılmış testler mevcut. Garanti tarafını ayrı bir branchda ben geliştirdim ama henüz hazır değil, Posnet tarafı için başka bir arkadaşım katkıda bulundu ama henüz test etmedik. İkisi de henüz master a alınmadı.

    Yapıları standartlaştırmak adına tüm adaptörlerin bir istek/yanıt objeleriyle haberleşmesini tasarladım. Her adaptör aynı tipde istek ve yanıt objesi dönüyor.

    Kullanıcınn siteden ayrılmadığı direct/indirect ödeme yöntemleri (kartlı ödemeler ve turkcell cüzdan ve qrcode) ve 3d secure ile ilgili tasarımsal bir sıkıntı yok. Şu anki öngördüğüm haliyle mevcut mimari bu tip geliştirmelere yanıt verebiliyor. Ancak BKM yada türevi soap/http karma istek yapılarına sahip standart dışı bazı ödeme metodlarını henüz nasıl implemente edebileceğim konusunda net bir fikrim yok.

    Katkılarını/fikirlerini bekliyorum. Şimdiden çok teşekkür ederim.

  • Temmuz 22, 2013 - 12:33 pm | Permalink

    Konuyu takip eden arkadaşlar için:
    – Garanti bankası uyarlaması tamamlandı. Yayına alınmayı bekliyor.
    – API nin olay güdümlü çalışabilmesi sağlandı.
    – Yapıkredi geliştirmesi devam ediyor.

  • Ağustos 11, 2013 - 7:24 pm | Permalink

    Garanti bankası geliştirmesi tamamlandı.
    Olay yönetimi ile ilgili geliştirme yapıldı.

  • Ağustos 11, 2013 - 7:25 pm | Permalink

    Garanti bankası ile ilgili geliştirme yayına alındı.
    Olay yönetimi ile ilgili geliştirme yapıldı, yayına alındı.

  • Kadir YILDIZ
    Şubat 28, 2014 - 7:19 pm | Permalink

    Öncelikle çok teşekkür ederim.

    Taksitlendirmeyi bu sınıf ile nasıl yapabiliriz acaba.

    Elinize sağlık.

    • Mart 1, 2014 - 6:55 pm | Permalink

      Merhabalar,
      Taksitlendirme işlemi için Request objesine installment değeri set etmeniz yeterli olacaktır.
      Kolaylıklar dilerim.

      $request->setInstallment(2);
      
  • Tamer
    Kasım 26, 2015 - 7:48 am | Permalink

    Abi 3d olsaymış tadından yenmezmiş :) Teşekkür ederim.

  • Bir Cevap Yazın

    E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir