Laravel ile Akbank Sanal Pos Entegrasyonu

Erdi Doğan
Digitexa
Published in
3 min readApr 28, 2020

Akbank diğer bir çok banka gibi Asseco See Teknoloji A.Ş. şirketi tarafından oluşturulmuş özel bir yazılım(Payten) kullanmaktadır. Bu yazılım api erişimleri dışında özel güvenlik hizmetleri de sunar. Api erişimlerine ulaşabilmek için buraya tıklayarak hesap oluşturmalısınız.

Laravel ile Akbank Sanal Pos Entegrasyonu

Şimdi gelelim “laravel new akbankpos” dedikten sonra projemizi oluşturmuş olalım. İşlemlere başlamadan önce 2 adet paket kurmamız gerekiyor bunlar tamamen sizin tercihinize kalmış dilerseniz direk sizde yazabilirsiniz ancak bu paketler kullanması kolay paketlerdir.

İlk paketimiz ArrayToXml paketi:

Bu paketi composer ile kolaylıkla kurabilirsiniz.

composer require spatie/array-to-xml

İkinci paketimiz için api urle istek atabilmemiz için yaygın kullanılan Guzzle:

Bu paketi de aynı şekilde composer ile kurabilirsiniz.

composer require guzzlehttp/guzzle

Şimdi artık gelelim datalarımızı hazırlama kısmına, yeni bir class oluşturulalım. Bu classımıza bankamızdan edindiğimiz api url, secret ve key gibi bilgilerimizi ekleyelim. Yine buradaki karar size kalmış dilerseniz bu gibi bilgileri .env dosyasında tutabilir ve env() ile ulaşabilirsiniz.

private $postUrl = "https://entegrasyon.asseco-see.com.tr/fim/api";
private $terminalId = "AKTESTAPI";
private $password = "*****";
private $clientId = "*****";
private $mode = "****";
private $transactionType = "Auth";
private $currencyCode = "949";
private $userId = "PROVAUT";

Ben bu tip bilgileri direk classta olmasını istediğimi için bu türde tuttum. Neden bu şekilde tuttuğumuzu diğer yazılarda anlatacağım. Bankaya göndereceğimiz isteği göndermeden önce bir xml yapısı oluşturmamız gerekiyor. Bunun için öncelikle formumuzdan gelen tüm sipariş bilgilerini store edeceğimiz bir objeye ihtiyaçımız var bu objeyi de önceden ayarlamanız gerektiğini düşünüyorum. Bu dataların tümü $order değişkenine set ettim.

Artık sıra geldi generateXml fonksiyonumuzu oluşturmaya.

protected function generateXml()
{
$params = [
'Name' => $this->terminalId,
'Password' => $this->password,
'ClientId' => $this->clientId,
'IPAddress' => $this->order['ip'],
'Mode' => $this->mode,
'OrderId' => $this->order['id'],
'Type' => $this->transactionType,
'Number' => $this->order['card_number'],
'Expires' => $this->order['expire_mounth_year'],
'Cvv2Val' => $this->order['cvv'],
'Total' => $this->order['amount'],
'UserId' => $this->clientId,
'Currency' => $this->currencyCode,
'email' => $this->order['email'],
'Taksit' => $this->order['installment'],
'BillTo' => [
'Name' => $this->userId,
'Street1' => $this->userId,
'City' => $this->userId,
'PostalCode' => $this->userId,
'Country' => $this->userId,
'TelVoice' => $this->userId,
],
'ShipTo' => [
'Name' => $this->userId,
'Street1' => $this->userId,
'City' => $this->userId,
'PostalCode' => $this->userId,
'Country' => $this->userId,
],
'extra' => '',
];

return ArrayToXml::convert($params, 'CC5Request', true, 'UTF-8');
}

Yukarıda fonksiyonda $this->userId alanları zorunlu olmadığı için aynı datayı set ettim ancak siz mümkünse hepsini doldurmanızda fayda var. ArrayToXml::convert kullandığımız method ise yukarı eklemiş olduğumuz Spatie paketinden çağırılmalıdır.

use Spatie\ArrayToXml\ArrayToXml;

Aynı classımızın içerisinde yeni bir fonksiyonumuz daha olacak bununla da generateXml() fonksiyonumuzu çağıracağız.

protected function getPostOptions()
{
return [
'form_params' => [
'DATA' => $this->generateXml()
]
];
}

Evet. Artık tüm datalarımız hazır halde ve Guzzle paketimizi kullanarak posumuza istek atacağız.

public function payOrder()
{
$client = new GuzzleHttp\Client();
$response = $client->post($this->getPostUrl(), $this->getPostOptions());

return $this->formatResponse($response);
}

Artık test ortamında ödeme gerçekleşti.

Dilerseniz yazılım şirketimizden hizmet alabilirsiniz…

--

--

Erdi Doğan
Digitexa

Yıllardır web sektörünün içindeyim. Özellikle eticaret konusunda bir çok proje de bulundum ve bir çok proje geliştirdim. Founder #Digitexa