Monthly Archives: Haziran 2013

Programa Dilleri ve Çatıları

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

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.';
}
Programa Dilleri ve Çatıları

PHP Dahili Web Sunucusuna Ortam Değişkeni Göndermek

Bu haftasonu zend 1.12 ile uğraştığım bir projede apache konfigürasyonu yapmaya üşendiğim için php nin yerel web sunucusunu kullandım. Ancak apache de virtualhost ayarlarından gönderebildiğim ortam değişkenini (APPLICATION_ENV), komut satırında bir türlü göndermeyi başaramadım. Internette güç bela bununla ilgili kaynak bulunca konuyu sizlerle paylaşmak istedim. Umarım birilerinin işine yarar.
***
PHP’nin dahili web sunucusuna ortam değişkenini göndermek için komut satırında ortam değişkeninizin değerini tanımlayarak -d parametresi ile değişken çözümleme sırasını EGPCS (Environment, Get, Post, Cookie, Server) olarak göndermeniz gerekir.

Örnek kullanım:

$ APPLICATION_ENV=development php -d variable_orders=EGPCS -S localhost:8080 -t public/