Takip et

Uygulamanızı Dağıtmadan Stripe Webhook’larını Yerel Olarak Test Etme

C: Hayır, genellikle farklıdır. Stripe CLI, stripe listen komutunu çalıştırdığınızda size özel bir yerel test gizli anahtarı (whsec_…) sağlar…

Uygulamanızı Dağıtmadan Stripe Webhook’larını Yerel Olarak Test Etme

Stripe, modern web uygulamaları için vazgeçilmez bir ödeme altyapısıdır ve entegrasyon sürecinde webhook’lar kritik bir rol oynar. Webhook’lar, Stripe hesabınızda belirli olaylar (örneğin, başarılı bir ödeme, abonelik değişikliği) meydana geldiğinde uygulamanıza bildirim gönderen otomatik HTTP POST istekleridir. Bu olaylara doğru şekilde yanıt vermek, uygulamanızın finansal süreçlerini sorunsuz yönetmesi için hayati öneme sahiptir. Ancak, geliştirme aşamasında uygulamanızı her seferinde canlı bir sunucuya dağıtmadan bu webhook’ları yerel olarak test etmek, geliştirme hızınızı artırır ve hata ayıklama sürecini büyük ölçüde kolaylaştırır. Bu makalede, uygulamanızı dağıtmadan Stripe webhook’larını nasıl etkili bir şekilde test edebileceğinizi adım adım inceleyeceğiz.

Neden Yerel Webhook Testi Önemli?

Stripe entegrasyonu yaparken, uygulamanızın ödeme akışındaki her adımı doğru şekilde ele aldığından emin olmanız gerekir. Webhook’lar, bu akışın kritik bir parçasıdır ve doğru çalışmadığında veri tutarsızlıklarına, hatalı kullanıcı deneyimlerine veya hatta finansal kayıplara yol açabilir.

Geliştirme Sürecini Hızlandırma

Uygulamanızı her küçük değişiklikte canlı bir sunucuya dağıtmak zaman alıcı ve zahmetlidir. Yerel test, kodunuzu anında test etmenize olanak tanıyarak geliştirme döngüsünü kısaltır ve daha hızlı iterasyonlar yapmanızı sağlar. Bu, özellikle karmaşık iş mantığına sahip webhook işleyicileri geliştirirken büyük bir avantajdır.

Hata Ayıklama Kolaylığı

Yerel bir ortamda çalışırken, uygulamanızın loglarına ve hata mesajlarına doğrudan erişiminiz olur. Bu, bir webhook olayının neden beklediğiniz gibi işlenmediğini anlamak için daha kolay ve hızlı bir yol sunar. Canlı ortamda bu tür sorunları teşhis etmek, genellikle daha fazla araç ve yapılandırma gerektirir.

Güvenlik ve Veri Gizliliği

Geliştirme aşamasında gerçek müşteri verileriyle çalışmaktan kaçınmak her zaman en iyi uygulamadır. Yerel test ortamında, sahte veya test verileri kullanarak Stripe webhook’larını simüle edebilir, böylece hassas bilgilerin yanlışlıkla açığa çıkması riskini ortadan kaldırabilirsiniz. Bu, özellikle GDPR gibi veri gizliliği düzenlemelerine uyum açısından önemlidir.

Stripe Webhook’ları ve Çalışma Prensibi

Stripe webhook’ları, belirli bir olayın (event) gerçekleştiğini uygulamanıza bildiren otomatik HTTP POST istekleridir. Bu istekler, olayla ilgili verileri içeren bir JSON yükü taşır.

Webhook Olay Türleri

Stripe, çeşitli olay türlerini destekler. Örneğin:

  • checkout.session.completed: Bir ödeme oturumu başarıyla tamamlandığında.
  • payment_intent.succeeded: Bir ödeme amacı başarıyla tamamlandığında.
  • customer.subscription.created: Yeni bir abonelik oluşturulduğunda.
  • invoice.payment_succeeded: Bir fatura başarıyla ödendiğinde.

Uygulamanız, sadece ilgilendiği olay türlerini dinleyerek gereksiz trafiği önleyebilir ve daha verimli çalışabilir.

Webhook Güvenliği: İmza Doğrulama

