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=(</br>
...</br>
"djstripe",</br>
...</br>
)
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.

API Keys (API Anahtarları)

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>")
</br>STRIPE_LIVE_SECRET_KEY = os.environ.get("STRIPE_LIVE_SECRET_KEY", "<your secret key>")
</br>STRIPE_TEST_PUBLIC_KEY = os.environ.get("STRIPE_TEST_PUBLIC_KEY", "<your publishable key>")
</br>STRIPE_TEST_SECRET_KEY = os.environ.get("STRIPE_TEST_SECRET_KEY", "<your secret key>")
</br>STRIPE_LIVE_MODE = False
</br>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.

“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</br></br>python manage.py djstripe_init_customers</br></br>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.

Şimdi müşterinin aboneliğini sonlandırmasıyla ilgili event’ler için bir endpoint yaratalım:
<strong class="ke ki">from</strong> <strong class="ke ki">djstripe</strong></br><strong class="ke ki">import</strong> webhooksfrom <strong class="ke ki">django.core.mail </strong>import <strong class="ke ki">send_mail@webhooks.handler</strong>("customer.deleted")</br>
<strong class="ke ki">def</strong> customer_deleted_event_listener(event, **kwargs):
</br>send_mail(
</br>'Subscription Deleted',
</br>'See ya! 👋',
</br>'from@example.com',
</br>['to@example.com'],
</br>fail_silently=<strong class="ke ki">False</strong>,
</br>)
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:
<script src="https://js.stripe.com/v3/"></script>
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:

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
