Dijital dünyada e-ticaretin hızla gelişmesine paralel olarak online ödeme çözümlerinin entegrasyonu büyük önem kazanmıştır. Codeigniter 4 projenizde Garanti BBVA Sanal Pos entegrasyonunu gerçekleştirmek, işletmenizin müşterilerine güvenli ve hızlı ödeme imkânı sunmanız açısından kritik bir adımdır. Bu makalede, Garanti BBVA Sanal Pos API’sini Codeigniter 4 projenizde nasıl entegre edeceğinizi adım adım anlatacağız. Gerekli hazırlıklardan başlayarak, veritabanı yapılandırması, API bilgilerinin temini, entegrasyon kodu yazımı ve işlemlerin test edilmesine kadar tüm süreçleri detaylı bir şekilde ele alacağız. Böylece, başarılı bir şekilde online ödeme sistemi kurarak müşterileriniz için güvenilir bir alışveriş deneyimi sunmanın püf noktalarını öğreneceksiniz. Hazırsanız, başlayalım!Garanti BBVA Sanal Pos entegrasyonunu Codeigniter 4 projenize eklemek için adım adım rehber: Hazırlıklar, API ayarları, veritabanı, kod yazımı ve test etme süreçleri.
Garanti BBVA Sanal Pos PHP Entegrasyonu İçin Gerekli Hazırlıklar
Garanti BBVA Sanal Pos PHP Entegrasyonu için temel bazı hazırlıkları yapmak gerekmektedir. Bu hazırlıklar, entegrasyon sürecinin daha sorunsuz ilerlemesini sağlar ve olası hata durumlarının önüne geçer. Aşağıda, Garanti BBVA Sanal Pos entegrasyonu öncesinde yapmanız gereken hazırlıkları adım adım izah ettik:
- API Bilgilerinin Temini: Öncelikle, Garanti BBVA müşterisi olmanız ve sanal POS hizmeti almanız gerekmektedir. Bankadan gerekli API bilgileriniz (Terminal ID, Merchant ID, ProvUserID, UserID ve Şifre) temin edilmelidir. Bu bilgiler, entegrasyon sürecinde kullanacağımız kritik verilerdir.
- Çevre Ayarlarının Yapılandırılması: Banka tarafından sağlanan API bilgilerini kullanarak test ve canlı ortamların konfigürasyonunu yapmanız gerekecektir. Özellikle test ortamında yapılacak denemeler, canlı yayına geçmeden önce işlemlerin sorunsuz olduğunu teyit etmenizi sağlar.
- SSL Sertifikası: Sanal POS entegrasyonlarında güvenlik en önemli unsurların başında gelir. Bu nedenle, sitenizde SSL sertifikası yüklü olmalıdır. SSL sertifikası, tüm işlemlerin güvenli bir şekilde gerçekleştirilmesini sağlar.
- PHP Sürümü ve Gereksinimler: PHP güncel sürümünün yüklü olduğundan emin olun. Genellikle PHP 7.2 ve üzeri sürümler tavsiye edilmektedir. Ayrıca, cURL ve OpenSSL gibi PHP uzantılarının yüklü ve aktif olduğundan emin olun.
- CodeIgniter 4 Kurulumu: Entegrasyonu gerçekleştireceğiniz projede CodeIgniter 4 framework’ünün kurulu ve çalışıyor olması gerekmektedir. Ayrıca, CodeIgniter 4’ün güncel ve stabil sürümünü kullanmanız önemlidir.
- Garanti BBVA İşlem Kılavuzları: Entegrasyon sürecinde kullanışlı olması adına banka tarafından sağlanan detaylı işlem kılavuzlarını inceleyin. Bu kılavuzlarda API çağrıları ve yanıtları ile ilgili detaylı bilgiler mevcuttur.
Bu hazırlıkları tamamladıktan sonra, Garanti BBVA Sanal Pos PHP Entegrasyonu sürecine güvenle başlayabilir ve sonraki adımları takip ederek başarıyla tamamlayabilirsiniz. Entegrasyon sürecinde karşılaşabileceğiniz olası sorunlar için banka destek ekibi ile iletişime geçmekten çekinmeyin.
Başlangıç: Garanti BBVA Pos API Bilgilerinin Temini ve Ayarları
Garanti BBVA Sanal Pos PHP entegrasyonu için ilk adım, gerekli API bilgilerini temin etmekten geçer. Bu bilgiler, banka tarafından sağlanır ve entegrasyon işlemlerinin sorunsuz bir şekilde gerçekleştirilmesini sağlar. API bilgilerinin temin edilmesi sürecine başlamadan önce, banka ile iletişime geçmeli ve gerekli izinleri almalısınız.
API Bilgilerinin Temini
Garanti BBVA Sanal Pos PHP entegrasyonu için aşağıdaki API bilgilerini temin etmeniz gerekmektedir:
- API Kullanıcı Adı (Username): Banka tarafından sağlanır ve API isteklerinin kimlik doğrulamasında kullanılır.
- API Parolası (Password): Güvenliği sağlamak için banka tarafından belirlenen parola.
- Terminal ID: Banka terminalinin kimliğini belirler ve her işletme için özeldir.
- Merchant ID (Mağaza Kodu): İşletmenizin banka sistemindeki kimliğidir.
- Pos URL: API isteklerinin gönderileceği banka sunucusunun URL’si.
- Referans Numarası: İşlemlerin takibi için kullanılan benzersiz bir numaradır.
API Bilgilerinin Ayarlanması
API bilgilerini temin ettikten sonra, Codeigniter 4 projenizde bu bilgileri güvenli bir şekilde saklamanız gerekmektedir. Bu aşamada aşağıdaki adımları takip edebilirsiniz:
- Config Dosyalarına Ekleme: API bilgilerini, projenizin
app/Config
klasöründe yer alan bir yapılandırma dosyasına ekleyin. Bu dosya, API bilgilerini içerir ve güvenlik açısından doğrudan erişime kapalı olmalıdır. - Çevresel Değişkenler: API bilgilerini, .env dosyanıza çevresel değişkenler olarak tanımlayın. Bu yöntem, bilgilerin daha güvenli bir şekilde yönetilmesine olanak tanır.
- Sınıfların Ayarlanması: API bağlantılarını yapacak olan sınıflarda, bu bilgilerin doğru bir şekilde kullanılmasını sağlayacak yöntemler tanımlayın. Örneğin, bir
GarantiBBVAService
sınıfı oluşturarak içinde gerekli bilgileri konfigüre edebilirsiniz.
Temin edilen bu bilgilerin doğru ve eksiksiz bir şekilde girilmesi, entegrasyon sürecinin sorunsuz ilerlemesi için oldukça kritiktir. Ayrıca, güvenlik amacıyla bu bilgilerin sadece gerekli olduğu yerlerde kullanıldığından emin olunmalı ve yetkisiz erişimlere karşı korunmalıdır.
Not: API bilgilerini gerçek ortamlarda test etmeden önce, banka tarafından sağlanan test ortamında denemeler yaparak entegrasyon süreçlerinizi doğrulamanız tavsiye edilir.
Veritabanı Yapılandırması ve Gerekli Tabloların Oluşturulması
Garanti BBVA Sanal Pos PHP Entegrasyonu için veritabanı yapılandırması oldukça kritiktir. Bu adımda, ödeme bilgilerinin doğru bir şekilde saklanması ve yönetilmesi için gerekli tabloları oluşturacağız. Hata yönetimi, işlem kayıtları ve güvenlik için uygun veri yapılarının kurulması gerekmektedir. Biz bu anlatımda, veritabanı kullanmadan Garanti BBVA’nın test ortamını ve test kartlarını kullanacağımız için veritabanından bağımsız kod örnekleri vereceğiz. Ancak siz yine de aşağıdaki veritabanı anlatımını dikkate alarak yol alabilirsiniz. Bu anlatımda herhangi bir kütüphane kullanılmamıştır.
İşte adım adım yapılması gerekenler:
1. Veritabanı bağlantısının ayarlanması
Öncelikle, Codeigniter 4 projenizde veritabanı bağlantısı ayarlarını yapmak için .env
dosyasını düzenlemeniz gerekmektedir. Aşağıdaki bilgileri uygun şekilde doldurun:
database.default.hostname = localhost
database.default.database = veri_tabanı_adı
database.default.username = kullanıcı_adı
database.default.password = şifre
database.default.DBDriver = MySQLi
2. Gerekli tabloların oluşturulması
Garanti BBVA Sanal Pos işlemlerini takip edebilmek için aşağıdaki tabloları veritabanınıza eklemeniz gerekmektedir. Bu tablolar, ödeme bilgilerini ve işlem durumlarını saklamak için kullanılacaktır:
İşlem Kayıtları Tablosu
CREATE TABLE `transactions` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`order_id` varchar(255) NOT NULL,
`amount` decimal(10,2) NOT NULL,
`status` varchar(50) NOT NULL,
`transaction_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
);
Hata Kayıtları Tablosu
CREATE TABLE `error_logs` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`error_code` varchar(50) NOT NULL,
`error_message` text NOT NULL,
`log_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
);
3. Veritabanı migration dosyalarının oluşturulması
Codeigniter 4, veritabanı tablolarını yönetmek için migration yapısını kullanır. Migration dosyalarını oluşturmak için terminalde aşağıdaki komutları çalıştırın:
php spark make:migration CreateTransactionsTable
php spark make:migration CreateErrorLogsTable
Oluşan migration dosyalarını açarak yukarıdaki SQL komutlarını uygun yerlere ekleyin ve ardından migration işlemini başlatın:
php spark migrate
Bu adımlar tamamlandığında, Garanti BBVA Sanal Pos PHP Entegrasyonu için veritabanı yapılandırmanız hazır olacaktır. Diğer adımlara geçmeden önce her şeyin düzgün çalıştığından emin olmak için veritabanı bağlantılarını ve tabloları kontrol ediniz.
API Controller Sınıfının Oluşturulması
Örnek olarak, app/Controllers/GarantiBBVAPayment.php
dosyasını oluşturun ve aşağıdaki kodu ekleyin:
namespace App\Controllers;
use CodeIgniter\Controller;
class GarantiBBVAPayment extends Controller
{
public function index()
{
return view('admin/pages/payment/payment');
}
public function process()
{
$orderId = uniqid();
$amount = $this->request->getPost('amount');
$card_holder = $this->request->getPost('card_holder');
$cardNumber = $this->request->getPost('card_number');
$expire = $this->request->getPost('expire');
$expiryMonth = substr($expire, 0, 2);
$expiryYear = substr($expire, 3, 2);
$cvv = $this->request->getPost('cvv');
$hashData = $this->generateHashData($orderId, $amount);
$data = [
'mode' => 'TEST',
'apiversion' => '512',
'terminalprovuserid' => 'PROVAUT',
'terminaluserid' => 'GARANTI',
'terminalmerchantid' => '7000679',
'terminalid' => '30691297',
'orderid' => $orderId,
'customeremailaddress' => '[email protected]',
'customeripaddress' => $this->request->getIPAddress(),
'txntype' => 'sales',
'txnamount' => $amount,
'txncurrencycode' => '949',
'txninstallmentcount' => '',
'successurl' => base_url('admin/payment/success'),
'errorurl' => base_url('admin/payment/error'),
'secure3dhash' => $hashData,
'cardnumber' => $cardNumber,
'cardexpiredatemonth' => $expiryMonth,
'cardexpiredateyear' => $expiryYear,
'cardcvv2' => $cvv,
'cardholdername' => $card_holder,
'secure3dsecuritylevel' => '3D_FULL',
];
return view('admin/pages/payment/payment_process', ['data' => $data]);
}
public function processInitial()
{
// Ödeme işlemi için gerekli verileri al
$orderId = uniqid();
$amount = $this->request->getPost('amount');
$card_holder = $this->request->getPost('card_holder');
$cardNumber = $this->request->getPost('card_number');
$expire = $this->request->getPost('expire');
$expiryMonth = substr($expire, 0, 2);
$expiryYear = substr($expire, 3, 2);
$cvv = $this->request->getPost('cvv');
$hashData = $this->generateHashData($orderId, $amount);
// Verileri hazırlıyoruz
$data = [
'mode' => 'TEST',
'apiversion' => '512',
'terminalprovuserid' => 'PROVAUT',
'terminaluserid' => 'GARANTI',
'terminalmerchantid' => '7000679',
'terminalid' => '30691297',
'orderid' => $orderId,
'customeremailaddress' => '[email protected]',
'customeripaddress' => $this->request->getIPAddress(),
'txntype' => 'sales',
'txnamount' => $amount,
'txncurrencycode' => '949',
'txninstallmentcount' => '',
'successurl' => base_url('admin/payment/success'),
'errorurl' => base_url('admin/payment/error'),
'secure3dhash' => $hashData,
'cardnumber' => $cardNumber,
'cardexpiredatemonth' => $expiryMonth,
'cardexpiredateyear' => $expiryYear,
'cardcvv2' => $cvv,
'cardholdername' => $card_holder,
'secure3dsecuritylevel' => '3D_FULL',
];
// Verileri session'a kaydet
session()->set('payment_data', $data);
// Yönlendirme yap
return redirect()->to('admin/payment/redirect');
}
public function processRedirect()
{
// Session'dan verileri al
$data = session()->get('payment_data');
if (!$data) {
return redirect()->to('admin/payment')->with('error', 'Invalid payment session');
}
// Session'dan verileri sil
session()->remove('payment_data');
return view('admin/pages/payment/payment_process', ['data' => $data]);
}
private function generateSecurityData($terminalId)
{
$password = "123qweASD/"; // Provizyon şifresi
$paddedTerminalId = str_pad((int)$terminalId, 9, '0', STR_PAD_LEFT);
$data = $password . $paddedTerminalId;
return strtoupper(sha1($data));
}
private function generateHashData($orderId, $amount)
{
$terminalId = "30691297"; // Terminal ID
$currencyCode = "949"; // TL için
$successUrl = base_url('admin/payment/success');
$errorUrl = base_url('admin/payment/error');
$type = "sales";
$installmentCount = ""; // Taksit yoksa boş string
$storeKey = "12345678"; // Store Key
$hashedPassword = $this->generateSecurityData($terminalId);
$hashString = $terminalId . $orderId . $amount . $currencyCode . $successUrl . $errorUrl . $type . $installmentCount . $storeKey . $hashedPassword;
return strtoupper(hash('sha512', $hashString));
}
public function success()
{
$post = $this->request->getPost();
$procreturncode = $this->request->getPost('procreturncode');
if ($procreturncode != '00') {
return redirect()->to(base_url('admin/payment/error'));
}
$data = [
'orderid' => $this->request->getPost('orderid'),
'txnamount' => $this->request->getPost('txnamount'),
'txntimestamp' => date('Y-m-d H:i:s'),
'authcode' => $this->request->getPost('authcode'),
];
return view('admin/pages/payment/success', $data);
}
public function error()
{
$errorCodes = [
'0001' => 'Girdiğiniz değerleri kontrol ediniz.',
'0002' => 'İşlem tipi için zorunlu alanları kontrol ediniz.',
'0003' => 'Kart son kullanma tarihi geçersiz.',
'0101' => 'İptal edilecek işlem bulunamadı.',
'0102' => 'Kapatılacak ön otorizasyon işlemi bulunamadı.',
'0103' => 'İade edilecek işlem bulunamadı.',
'0104' => 'Aynı sipariş içinde sadece bir tane satış işlemi yapılabilir.',
'0108' => 'Gönderilen sipariş numarasına ait kayıt bulunmamaktadır.',
'0109' => 'Bu sipariş bilgilerinde herhangi bir satış işlemi bulunmamaktadır.',
'0110' => 'İşlem bulunamadı.',
'0111' => 'Sipariş onaylanmış, sorgulama için yeni sipariş kullanınız.',
'0113' => 'DCC sorgu sonucu bulunamadı.',
'0122' => 'İşleminizi gerçekleştiremiyoruz. Lütfen tekrar deneyiniz.',
'0651' => 'Kullanıcı şifresi hatalı.',
'0652' => 'Üzgünüz, bu işlemi yapmaya yetkiniz yok.',
'0653' => 'Kullanıcı bu terminalde tanımlı değildir.',
'0654' => 'Kullanıcı statüsü kapalı.',
'0752' => 'Terminal kaydı yok.',
'0753' => 'Bu terminal için yanlış işyeri numarası girilmiştir.',
'0756' => 'Bu terminalde tekrarlı ödeme yapma yetkisi yoktur.',
'0759' => 'Bu terminalde farklı döviz kodunda işlem yetkisi yoktur.',
'0763' => '3D alanlarını girmelisiniz.',
'0764' => 'Bu terminalde moto kullanımı yetkisi yoktur.',
'0769' => 'Terminal için tanımlı IP\'ler haricinde işlem gelemez.',
'0770' => 'İşleminizi gerçekleştiremiyoruz. Tekrar deneyiniz.',
'0771' => 'İşleminizi gerçekleştiremiyoruz. Tekrar deneyiniz.',
'0773' => 'İşleminizi gerçekleştiremiyoruz. Tekrar deneyiniz.',
'0785' => 'Guarantipay yetkisi yok.',
'0804' => 'MD güvenlik doğrulamasında hata. (İşlem miktarı veya işlem ID\'si yanlış girilmiş olabilir)',
'9999' => 'İşleminizi gerçekleştiremiyoruz. Lütfen daha sonra tekrar deneyiniz.',
'9998' => 'Zaman aşımı oluştu. Lütfen daha sonra tekrar deneyiniz.',
'99' => 'İşyeri kullanım tipi desteklenmiyor. Lütfen Garanti BBVA ile iletişime geçin.'
];
$procreturncode = $this->request->getPost('procreturncode');
$errmsg = $this->request->getPost('errmsg');
$orderid = $this->request->getPost('orderid');
$mdstatus = $this->request->getPost('mdstatus');
$response = $this->request->getPost('response');
// Özel hata mesajı oluşturma
$customErrorMessage = isset($errorCodes[$procreturncode])
? $errorCodes[$procreturncode]
: 'Bilinmeyen bir hata oluştu. Lütfen daha sonra tekrar deneyiniz.';
$data = [
'procreturncode' => $procreturncode,
'errmsg' => $errmsg ?: $customErrorMessage,
'orderid' => $orderid,
'mdstatus' => $mdstatus,
'response' => $response,
'customErrorMessage' => $customErrorMessage
];
// Tüm cevabı loglayalım
log_message('error', 'Payment Error: ' . json_encode($this->request->getPost()));
return view('admin/pages/payment/error', $data);
}
}
Bu sınıf, API anahtarlarınızı ve gizli anahtarlarınızı sınıf içinden kullanarak Garanti BBVA Pos’a istek gönderebilmektedir. Ancak mutlaka api bilgilerinizi güvenli olması için .env dosyanızdan çağırmalısınız.
Ekstra Güvenlik Önlemleri
Ödeme formunun güvenliğini artırmak için şu önlemleri alabilirsiniz:
- SSL Sertifikası: Ödeme sayfanızın SSL ile güvence altına alındığından emin olun.
- CSRF Koruması: Codeigniter’ın CSRF korumasını kullanarak formunuzu güvence altına alın.
- Sunucu Taraflı Validasyon: Form verilerini hem istemci hem de sunucu tarafında doğrulayın.
Ödeme formu ve validasyon işlemleri tamamlandıktan sonra, bu verilerin Garanti BBVA Pos API ile güvenli bir şekilde iletilmesini sağlayabilirsiniz. Bu aşamada, kullanıcı deneyimini yüksek tutmak için hata yönetimi ve geri bildirim mekanizmalarını eklemeyi unutmayın.
Garanti BBVA Pos API Entegrasyonu İçin Route Tanımlamaları
Codeigniter 4 projenizde Garanti BBVA Sanal Pos PHP Entegrasyonu gerçekleştirmek için oute tanımlamaları oldukça kritik bir öneme sahiptir.
Route Tanımlamaları
Route tanımlamaları, API çağrılarını ilgili controller ve metotlara yönlendirmek için gereklidir. Bu tanımlamaları yapabilmek için, app/Config/Routes.php
dosyasını düzenleyeceğiz:
$routes->post('payment/process', 'Payment::processInitial', ['as' => 'processPayment']);
$routes->get('payment/redirect', 'Payment::processRedirect', ['as' => 'paymentRedirect']);
$routes->post('payment/success', 'Payment::success', ['as' => 'paymentSuccess']);
$routes->post('payment/error', 'Payment::error', ['as' => 'paymentError']);
Başarılı ve Başarısız İşlemler İçin Dönüş Değerlerinin Yönetimi
Garanti BBVA Sanal Pos PHP entegrasyonu gerçekleştirirken, başarılı ve başarısız işlemlerden dönen değerlerin doğru bir şekilde yönetilmesi kritik öneme sahiptir. İşlem sonucunun doğru bir şekilde yönlendirilmesi, müşteri memnuniyeti ve sistem güvenliği açısından büyük önem taşır.
Başarılı İşlemler
Ödeme işlemi başarılı olduğunda Garanti BBVA API’si tarafından dönen değerlerin doğru bir şekilde yakalanması ve işlenmesi gerekmektedir. Başarılı işlemler için şu adımlar takip edilmelidir:
- API Cevaplarının Yakalanması: API’den dönen başarılı işlem cevabının uygun dönüş yapısıyla yakalanması.
- Veritabanı Güncellemeleri: İşlem başarılı olduğunda, ilgili siparişin durumu ödendi olarak güncellenmelidir.
- Bilgilendirme: Müşteriye, işlemin başarılı olduğunu bildiren bir e-posta veya SMS gönderilmesi faydalı olabilir.
Başarısız İşlemler
Başarısız işlemler de dikkatli bir şekilde ele alınmalıdır. Bu işlemler için aşağıdaki yönetim adımları uygulanmalıdır:
- Hata Kodlarının İncelenmesi: API tarafından dönen hata kodları ve mesajlar dikkatlice incelenmelidir. Bu bilgiler, sorunun ne olduğunu anlamak için önemlidir.
- Loglama: Başarısız işlem detayları loglanarak, sistemdeki olası sorunların tespiti ve giderilmesi için kullanılabilir.
- Müşteri Bilgilendirmesi: Hata durumunda, müşteriye işlemin başarısız olduğu ve tekrar denemesi gerektiği bilgisi verilmelidir.
Test Etme ve Canlı Ortama Geçiş Öncesi Dikkat Edilecekler
Garanti BBVA Sanal Pos PHP entegrasyonunuzu tamamladıktan sonra, sisteminizi test ortamında iyice test etmeniz son derece önemlidir. Bu bölümde, test sürecinde ve canlı ortama geçiş öncesinde dikkat etmeniz gereken temel noktalara yer vereceğiz.
- Test Ortamı Kullanımı: Garanti BBVA’nın sunduğu test ortamını etkin bir şekilde kullanın. Test ortamında işlem yapabilmek için test API anahtarlarını ve sanal kart bilgilerini temin edin.
- Farklı Senaryoları Test Etme: Başarılı ödeme, başarısız ödeme, yetersiz bakiye, geçersiz kart bilgisi gibi farklı senaryoları test edin. Bu sayede gerçek kullanıcıların karşılaşabileceği çeşitli durumlar için hazırlıklı olursunuz.
- Güvenlik Önlemleri: Kodunuzun güvenliğini test edin. Özellikle kullanıcı bilgilerinin doğru şifrelenip şifrelenmediğini kontrol edin. SSL sertifikasının etkin ve düzgün bir şekilde çalıştığından emin olun.
- Transaction Logları: Tüm işlem loglarını dikkatlice inceleyin. Herhangi bir hata veya uyumsuzluk olup olmadığını kontrol edin ve gerekli düzenlemeleri yapın.
- Performans Testi: Sisteminizin yük altında nasıl performans gösterdiğini test edin. Yüksek hacimli işlemler sırasında API yanıt süresinin makul seviyede olup olmadığını kontrol edin.
- Canlı Ortama Geçiş Planı: Tüm test süreçlerini başarıyla tamamladıktan sonra, canlı ortama geçiş için bir plan oluşturun. Geçiş sırasında oluşabilecek olası sorunlara karşı hazırlıklı olun ve bir geri dönüş planı belirleyin.
- Yedekleme: Canlı ortama geçiş öncesinde tüm veritabanı ve dosyalarınızın yedeğini alın. Herhangi bir aksaklık durumunda yedekten geri yükleme yaparak sisteminizi hızlıca toparlayabilirsiniz.
Bu adımları uygulayarak, Garanti BBVA Sanal Pos PHP entegrasyonunuzu sorunsuz bir şekilde canlıya alabilir ve müşteri memnuniyetini en üst seviyede tutabilirsiniz.