Stripe, webhook isteklerinin gerçekten kendisinden geldiğini doğrulamanız için her isteğe bir imza (signature) ekler. Bu imza, webhook gizli anahtarınız (webhook secret) kullanılarak oluşturulur. Uygulamanızın bu imzayı doğrulaması, kötü niyetli üçüncü tarafların sahte webhook istekleri göndererek sisteminizi manipüle etmesini engeller. Yerel test yaparken bile bu doğrulama adımını atlamamak önemlidir.

Geleneksel Yaklaşımların Zorlukları

Uygulamanızı yerel olarak çalıştırırken, Stripe gibi harici bir hizmetin yerel sunucunuza doğrudan istek göndermesi mümkün değildir çünkü yerel sunucunuz internetten erişilebilir değildir. Bu durum, yerel webhook testini zorlaştıran temel engeldir.

Firewall ve NAT Engelleri

Çoğu geliştirici, yerel ağında bir firewall veya NAT (Network Address Translation) arkasında çalışır. Bu güvenlik önlemleri, dışarıdan gelen bağlantıları engeller ve Stripe’ın webhook isteğini yerel sunucunuza ulaştırmasını imkansız hale getirir. Bu, güvenlik açısından iyi olsa da geliştirme sürecinde bir kısıtlamadır.

Manuel Dağıtımın Getirdiği Yük

Bu engelleri aşmak için bazı geliştiriciler, her test için kodlarını bir test veya geliştirme sunucusuna dağıtmayı tercih eder. Ancak bu, yukarıda bahsedildiği gibi zaman alıcıdır ve hata ayıklama sürecini yavaşlatır. Sürekli dağıtım ve geri alma, geliştirme iş akışını bozar ve verimliliği düşürür.

Webhook Gizli Anahtarlarının Yönetimi

Canlı ve test ortamları için farklı webhook gizli anahtarları kullanmak, güvenlik açısından iyi bir uygulamadır. Ancak manuel dağıtım senaryolarında, bu anahtarların doğru şekilde yönetilmesi ve ortamlar arasında karışıklık yaşanmaması ek bir dikkat gerektirir.

Yerel Test Araçları: Stripe CLI

Stripe CLI (Command Line Interface), Stripe’ın geliştiriciler için sunduğu en güçlü yerel test araçlarından biridir. Uygulamanızı dağıtmadan webhook olaylarını dinlemenize ve tetiklemenize olanak tanır.

Stripe CLI Kurulumu

Stripe CLI’yı kurmak oldukça basittir. İşletim sisteminize göre farklı kurulum yöntemleri mevcuttur.


# macOS (Homebrew ile)
brew install stripe/stripe-cli/stripe

# Debian/Ubuntu
sudo apt update && sudo apt install stripe

# Windows (Chocolatey ile)
choco install stripe-cli


Kurulumdan sonra, Stripe hesabınızla CLI'yı bağlamanız gerekir:


stripe login


Bu komut, tarayıcınızda bir oturum açma penceresi açacak ve CLI'yı Stripe hesabınıza bağlayacaktır.

Webhook Olaylarını Yerel Olarak Dinleme

Stripe CLI'nın en kullanışlı özelliklerinden biri, yerel sunucunuzdaki bir uç noktayı (endpoint) internete açmadan webhook olaylarını dinleyebilmesidir.


stripe listen --forward-to localhost:3000/webhook


Bu komut, Stripe CLI'yı yerel sunucunuzun localhost:3000/webhook adresine gelen webhook olaylarını dinlemesi için yapılandırır. CLI, Stripe'tan gelen gerçek webhook olaylarını yakalar ve bunları doğrudan yerel uç noktanıza iletir. Ayrıca, size bir webhook gizli anahtarı (whsec_...) sağlayacaktır. Bu anahtarı uygulamanızın webhook doğrulama kodunda kullanmanız gerekecektir.

Test Olaylarını Tetikleme

Stripe CLI ile belirli test olaylarını manuel olarak tetikleyebilirsiniz. Bu, uygulamanızın farklı senaryolara nasıl tepki verdiğini test etmek için idealdir.


stripe trigger payment_intent.succeeded


Bu komut, başarılı bir ödeme amacı olayını tetikler ve Stripe CLI aracılığıyla yerel sunucunuza iletilir. Diğer olay türlerini de tetikleyebilirsiniz:


