Kapitalbank E-Commerce Payment Gateway integration for Laravel.
azpayments/kapitalbank is a Laravel package for kapitalbank e-commerce payment gateway integration for laravel..
It currently has 23 GitHub stars and 1 downloads on Packagist (latest version v1.0.0).
Install it with composer require azpayments/kapitalbank.
Discover more Laravel packages by azpayments
or browse all Laravel packages to compare alternatives.
Last updated
Laravel layihənizə Kapitalbank ödəniş sistemini 10 dəqiqəyə qoşun.
Bu paket Azərbaycanda ən böyük bank olan Kapitalbank-ın E-Commerce ödəniş sistemini Laravel layihənizə asan şəkildə inteqrasiya etməyə imkan verir. Heç bir mürəkkəb konfiqurasiya tələb olunmur - sadəcə quraşdırın və istifadə edin!
| Tələb | Minimum versiya | Necə yoxlamaq? |
|-------|-----------------|----------------|
| PHP | 8.2+ | Terminalda: php -v |
| Laravel | 10, 11 və ya 12 | php artisan --version |
| Composer | İstənilən | composer --version |
| Kapitalbank E-Commerce hesabı | - | Bankdan almalısınız |
Kapitalbank E-Commerce hesabınız yoxdursa, əvvəlcə Kapitalbank-a müraciət edib merchant hesabı açın. Onlar sizə username və password verəcəklər.
Win + R basın, cmd yazın, Enter basınCmd + Space basın, Terminal yazın, Enter basınCtrl + Alt + T basıncd /path/to/your/laravel/project
Məsələn:
cd C:\xampp\htdocs\my-shop
və ya
cd /var/www/my-shop
Bu əmri terminalda yazın və Enter basın:
composer require azpayments/kapitalbank
⏳ Yükləmə bitənə qədər gözləyin. "Successfully" yazısı görünməlidir.
php artisan vendor:publish --tag=kapitalbank-config
Bu əmr config/kapitalbank.php faylını yaradacaq.
.env faylını redaktə edinLaravel layihənizin ana qovluğunda .env adlı fayl var. Bu faylı istənilən mətn redaktoru ilə açın (Notepad, VS Code, Sublime Text və s.)
Faylın sonuna bu sətirləri əlavə edin:
# Kapitalbank konfiqurasiyası
KAPITALBANK_MODE=test
KAPITALBANK_USERNAME=sizin_username_buraya
KAPITALBANK_PASSWORD=sizin_password_buraya
KAPITALBANK_CURRENCY=AZN
KAPITALBANK_LANGUAGE=az
KAPITALBANK_REDIRECT_URL=/payment/kapitalbank/callback
KAPITALBANK_SUCCESS_URL=/payment/success
KAPITALBANK_ERROR_URL=/payment/error
KAPITALBANK_LOG_ENABLED=true
sizin_username_buraya və sizin_password_buraya yerinə Kapitalbank-dan aldığınız əsl məlumatları yazınKAPITALBANK_MODE=test
KAPITALBANK_USERNAME=TerminalSys/kapital
KAPITALBANK_PASSWORD=kapital123
KAPITALBANK_MODE=production
KAPITALBANK_USERNAME=your_real_username
KAPITALBANK_PASSWORD=your_real_password
Faylı yadda saxlayın (Ctrl + S).
Bu əmrləri ardıcıl yazın:
php artisan config:clear
php artisan cache:clear
✅ Quraşdırma tamamlandı! İndi istifadəyə keçək.
İndi sizə ödəniş səhifəsi yaratmağı öyrədəcəyəm. Hər addımı diqqətlə izləyin.
Terminalda bu əmri yazın:
php artisan make:controller PaymentController
Bu əmr app/Http/Controllers/PaymentController.php faylını yaradacaq.
app/Http/Controllers/PaymentController.php faylını açın.
İçindəki bütün kodu silin və bu kodu yapışdırın:
<?php
namespace App\Http\Controllers;
use AZPayments\Kapitalbank\Facades\Kapitalbank;
use Illuminate\Http\Request;
class PaymentController extends Controller
{
/**
* Ödəniş formasını göstərir
* İstifadəçi bu səhifədə məbləği daxil edəcək
*/
public function checkout()
{
return view('payment.checkout');
}
/**
* Ödənişi başladır və istifadəçini Kapitalbank səhifəsinə yönləndirir
* Form göndərildikdə bu metod işə düşür
*/
public function pay(Request $request)
{
// Daxil edilən məlumatları yoxlayırıq
$request->validate([
'amount' => 'required|numeric|min:0.1',
]);
try {
// Kapitalbank-da ödəniş yaradırıq
$order = Kapitalbank::createOrder([
'amount' => $request->amount,
'description' => 'Sifariş ödənişi',
'title' => 'Online Ödəniş',
]);
// İstifadəçini Kapitalbank ödəniş səhifəsinə yönləndiririk
// İstifadəçi bu səhifədə kart məlumatlarını daxil edəcək
return $order->redirect();
} catch (\Exception $e) {
// Əgər xəta baş verdisə, istifadəçiyə bildiririk
return back()->with('error', 'Xəta baş verdi: ' . $e->getMessage());
}
}
/**
* Kapitalbank-dan callback gəldikdə bu metod işə düşür
* Ödəniş tamamlandıqdan sonra istifadəçi bura yönləndirilir
*/
public function callback(Request $request)
{
try {
// Callback məlumatlarını yoxlayırıq
$result = Kapitalbank::verifyCallback($request->all());
if ($result['is_successful']) {
// ✅ Ödəniş uğurlu!
// Burada sifarişi "ödənildi" statusuna keçirə bilərsiniz
return redirect('/payment/success')->with([
'order_id' => $result['order_id'],
'message' => 'Ödəniş uğurla tamamlandı!'
]);
}
// ❌ Ödəniş uğursuz
return redirect('/payment/error')->with([
'order_id' => $result['order_id'],
'message' => 'Ödəniş uğursuz oldu.'
]);
} catch (\Exception $e) {
return redirect('/payment/error')->with([
'message' => 'Xəta: ' . $e->getMessage()
]);
}
}
/**
* Ödəniş uğurlu olduqda istifadəçi bu səhifəyə gəlir
*/
public function success()
{
return view('payment.success', [
'order_id' => session('order_id'),
'message' => session('message', 'Ödəniş uğurla tamamlandı!')
]);
}
/**
* Ödəniş uğursuz olduqda istifadəçi bu səhifəyə gəlir
*/
public function error()
{
return view('payment.error', [
'order_id' => session('order_id'),
'message' => session('message', 'Ödəniş uğursuz oldu.')
]);
}
}
Faylı yadda saxlayın (Ctrl + S).
routes/web.php faylını açın.
Faylın sonuna bu kodu əlavə edin:
use App\Http\Controllers\PaymentController;
// Ödəniş səhifəsi - istifadəçi məbləği daxil edir
Route::get('/checkout', [PaymentController::class, 'checkout'])->name('checkout');
// Ödənişi başlat - form göndərildikdə işə düşür
Route::post('/payment/pay', [PaymentController::class, 'pay'])->name('payment.pay');
// Callback - Kapitalbank ödənişdən sonra bura yönləndirir
Route::get('/payment/kapitalbank/callback', [PaymentController::class, 'callback'])->name('payment.callback');
// Uğurlu ödəniş səhifəsi
Route::get('/payment/success', [PaymentController::class, 'success'])->name('payment.success');
// Uğursuz ödəniş səhifəsi
Route::get('/payment/error', [PaymentController::class, 'error'])->name('payment.error');
Diqqət: Əgər faylın yuxarısında artıq use sətirləri varsa, use App\Http\Controllers\PaymentController; sətrini onların yanına əlavə edin.
Faylı yadda saxlayın.
Terminalda:
Windows üçün:
mkdir resources\views\payment
Mac/Linux üçün:
mkdir -p resources/views/payment
resources/views/payment/checkout.blade.php adlı yeni fayl yaradın.
Bu kodu faylın içinə yapışdırın:
<!DOCTYPE html>
<html lang="az">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Ödəniş Et - Kapitalbank</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
background: linear-gradient(135deg, #1e3c72 0%, #2a5298 100%);
min-height: 100vh;
display: flex;
justify-content: center;
align-items: center;
padding: 20px;
}
.payment-container {
background: white;
padding: 40px;
border-radius: 20px;
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
width: 100%;
max-width: 420px;
}
.payment-header {
text-align: center;
margin-bottom: 30px;
}
.payment-header h1 {
color: #1e3c72;
font-size: 28px;
margin-bottom: 10px;
}
.payment-header p {
color: #666;
font-size: 14px;
}
.error-message {
background: #fee2e2;
border: 1px solid #ef4444;
color: #dc2626;
padding: 12px 16px;
border-radius: 8px;
margin-bottom: 20px;
font-size: 14px;
}
.form-group {
margin-bottom: 24px;
}
.form-group label {
display: block;
margin-bottom: 8px;
font-weight: 600;
color: #374151;
font-size: 14px;
}
.form-group input {
width: 100%;
padding: 16px;
border: 2px solid #e5e7eb;
border-radius: 12px;
font-size: 18px;
transition: border-color 0.3s;
}
.form-group input:focus {
outline: none;
border-color: #1e3c72;
}
.pay-button {
width: 100%;
padding: 18px;
background: linear-gradient(135deg, #1e3c72 0%, #2a5298 100%);
color: white;
border: none;
border-radius: 12px;
font-size: 18px;
font-weight: 600;
cursor: pointer;
transition: transform 0.2s, box-shadow 0.2s;
}
.pay-button:hover {
transform: translateY(-2px);
box-shadow: 0 10px 20px rgba(30, 60, 114, 0.3);
}
.security-note {
text-align: center;
margin-top: 24px;
color: #6b7280;
font-size: 12px;
}
.bank-logo {
text-align: center;
margin-bottom: 20px;
}
.bank-logo img {
height: 40px;
}
</style>
</head>
<body>
<div class="payment-container">
<div class="bank-logo">
<img src="https://www.kapitalbank.az/assets/images/logo.svg" alt="Kapitalbank">
</div>
<div class="payment-header">
<h1>💳 Ödəniş Et</h1>
<p>Təhlükəsiz ödəniş sistemi</p>
</div>
@if(session('error'))
<div class="error-message">
{{ session('error') }}
</div>
@endif
<form action="{{ route('payment.pay') }}" method="POST">
@csrf
<div class="form-group">
<label for="amount">Ödəniş məbləği (AZN)</label>
<input
type="number"
id="amount"
name="amount"
step="0.01"
min="0.1"
max="10000"
placeholder="0.00"
required
autofocus
>
</div>
<button type="submit" class="pay-button">
🔒 Ödənişə keç
</button>
</form>
<p class="security-note">
🔐 Ödənişiniz Kapitalbank tərəfindən qorunur
</p>
</div>
</body>
</html>
resources/views/payment/success.blade.php adlı yeni fayl yaradın:
<!DOCTYPE html>
<html lang="az">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Ödəniş Uğurlu</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
background: linear-gradient(135deg, #11998e 0%, #38ef7d 100%);
min-height: 100vh;
display: flex;
justify-content: center;
align-items: center;
padding: 20px;
}
.container {
background: white;
padding: 50px 40px;
border-radius: 20px;
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.2);
text-align: center;
max-width: 420px;
}
.icon {
font-size: 80px;
margin-bottom: 20px;
}
h1 {
color: #11998e;
font-size: 28px;
margin-bottom: 12px;
}
.message {
color: #6b7280;
font-size: 16px;
margin-bottom: 24px;
}
.order-info {
background: #f3f4f6;
padding: 16px;
border-radius: 12px;
margin-bottom: 24px;
}
.btn {
display: inline-block;
padding: 14px 32px;
background: linear-gradient(135deg, #11998e 0%, #38ef7d 100%);
color: white;
border-radius: 10px;
text-decoration: none;
font-weight: 600;
}
.btn:hover {
transform: translateY(-2px);
box-shadow: 0 10px 20px rgba(17, 153, 142, 0.3);
}
</style>
</head>
<body>
<div class="container">
<div class="icon">✅</div>
<h1>Ödəniş Uğurlu!</h1>
<p class="message">{{ $message }}</p>
@if($order_id)
<div class="order-info">
<p>Sifariş ID: <strong>{{ $order_id }}</strong></p>
</div>
@endif
<a href="/" class="btn">Ana səhifəyə qayıt</a>
</div>
</body>
</html>
resources/views/payment/error.blade.php adlı yeni fayl yaradın:
<!DOCTYPE html>
<html lang="az">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Ödəniş Uğursuz</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
background: linear-gradient(135deg, #eb3349 0%, #f45c43 100%);
min-height: 100vh;
display: flex;
justify-content: center;
align-items: center;
padding: 20px;
}
.container {
background: white;
padding: 50px 40px;
border-radius: 20px;
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.2);
text-align: center;
max-width: 420px;
}
.icon {
font-size: 80px;
margin-bottom: 20px;
}
h1 {
color: #eb3349;
font-size: 28px;
margin-bottom: 12px;
}
.message {
color: #6b7280;
font-size: 16px;
margin-bottom: 24px;
}
.buttons {
display: flex;
gap: 12px;
justify-content: center;
}
.btn {
padding: 14px 28px;
border-radius: 10px;
text-decoration: none;
font-weight: 600;
}
.btn-primary {
background: linear-gradient(135deg, #1e3c72 0%, #2a5298 100%);
color: white;
}
.btn-secondary {
background: #f3f4f6;
color: #374151;
}
</style>
</head>
<body>
<div class="container">
<div class="icon">❌</div>
<h1>Ödəniş Uğursuz</h1>
<p class="message">{{ $message }}</p>
<div class="buttons">
<a href="/checkout" class="btn btn-primary">Yenidən cəhd et</a>
<a href="/" class="btn btn-secondary">Ana səhifə</a>
</div>
</div>
</body>
</html>
Terminalda serveri işə salın:
php artisan serve
Brauzerdə açın:
http://127.0.0.1:8000/checkout
Test kartları ilə sınayın:
| Kart növü | Nömrə | Tarix | CVV |
|-----------|-------|-------|-----|
| Visa | 4169741330151778 | 06/25 | 119 |
| Mastercard | 5239151747183468 | 11/24 | 292 |
Müştəri gəlir, pulu blokla. Çıxanda real məbləği çək:
// 1. Rezervasiya zamanı - 500 AZN bloklayırıq
$order = Kapitalbank::createPreAuthOrder([
'amount' => 500.00,
'description' => 'Hotel rezervasiyası',
]);
return $order->redirect();
// 2. Müştəri çıxanda - real məbləği çək
Kapitalbank::completePreAuth($orderId, 450.00);
// 1200 AZN-i 6 aya böl
$order = Kapitalbank::createInstallmentOrder([
'amount' => 1200.00,
'description' => 'iPhone 15 Pro',
], 6); // 6 aylıq taksit
return $order->redirect();
// Tam geri qaytar
Kapitalbank::refund($orderId);
// Qismən qaytar
Kapitalbank::refund($orderId, 50.00);
// Eyni gün ərzində ləğv et
Kapitalbank::reversal($orderId, 'Full');
Ödəniş uğurlu olduqda email göndərmək, sifarişi yeniləmək istəyirsinizsə:
php artisan make:listener HandleKapitalbankPayment
app/Listeners/HandleKapitalbankPayment.php:
<?php
namespace App\Listeners;
use AZPayments\Kapitalbank\Events\PaymentSuccessful;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Mail;
class HandleKapitalbankPayment
{
public function handle(PaymentSuccessful $event)
{
$orderId = $event->orderId;
$amount = $event->getAmount();
$cardMask = $event->getCardMask(); // **** **** **** 1778
// Log yaz
Log::info("Ödəniş alındı: {$orderId}, Məbləğ: {$amount} AZN");
// Sifarişi yenilə
// Order::where('id', $orderId)->update(['status' => 'paid']);
// Email göndər
// Mail::to($customer->email)->send(new PaymentReceived($order));
}
}
app/Providers/AppServiceProvider.php:
use AZPayments\Kapitalbank\Events\PaymentSuccessful;
use App\Listeners\HandleKapitalbankPayment;
use Illuminate\Support\Facades\Event;
public function boot(): void
{
Event::listen(PaymentSuccessful::class, HandleKapitalbankPayment::class);
}
composer dump-autoload
php artisan config:clear
Username və ya password səhvdir. .env faylını yoxlayın.
KAPITALBANK_MODE=test olduğuna əmin olunLocalhost-da callback işləmir. ngrok istifadə edin:
ngrok http 8000
Sonra Kapitalbank-a ngrok URL-ini verin.
| Status | Mənası |
|--------|--------|
| Preparing | Gözləyir ⏳ |
| FullyPaid | Ödənilib ✅ |
| Declined | Rədd edilib 🚫 |
| Reversed | Ləğv edilib ↩️ |
| Refunded | Geri qaytarılıb 💸 |
Problem yarandıqda:
MIT License - istədiyiniz layihədə pulsuz istifadə edin.
Elgun Heydarli
⭐ Bəyəndinizsə GitHub-da Star verməyi unutmayın!