Flutter & Mobil İle Stripe Ödeme Sistemi Entegrasyonu Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Stripe entegrasyonuna başlamadan önce sisteminizde aşağıdaki araçların ve hesapların hazır olması gerekmektedir. Eksik yapılandırmalar ödeme sürecinin çalışmamasına neden olur.

  • Stripe Hesabı: Stripe Dashboard üzerinden ücretsiz bir hesap oluşturun ve "Developers" sekmesinden API anahtarlarınızı (Publishable Key ve Secret Key) alın.
  • Flutter SDK: 3.24 ve üzeri sürümün yüklü olması önerilir.
  • Backend Sunucusu: Güvenlik nedeniyle "Secret Key" asla mobil uygulama içerisinde tutulmamalıdır. Node.js, Python veya Go gibi bir dilde yazılmış, ödeme niyetini (PaymentIntent) oluşturacak bir sunucuya ihtiyacınız var.
  • Flutter Stripe Paketi: flutter_stripe kütüphanesi, Stripe'ın yerel mobil SDK'larını Flutter ile bağlamanızı sağlar.

Stripe SDK Kurulumu ve Yapılandırma

Projenize Stripe entegrasyonunu eklemek için öncelikle bağımlılıkları tanımlamanız gerekir. pubspec.yaml dosyanıza ilgili paketi ekleyerek işe başlayın.

dependencies:
  flutter:
    sdk: flutter
  flutter_stripe: ^10.0.0 # 2026 güncel versiyonu kontrol edin
  http: ^1.2.0

Android tarafında android/app/build.gradle dosyasında minSdkVersion değerinin en az 21 olduğundan emin olun. Ayrıca MainActivity dosyanızın FlutterFragmentActivity sınıfından türetilmesi, ödeme ekranlarının doğru görüntülenmesi için gereklidir.

Backend Tarafında PaymentIntent Oluşturma

Güvenlik protokolleri gereği, ödeme tutarı ve para birimi gibi hassas bilgiler sunucu tarafında belirlenmelidir. Mobil uygulama, sunucunuzdan gelen "Client Secret" değerini alarak ödeme işlemini başlatır.

// Node.js/Express örneği
const stripe = require('stripe')('sk_test_...');

app.post('/create-payment-intent', async (req, res) => {
  const paymentIntent = await stripe.paymentIntents.create({
    amount: 1000, // 10.00 TL (en küçük birim)
    currency: 'try',
    automatic_payment_methods: { enabled: true },
  });
  res.json({ paymentIntent: paymentIntent.client_secret });
});

Bu kod bloğu, Stripe API'sine bir ödeme isteği gönderir ve işlem için gerekli olan benzersiz bir "Client Secret" anahtarı döndürür. Bu anahtar, mobil uygulamada ödeme işlemini tamamlamak için kullanılacaktır.

Flutter Uygulamasında Ödeme Ekranını Tetikleme

Sunucudan aldığınız client_secret değerini kullanarak Stripe'ın sunduğu hazır ödeme arayüzünü (Payment Sheet) başlatabilirsiniz. Bu yöntem, PCI uyumluluğunu (kart bilgilerinin güvenliğini) Stripe'ın yönetmesini sağlar.

import 'package:flutter_stripe/flutter_stripe.dart';

Future initPaymentSheet(String clientSecret) async {
  await Stripe.instance.initPaymentSheet(
    paymentSheetParameters: SetupPaymentSheetParameters(
      merchantDisplayName: 'Uygulama Adınız',
      paymentIntentClientSecret: clientSecret,
      style: ThemeMode.light,
    ),
  );
}

Future presentPaymentSheet() async {
  try {
    await Stripe.instance.presentPaymentSheet();
    print("Ödeme Başarılı!");
  } catch (e) {
    print("Ödeme İptal Edildi veya Hata Oluştu: $e");
  }
}

initPaymentSheet fonksiyonu ödeme ekranını hazırlar, presentPaymentSheet ise kullanıcıya kart bilgilerini girebileceği güvenli pencereyi açar. İşlem sonucunda Stripe, ödemenin durumunu size bildirir.