stripe trigger checkout.session.completed
stripe trigger customer.subscription.created


Bu sayede, uygulamanızın farklı webhook olaylarına verdiği tepkileri hızlıca test edebilirsiniz.

Alternatifler: Ngrok ve Benzeri Tünelleme Hizmetleri

Stripe CLI harika bir araç olsa da, bazen gerçek bir genel URL'ye ihtiyacınız olabilir. Örneğin, bir Stripe Checkout oturumu oluşturduğunuzda, başarılı veya iptal edilen bir ödeme sonrası kullanıcıyı yönlendireceğiniz success_url ve cancel_url gibi URL'lerin genel olarak erişilebilir olması gerekir. İşte bu noktada Ngrok gibi tünelleme hizmetleri devreye girer.

Ngrok Nedir ve Nasıl Çalışır?

Ngrok, yerel sunucunuzu internete açan güvenli bir tünel oluşturan bir hizmettir. Yerel sunucunuzda çalışan bir uygulamaya genel bir URL (örneğin, https://abcdef12345.ngrok.io) atar. Bu sayede, Stripe gibi harici hizmetler, bu genel URL üzerinden yerel sunucunuza webhook istekleri gönderebilir.

Ngrok Kurulumu ve Kullanımı

Ngrok'u kurmak da oldukça basittir:

  1. Ngrok web sitesinden (ngrok.com) indirin ve hesabınızı oluşturun.
  2. İndirdiğiniz dosyayı PATH'inize ekleyin veya doğrudan çalıştırın.
  3. Kimlik doğrulama belirtecinizi (auth token) ekleyin:
    ngrok authtoken 

  4. Yerel sunucunuzu tünelleyin (örneğin, 3000 portunda çalışan bir sunucu için):
    ngrok http 3000

Bu komutu çalıştırdığınızda, Ngrok size genel bir HTTPS URL'si sağlayacaktır. Bu URL'yi Stripe webhook ayarlarınızda veya Stripe API çağrılarınızdaki yönlendirme URL'lerinde kullanabilirsiniz.

Stripe Webhook Ayarlarını Güncelleme

Ngrok veya benzeri bir hizmet kullanarak genel bir URL elde ettiğinizde, Stripe geliştirici paneline giderek webhook uç noktanızı bu yeni URL ile güncellemeniz gerekir.

  1. Stripe Geliştirici Paneli'ne gidin.
  2. "Webhooks" bölümüne tıklayın.
  3. "Add an endpoint" (Uç nokta ekle) veya mevcut bir uç noktayı düzenle seçeneğini kullanın.
  4. Ngrok tarafından sağlanan HTTPS URL'sini (örneğin, https://abcdef12345.ngrok.io/webhook) girin.
  5. İlgilendiğiniz olay türlerini seçin.
  6. Uç noktayı kaydedin.

Bu adımları tamamladıktan sonra, Stripe hesabınızda gerçekleşen olaylar, Ngrok tüneli aracılığıyla yerel sunucunuza iletilecektir.

Uygulamanızı Yapılandırma ve Olayları Dinleme

Webhook'ları yerel olarak test ederken, uygulamanızın gelen istekleri doğru şekilde işleyebilmesi için bazı yapılandırmalar yapmanız gerekir.

Webhook İşleyici Oluşturma

Uygulamanızda, Stripe'tan gelen POST isteklerini kabul edecek bir uç nokta (endpoint) oluşturmanız gerekir. Bu uç nokta, gelen JSON yükünü ayrıştırmalı ve webhook imzasını doğrulamalıdır. İşte Node.js (Express) ile basit bir örnek:


const express = require('express');
const app = express();
const stripe = require('stripe')('sk_test_YOUR_STRIPE_SECRET_KEY'); // Test anahtarınızı kullanın

// Raw body'yi almak için express.raw() middleware'i kullanın
app.post('/webhook', express.raw({ type: 'application/json' }), (request, response) => {
    const sig = request.headers['stripe-signature'];
    let event;
    const webhookSecret = process.env.STRIPE_WEBHOOK_SECRET_LOCAL; // Yerel webhook gizli anahtarınız

    try {
        event = stripe.webhooks.constructEvent(request.body, sig, webhookSecret);
    } catch (err) {
        console.error(Webhook imza doğrulama hatası: ${err.message});
        return response.status(400).send(Webhook Error: ${err.message});
    }

    // Olay türüne göre işlem yapın
    switch (event.type) {
        case 'payment_intent.succeeded':
            const paymentIntent = event.data.object;
            console.log(PaymentIntent başarılı: ${paymentIntent.id});
            // Veritabanınızı güncelleme, e-posta gönderme vb. işlemleri yapın
            break;
        case 'checkout.session.completed':
            const session = event.data.object;
            console.log(Checkout Session tamamlandı: ${session.id});
            // Müşteri ve abonelik oluşturma işlemleri
            break;
        // Diğer olay türleri...
        default:
            console.log(İşlenmeyen olay türü: ${event.type});
    }

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

app.listen(3000, () => console.log('Webhook sunucusu 3000 portunda dinliyor!'));


Bu örnekte, express.raw() middleware'i, Stripe'ın imzayı doğrulaması için gerekli olan ham isteği (raw request body) elde etmek için kullanılır. STRIPE_WEBHOOK_SECRET_LOCAL değişkenini, Stripe CLI'dan veya Ngrok kullanarak Stripe panelinden aldığınız yerel test webhook gizli anahtarıyla doldurmayı unutmayın.

Ortam Değişkenlerinin Yönetimi

Yerel test yaparken, farklı Stripe API anahtarları ve webhook gizli anahtarları kullanmanız gerekebilir. Bunları doğrudan kodunuza yazmak yerine, ortam değişkenleri (environment variables) aracılığıyla yönetmek en iyi uygulamadır. Örneğin, .env dosyaları veya işletim sisteminizin ortam değişkenleri bu amaçla kullanılabilir.


# .env dosyası örneği
STRIPE_SECRET_KEY=sk_test_YOUR_STRIPE_SECRET_KEY
STRIPE_WEBHOOK_SECRET_LOCAL=whsec_YOUR_LOCAL_WEBHOOK_SECRET


Bu sayede, canlı ortamda farklı anahtarlar kullanarak güvenlik ve esneklik sağlayabilirsiniz.

En İyi Uygulamalar ve İpuçları

Yerel webhook test sürecinizi daha verimli ve güvenli hale getirmek için bazı en iyi uygulamaları takip etmek önemlidir.

İmza Doğrulamayı Her Zaman Uygulayın

Yerel ortamda bile webhook imza doğrulamasını atlamayın. Bu, uygulamanızın güvenlik katmanını oluşturur ve canlıya geçtiğinizde sorun yaşamanızı engeller. Stripe CLI veya Ngrok kullanırken size sağlanan yerel webhook gizli anahtarını kullandığınızdan emin olun.

İdempotent İşleyiciler Oluşturun

Webhook istekleri bazen ağ sorunları nedeniyle birden fazla kez gönderilebilir. Uygulamanızın aynı olayı birden fazla kez işlediğinde sorun yaratmaması için webhook işleyicilerinizi idempotent (aynı işlemi birden fazla kez yapıldığında aynı sonucu veren) olacak şekilde tasarlayın. Genellikle, bir olayın benzersiz kimliğini (event.id) veritabanınızda saklayarak ve her olayı yalnızca bir kez işleyerek bu sağlanabilir.

Asenkron İşleme Kullanın

Webhook işleyicinizde uzun süren işlemler (örneğin, e-posta gönderme, karmaşık veritabanı güncellemeleri) yapmaktan kaçının. Stripe, webhook isteğine hızlı bir yanıt (200 OK) bekler. Uzun süren işlemler, Stripe'ın isteği zaman aşımına uğratmasına ve tekrar göndermesine neden olabilir. Bunun yerine, gelen webhook olayını hızlıca bir kuyruğa (message queue) ekleyip, bu olayları ayrı bir işçi (worker) süreciyle asenkron olarak işlemeyi tercih edin.

Test Verileri Kullanın

Gerçek müşteri verileri yerine Stripe'ın test modunu ve test kart numaralarını kullanın. Bu, geliştirme aşamasında hassas verilerin yanlışlıkla işlenmesini veya açığa çıkmasını önler.

Farklı Olay Türlerini Kapsamlı Test Edin

Uygulamanızın sadece başarılı ödemeleri değil, aynı zamanda iptaller, iadeler, abonelik değişiklikleri ve hata durumları gibi tüm ilgili webhook olaylarını doğru şekilde işlediğinden emin olun. Stripe CLI'nın stripe trigger komutu, bu farklı senaryoları kolayca simüle etmenize olanak tanır.

Sonuç

Stripe webhook'larını uygulamanızı dağıtmadan yerel olarak test etmek, modern web geliştirme sürecinin ayrılmaz bir parçasıdır. Stripe CLI ve Ngrok gibi araçlar sayesinde, geliştiriciler hızlı iterasyonlar yapabilir, hataları kolayca ayıklayabilir ve güvenli bir geliştirme ortamında çalışabilirler. Bu makalede ele alınan adımları ve en iyi uygulamaları takip ederek, Stripe entegrasyonunuzun sağlam ve güvenilir olduğundan emin olabilir, böylece kullanıcılarınıza kesintisiz bir ödeme deneyimi sunabilirsiniz. Yerel testin gücünü kullanarak geliştirme sürecinizi optimize edin ve Stripe ile entegrasyonunuzu bir sonraki seviyeye taşıyın.

SSS (Sık Sorulan Sorular)

S: Stripe CLI'dan gelen webhook gizli anahtarı ile Stripe panelinden aldığım gizli anahtar aynı mı?

C: Hayır, genellikle farklıdır. Stripe CLI, stripe listen komutunu çalıştırdığınızda size özel bir yerel test gizli anahtarı (whsec_...) sağlar. Bu anahtar, sadece o CLI oturumu için geçerlidir ve Stripe panelindeki genel test webhook gizli anahtarınızdan farklıdır. Uygulamanızda, Stripe CLI'dan aldığınız anahtarı kullanmanız gerekir.

S: Ngrok kullanmak güvenli mi?

C: Ngrok, yerel sunucunuzu internete açtığı için dikkatli kullanılmalıdır. Yalnızca geliştirme ve test amaçlı kullanılmalı, hassas verilerle çalışırken veya üretim ortamında asla kullanılmamalıdır. Ücretli Ngrok planları, ek güvenlik özellikleri (örneğin, IP kısıtlamaları, parola koruması) sunar.

S: Webhook imza doğrulamasını neden yapmalıyım?

C: Webhook imza doğrulaması, gelen webhook isteğinin gerçekten Stripe'tan geldiğini ve yolculuk sırasında değiştirilmediğini garanti eder. Bu, kötü niyetli üçüncü tarafların sahte webhook'lar göndererek uygulamanızı manipüle etmesini veya hassas verilerinizi ele geçirmesini engellemek için kritik bir güvenlik önlemidir.

S: Stripe CLI ile test ederken neden 400 hatası alıyorum?

C: Genellikle bu hata, webhook imza doğrulamasının başarısız olduğu anlamına gelir. Şunları kontrol edin:

  • Uygulamanızın express.raw() gibi bir middleware kullanarak ham istek gövdesini (raw request body) doğru şekilde ayrıştırdığından emin olun.
  • Uygulamanızda kullandığınız webhook gizli anahtarının (STRIPE_WEBHOOK_SECRET_LOCAL) Stripe CLI'nın stripe listen komutu tarafından sağlanan anahtarla tam olarak eşleştiğinden emin olun.
  • Stripe CLI'nın doğru portu (--forward-to localhost:PORT/webhook) hedeflediğinden emin olun.

S: Birden fazla webhook olayını aynı anda nasıl tetikleyebilirim?

C: Stripe CLI'da doğrudan birden fazla olayı tek bir komutla tetikleme özelliği yoktur. Ancak, bir betik (script) yazarak veya komutları art arda çalıştırarak birden fazla olayı hızlıca tetikleyebilirsiniz:


stripe trigger payment_intent.succeeded && \
stripe trigger customer.subscription.created && \
stripe trigger invoice.payment_succeeded

Bu, farklı senaryoları simüle etmek için oldukça kullanışlıdır.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Gönder

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.
Mobil sürümden çık