webandmob

Laravel PayTR Entegrasyonu: Adım Adım Kurulum ve Ödeme İşlemleri

Laravel projelerinde online ödeme almak için en popüler çözümlerden biri PayTR’dir. PayTR, sanal POS hizmeti sunarak hızlı ve güvenli ödeme işlemleri yapmanıza olanak tanır. Bu yazıda, Laravel projenize PayTR’yi nasıl entegre edebileceğinizi adım adım anlatacağız.

PayTR Nedir ve Neden Kullanılmalı?

PayTR, Türkiye’deki e-ticaret siteleri için uygun maliyetli ve güvenilir bir ödeme altyapısı sunar. Başlıca avantajları şunlardır:

  • Kolay Entegrasyon: API’leri ve dökümantasyonu ile hızlı bir şekilde entegre edilebilir.

  • Güvenlik: PCI-DSS uyumluluğu sayesinde güvenli ödeme sağlar.

  • Tek Çekim ve Taksit Seçenekleri: Kullanıcılara esnek ödeme imkanı sunar.

PayTR API Entegrasyonu için Hazırlık

Öncelikle PayTR hesabınızdan API bilgilerini almanız gerekiyor:

  • Mağaza No (Merchant ID)

  • API Anahtarı (Merchant Key)

  • Gizli Anahtar (Merchant Salt)

Bu bilgileri almak için PayTR paneline giriş yaparak “API Bilgileri” bölümünü ziyaret edebilirsiniz.

Laravel Projesine PayTR Entegrasyonu

Composer ile Gerekli Paketi Kurma

Öncelikle PayTR’yi Laravel projenize entegre etmek için aşağıdaki Composer komutunu çalıştırarak gerekli kütüphaneyi yükleyin:

composer require paytr/paytr

.env Dosyasına PayTR API Bilgilerini Ekleme

Projenizin .env dosyasına PayTR bilgilerinizi ekleyin:

PAYTR_MERCHANT_ID=your_merchant_id
PAYTR_MERCHANT_KEY=your_merchant_key
PAYTR_MERCHANT_SALT=your_merchant_salt

Ödeme Formu Oluşturma

Bir ödeme talebi oluşturmak için, Laravel’de bir kontrolcü oluşturun:

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;

class PaymentController extends Controller
{
    public function createPayment(Request $request)
    {
        $merchant_id = env('PAYTR_MERCHANT_ID');
        $merchant_key = env('PAYTR_MERCHANT_KEY');
        $merchant_salt = env('PAYTR_MERCHANT_SALT');

        $user_ip = request()->ip();
        $email = 'test@example.com';
        $payment_amount = 10000; // 100.00 TL
        $merchant_oid = uniqid();
        $ok_url = route('payment.success');
        $fail_url = route('payment.fail');
        $user_basket = base64_encode(json_encode([
            ["Ürün Adı", "100.00", 1]
        ]));

        $hash_str = $merchant_id . $user_ip . $merchant_oid . $email . $payment_amount . $ok_url . $fail_url . $user_basket . $merchant_salt;
        $paytr_token = base64_encode(hash_hmac('sha256', $hash_str, $merchant_key, true));

        $post_vals = [
            'merchant_id' => $merchant_id,
            'user_ip' => $user_ip,
            'merchant_oid' => $merchant_oid,
            'email' => $email,
            'payment_amount' => $payment_amount,
            'paytr_token' => $paytr_token,
            'user_basket' => $user_basket,
            'debug_on' => 1,
            'no_installment' => 0,
            'max_installment' => 12,
            'currency' => 'TL'
        ];

        $response = Http::asForm()->post('https://www.paytr.com/odeme/api/get-token', $post_vals);
        $result = $response->json();

        if ($result['status'] == 'success') {
            return view('payment.form', ['token' => $result['token']]);
        } else {
            return back()->with('error', $result['reason']);
        }
    }
}

Ödeme Başarı ve Hata Sayfaları

Başarılı ve başarısız ödeme işlemleri için yönlendirme yapacak rotaları tanımlayın:

Route::get('/payment/success', function () {
    return 'Ödeme başarılı!';
})->name('payment.success');

Route::get('/payment/fail', function () {
    return 'Ödeme başarısız!';
})->name('payment.fail');

Güvenlik Önlemleri ve En İyi Uygulamalar

Webhook Kullanımı

Ödemelerin doğrulanması için PayTR’nin callback (webhook) özelliğini kullanabilirsiniz. Callback için bir endpoint oluşturun:

Route::post('/payment/callback', [PaymentController::class, 'callback']);
public function callback(Request $request)
{
    $hash = base64_encode(hash_hmac('sha256', $request->merchant_oid . env('PAYTR_MERCHANT_SALT'), env('PAYTR_MERCHANT_KEY'), true));
    
    if ($hash !== $request->hash) {
        return response('PAYTR notification failed', 403);
    }

    if ($request->status === 'success') {
        // Ödeme başarılı, veritabanına kaydedin
    }

    return response('OK', 200);
}

Test Ortamında Ödeme İşlemi Simülasyonu

PayTR, entegrasyonu test etmek için bir sandbox ortamı sunar. Test kart bilgileriyle işlemlerinizi deneyebilirsiniz. Örnek test kartı bilgileri:

Kart Numarası: 4111 1111 1111 1111
Son Kullanma Tarihi: 12/26
CVV: 000

Not: Test işlemleri için PayTR panelinizde “Test Modu”nu etkinleştirmeniz gerekir.

Bu yazıda, Laravel projelerine PayTR entegrasyonunun nasıl yapılacağını adım adım anlattık. Başarılı bir ödeme entegrasyonu için API bağlantıları, güvenlik önlemleri ve webhook gibi konulara dikkat etmelisiniz.