Stripe Entegrasyon Yöntemlerinin Karşılaştırılması

Stripe entegrasyonunda farklı yaklaşımlar mevcuttur. Uygulamanızın ihtiyacına göre en uygun yöntemi seçmelisiniz.

Yöntem Avantajı Dezavantajı
Payment Sheet Hızlı entegrasyon, yüksek güvenlik Arayüz özelleştirme sınırlı
Custom UI Tam tasarım kontrolü PCI uyumluluğu zorunluluğu
Stripe Checkout Web tabanlı, en kolay kurulum Uygulama içi deneyim kesintili
Kritik Güvenlik Uyarısı: Stripe Secret Key (sk_...) değerlerini asla uygulama kodunuzun içerisinde (hardcoded) saklamayın. Bu anahtarlar, hesabınız üzerindeki tüm işlemleri yetkilendirir. Sadece sunucu tarafında (backend) kullanılmalıdır.

Yaygın Hatalar ve Debug İpuçları

Geliştirme aşamasında sıkça karşılaşılan "Invalid API Key" veya "PaymentIntent not found" hataları genellikle yanlış yapılandırmadan kaynaklanır. Stripe Dashboard üzerindeki "Logs" sekmesi, hangi isteğin neden başarısız olduğunu anlamanız için en iyi kaynaktır.

Özellikle ödeme sırasında "3D Secure" doğrulamasının tetiklenmesi durumunda uygulamanızın arka planda kalmaması için await yapılarını doğru kullandığınızdan emin olun. Test kartı numaralarını kullanarak (örneğin 4242 4242...) tüm senaryoları (başarılı, reddedilen, 3D secure) test etmeyi unutmayın.

Sıkça Sorulan Sorular

Stripe Türkiye'de kullanılabiliyor mu?

Stripe, Türkiye'de doğrudan bir tüzel kişilik olarak tam hizmet vermemektedir. Ancak "Stripe Atlas" gibi çözümlerle veya yurt dışında kurulu bir şirket üzerinden Stripe hesabı açarak ödeme almanız mümkündür.

Ödeme sırasında kart bilgileri benim sunucumdan geçer mi?

Hayır. Stripe'ın Flutter SDK'sı, kart bilgilerini doğrudan Stripe sunucularına şifreli bir şekilde gönderir. Sunucunuz sadece ödeme sonucunu ve ödeme niyetini (PaymentIntent) yönetir.

Test kartı numaralarını nereden bulabilirim?

Stripe'ın geliştirici dokümantasyonunda, farklı senaryoları (başarılı ödeme, yetersiz bakiye, reddedilen kart) test etmek için kullanabileceğiniz özel test kartı numaraları listelenmiştir.

Ödeme başarısız olursa ne yapmalıyım?

Ödeme başarısız olduğunda StripeException yakalanır. Bu hatanın içindeki error.code değerini kontrol ederek kullanıcıya anlamlı bir hata mesajı (örneğin "Kartınız reddedildi" veya "Bankanızla iletişime geçin") gösterebilirsiniz.

Abonelik (Subscription) sistemi kurabilir miyim?

Evet, Stripe API'si "Subscriptions" (Abonelikler) yapısını destekler. PaymentIntent yerine "SetupIntent" kullanarak kullanıcının kartını kaydedebilir ve daha sonra periyodik ödemeler alabilirsiniz.

Stripe Webhook Entegrasyonu ile Ödeme Durumlarını İzleme

Ödeme işleminin mobil uygulama tarafında başarılı görünmesi, işlemin sunucu tarafında da kesinleştiği anlamına gelmez. Kullanıcı ödemeyi tamamladıktan sonra internet bağlantısı kopabilir veya uygulama arka plana atılabilir. Bu tür senaryolarda veritabanınızın güncel kalmasını sağlamak için Stripe Webhook'larını kullanmak kritik bir zorunluluktur.

Webhook Endpoint'i Oluşturma

