Site icon Kartaca

dj-stripe ile Django ve Stripe Entegrasyonu


dj-stripe ile Django ve Stripe Entegrasyonu

Django projelerinde hangi ödeme kütüphanelerinin kullanıldığını araştırırken dj-stripe’yi inceleme fırsatım oldu. Projenize bir ödeme sistemi entegre edecekseniz, abonelik yönetimi (subscription management) veya tek birim satın alma (single-unit purchase) gibi özelliklere ihtiyaç duyabilirsiniz. Özellikle SaaS projeleri için, abonelik yönetimi oldukça önemli ve zaman alıcı bir konu ve dj-stripe bu konuda çözüm sunuyor.

Ön Gereksinimler:

dj-stripe entegrasyonuna başlamadan önce, aşağıdaki gereksinimleri yerine getirdiğinizden emin olun:

  • Bir Django projesi (Django versiyonu>= 2.2)
  • Python versiyonu >= 3.6
  • Kullanıma hazır bir Stripe projesi

Kurulum

Öncelikle dj-stripe’ı pip ile kuruyoruz:

pip install dj-stripe

Sonra djstripe’ı INSTALLED_APPS’e ekliyoruz:

INSTALLED_APPS=(
    ...
    "djstripe",
    ...

ve urls.py’e ekliyoruz.

path("stripe/", include("djstripe.urls", namespace="djstripe"))

Stripe Ayarları

Webhooks (Web kancaları)

Webhook adresini Stripe’ye eklemek gerekir. Webhook adresiniz [https://domain.com/stripe/webhook] formatında olmalıdır.

Webhook endpoint’lerini Stripe Dashboard’da Developers > Webhooks adresinde bulabilirsiniz. Stripe Dashboard’da bir webhook endpoint oluşturduktan sonra, whsec_ ile başlayan webhook secret key’inizi alın.

Ekran Görüntüsü — https://dashboard.stripe.com/webhooks

API Keys (API Anahtarları)

Ekran Görüntüsü — https://dashboard.stripe.com/apikeys

Stripe public ve secret key’lerini Developers > API Keys menüsünden alıp, .env dosyamıza ekliyoruz. settings.py dosyamız aşağıdaki gibi olmalı:

STRIPE_LIVE_PUBLIC_KEY = os.environ.get("STRIPE_LIVE_PUBLIC_KEY", "<your publishable key>")
STRIPE_LIVE_SECRET_KEY = os.environ.get("STRIPE_LIVE_SECRET_KEY", "<your secret key>")
STRIPE_TEST_PUBLIC_KEY = os.environ.get("STRIPE_TEST_PUBLIC_KEY", "<your publishable key>")
STRIPE_TEST_SECRET_KEY = os.environ.get("STRIPE_TEST_SECRET_KEY", "<your secret key>")
STRIPE_LIVE_MODE = False
DJSTRIPE_WEBHOOK_SECRET = "whsec_xxx"

STRIPE_LIVE_MODE False iken, dj-stripe test key’lerinizi kullanır.

Plans

Plan yaratmak için yan menüdeki Product butonuna tıklayın.

Ekran Görüntüsü — https://dashboard.stripe.com/products/create

Name alanı zorunludur. Ben 3 günlük ücretsiz deneme opsiyonu ile beraber tekrarlanan (recurring) bir plan yarattım.

dj-stripe tabloları oluşturmak, mevcut müşterileri Stripe’ta oluşturmak ve oluşturulan planları Stripe’den dj-stripe tablolarına taşımak için aşağıdaki komutları çalıştırın:

python manage.py migrate
python manage.py djstripe_init_customers
python manage.py djstripe_sync_plans_from_stripe

Events

Stripe event’lerinden bahsetmenin önemli olduğunu düşünüyorum. Stripe’de çok sayıda farklı event var. API’den hangi event’leri dinlemek istediğinizi belirtmelisiniz.

Müşterinize e-posta ile ödemesinin başarısız olduğunu bildirmek veya aboneliğinin x gün içerisinde sona ereceğini hatırlatmak isteyebilirsiniz. Böyle durumlarda, Stripe Dashboard’da dinlemek istediğiniz event’leri seçerek, her biri için bir listener method uygulamanız gerekir.

Developer > Webhooks sayfasında event’lerinizi seçin.

Ekran Görüntüsü — https://dashboard.stripe.com/webhooks/we_xxx

Şimdi müşterinin aboneliğini sonlandırmasıyla ilgili event’ler için bir endpoint yaratalım:

from djstripe import webhooks
from django.core.mail import send_mail

@webhooks.handler("customer.deleted")
def customer_deleted_event_listener(event, **kwargs):
    send_mail(
        'Subscription Deleted',
        'See ya!',
        'from@example.com',
        ['to@example.com'],
        fail_silently=False,
    )

Müşteri bilgisini, event değişkeninin içerisinde bulabilirsiniz.

Checkout

Ben müşterilerin stripe.com üzerinden ödeme yaptığı “Stripe Checkout”u tercih ettim, ancak siz bunu istemci uygulamanız ile de yapabilirsiniz.

Checkout, Stripe’de barınan ve kolayca ödeme alabileceğiniz güvenli bir sayfa sunar. Çoklu cihaz desteği bulunur ve dönüşümü artırmaya yardımcı olur.

Daha fazla bilgi için >> https://stripe.com/docs/payments/checkout

Stripe Checkout kullanırken, eğer bir SaaS uygulama API’si entegre ediyorsanız, ödeme adımında plan name, customer id gibi bazı müşteri bilgilerinin olduğu bir “Stripe” oturumu oluşturmalısınız.

customer = Customer.objects.get(subscriber=request.user)
stripe.api_key = STRIPE_SECRET_KEY
session = stripe.checkout.Session.create(
customer=customer.id,
payment_method_types=['card'],
subscription_data={
'items': [{
'plan': request.data["plan"],
}],
},
success_url='http://example.com/success',
cancel_url='http://example.com/cancelled',
)

data = {
"session_id": session.id
}return JsonResponse(data, status=200)

session_id yarattıktan sonra, bunu istemci uygulamanıza aktarın.

İstemcide ödeme adımlarını uygulamadan önce Stripe.js dosyasını içe aktarmalıyız.

Aşağıdaki satırı .html dosyamıza ekliyoruz:


Stripe nesnesini oluşturuyoruz:

var stripe = Stripe(YOUR_PUBLIC_KEY);

Müşteri “Abone Ol” butonuna tıkladığında, aşağıdaki kod parçasını çalıştırmalıdır:

stripe.redirectToCheckout({
sessionId: this.state.session_id
})
.then(function(result) {
// If `redirectToCheckout` fails due to a browser or network
// error, display the localized error message to your customer
// using `result.error.message`.
var displayError = document.getElementById('error-message');
displayError.textContent = result.error.message;});

Müşteri butona tıkladığında, aşağıda sayfayı görür:

Ekran Görüntüsü — https://stripe.com/docs/payments/checkout

Not: Stripe test key’lerini kullanırsanız sayfa test modunda görünür. Ödeme adımınızı test kartı numaraları ile test edebilirsiniz.

  • Varsayılan ABD kartı — 4242 4242 4242 4242
  • 3D Secure ile kimlik doğrulaması için — 4000 0000 0000 3220

Sonuç:

dj-stripe projesini kullanarak başarılı bir Stripe entegrasyonu yaptık. Hızlıca uygulanabilmesi ve anlaşılabilir olması için mümkün olduğunca basit anlatmaya çalıştım.

Stripe’nin çok çeşitli özellikleri ve harika bir dokümantasyonu var. Stripe’yi kullanmadan önce dokümantasyonunu da okumanızı tavsiye ederim.

 

Yazan: Berat Nakip

Yayınlanma Tarihi: 02.07.2020


Exit mobile version