Stripe, ödeme durumu değiştiğinde (örneğin payment_intent.succeeded) sunucunuza bir HTTP POST isteği gönderir. Node.js ve Express kullanarak basit bir webhook dinleyicisi şu şekilde yapılandırılır:

const express = require('express');
const app = express();
const stripe = require('stripe')('sk_test_...');

app.post('/webhook', express.raw({type: 'application/json'}), (request, response) => {
  const sig = request.headers['stripe-signature'];
  let event;

  try {
    event = stripe.webhooks.constructEvent(request.body, sig, 'whsec_...');
  } catch (err) {
    return response.status(400).send(`Webhook Hatası: ${err.message}`);
  }

  if (event.type === 'payment_intent.succeeded') {
    const paymentIntent = event.data.object;
    console.log('Ödeme Başarılı:', paymentIntent.id);
    // Burada veritabanı güncelleme işlemlerinizi yapın
  }

  response.json({received: true});
});

Ödeme Deneyimini İyileştirmek İçin İleri İpuçları

Kullanıcı deneyimini (UX) artırmak ve dönüşüm oranlarını yükseltmek için ödeme akışınızda şu stratejileri uygulayabilirsiniz:

  • Ödeme Öncesi Doğrulama: Kullanıcı "Öde" butonuna basmadan önce, sepet tutarının sunucuda tekrar hesaplanarak doğrulanmasını sağlayın.
  • Hata Yönetimi ve Kullanıcı Geri Bildirimi: Stripe'tan dönen hata kodlarını (card_declined, expired_card vb.) kullanıcıya anlaşılır bir dille (lokalize edilmiş şekilde) gösterin.
  • Güvenli Kayıtlı Kartlar: Stripe'ın Customer nesnesini kullanarak kullanıcıların kartlarını güvenli bir şekilde saklayın ve bir sonraki alışverişlerinde tekrar kart bilgisi girmelerini engelleyin.

Kullanıcı Deneyimi İçin Hata Yakalama Örneği

Flutter tarafında ödeme sırasında oluşabilecek hataları yakalamak için try-catch bloklarını özelleştirin:

try {
  await Stripe.instance.presentPaymentSheet();
  // Ödeme başarılı
} on StripeException catch (e) {
  if (e.error.code == FailureCode.Canceled) {
    print('Kullanıcı ödemeyi iptal etti.');
  } else {
    print('Ödeme hatası: ${e.error.localizedMessage}');
  }
} catch (e) {
  print('Beklenmedik bir hata oluştu: $e');
}

Bu yaklaşım, uygulamanızın finansal işlemler sırasında çökmesini engeller ve kullanıcıya profesyonel bir arayüz sunmanıza olanak tanır. Unutmayın ki, ödeme sistemlerinde kullanıcıya şeffaf bilgi vermek, güveni artıran en önemli unsurdur.

Sonuç

Flutter & mobil ile Stripe ödeme sistemi entegrasyonu, doğru adımlar izlendiğinde oldukça güvenli ve sürdürülebilir bir süreçtir. Bu rehberde, sunucu tabanlı bir ödeme akışının nasıl kurulacağını, Flutter Stripe SDK'sının nasıl yapılandırılacağını ve güvenlik standartlarının neden önemli olduğunu ele aldık. Bir sonraki adım olarak, Stripe Webhook'larını kullanarak ödeme onaylarını sunucunuzda dinlemeyi ve veritabanınızı güncellemeyi öğrenmenizi öneririm.

Yasal Sorumluluk Reddi: Bu makale sadece yazılım eğitimi amacıyla hazırlanmıştır. Ödeme sistemleri ve finansal işlemlerle ilgili yasal düzenlemeler ülkeye göre değişiklik gösterebilir. Uygulamanızda canlı ödeme sistemlerini devreye almadan önce bir hukuk danışmanına veya mali müşavire danışmanız, yerel mevzuata uyum sağlamanız açısından önemlidir.
Bu yazıya tepkinizi paylaşın:
Selin Yılmaz

Kullanıcı odaklı rehberler hazırlama konusunda uzmanım. Adım adım anlatımlarla karmaşık süreçleri herkes için anlaşılır kılıyorum.

Yorumlar (16)

16
okuyucu bu yazı hakkında yorum yaptı. Siz de deneyiminizi paylaşarak diğer okuyuculara yardımcı olabilirsiniz.
Caner Gök
Caner Gök 30 Temmuz 2026

Selin hanım elinize sağlık, uzun zamandır bu konuyu net anlatan bir Türkçe kaynak arıyordum. Özellikle backend tarafındaki webhook yapılandırması çok iyi olmuş.

Selin Yılmaz
Selin Yılmaz 01 Ağustos 2026

Çok teşekkürler Caner, webhook kısmı genelde en çok hata yapılan yer olduğu için oraya özellikle değinmek istedim.

Deniz Kılıç
Deniz Kılıç 02 Ağustos 2026

Ya ben bu stripe entegrasyonunda sürekli 402 hatası alıyom, kodları birebir kopyaladım aslında ama neden olabilir bi fikriniz var mı?

Emre Can
Emre Can 03 Ağustos 2026

API anahtarlarını test modunda mı kullanıyorsun? Bazen live key ile test yapmaya çalışınca o hatayı veriyo.

Zeynep Aras
Zeynep Aras 03 Ağustos 2026

Harika bir rehber olmuş. Peki Türkiye'deki banka kartları için 3D Secure zorunluluğunu bu akışta nasıl tetikleyebiliriz? Ek bir kütüphane gerekiyor mu?

Selin Yılmaz
Selin Yılmaz 04 Ağustos 2026

Zeynep, Stripe'ın Payment Intents API'si otomatik olarak 3D Secure yönlendirmelerini yönetiyor, ek bir kütüphaneye gerek kalmıyor genelde.

Seda Yılmaz
Seda Yılmaz 03 Ağustos 2026

Cok güzel anlatım olmuş, elinize sağlık. Stripe yerine Iyzico mu kullansak daha kolay olur acaba?

Fatih Demir
Fatih Demir 05 Ağustos 2026

Eğer yurt dışına açılacaksan Stripe şart ama sadece Türkiye ise Iyzico evet çok daha basit, entegrasyonu 15 dakikada bitiyo.

Burak Özdemir
Burak Özdemir 04 Ağustos 2026

Flutter tarafında provider kullanırken state yönetimi biraz karmaşıklaşabiliyor, keşke o kısma da bi örnek kod bloğu ekleseydiniz.

Selin Yılmaz
Selin Yılmaz 05 Ağustos 2026

Haklısınız Burak, bir sonraki yazımda Provider veya Riverpod ile ödeme state'ini yönetmeyi detaylıca anlatmayı planlıyorum.

Mertcan S.
Mertcan S. 05 Ağustos 2026

Yazıda bahsettiğiniz kütüphane versiyonu biraz eski kalmış sanki, yeni güncelleme ile bazı fonksiyonlar değişmiş, güncellerseniz süper olur.

Ayşegül Tekin
Ayşegül Tekin 05 Ağustos 2026

Stripe hesabını Türkiye'den doğrulatmak biraz zor diye duymuştum, bu konuda deneyimi olan var mı?

Selin Yılmaz
Selin Yılmaz 06 Ağustos 2026

Evet, Stripe'ın doğrudan Türkiye desteği yok, şirketinizin yurt dışında (Stripe destekleyen ülkelerde) olması gerekiyor maalesef.

Hakan K.
Hakan K. 06 Ağustos 2026

Abi çok açıklayıcı olmuş valla, kafamdaki soru işaretleri gitti. Emeğinize sağlık.

Selma Nur
Selma Nur 06 Ağustos 2026

Flutter ve Stripe uyumu gerçekten çok başarılı. Sadece dokümantasyon bazen kafa karıştırıcı olabiliyor, sizin sayenizde çözdüm.

Kerem Y.
Kerem Y. 07 Ağustos 2026

Dostum ellerine saglık, çok temiz bi çalışma olmuş. Kodları denicem birazdan.

Yorum Yaz