Abonelik Yönetimi
Tekrarlayan ödemeler için abonelik oluşturma, yönetme ve iptal etme rehberi.
Abonelik Akışı
Adım 1: İlk Ödeme ve Kart Saklama
Müşterinin ilk abonelik ödemesinde kartını tokenize edin:
def create_subscription(user, plan):
session = create_checkout_session(
amount=plan.price,
customer=user.to_dict()
)
payment = process_payment(
session_id=session["session_id"],
card_data=user.card_data,
save_card=True
)
if payment["success"]:
subscription = Subscription.create(
user_id=user.id,
plan_id=plan.id,
card_token=payment["card_token"],
next_billing_date=calculate_next_date(plan.interval),
status="active"
)
return subscription
Adım 2: Otomatik Tahsilat (Cron Job)
Her gün çalışan bir cron job ile vadesi gelen abonelikleri tahsil edin:
def process_recurring_payments():
due_subscriptions = Subscription.query.filter(
Subscription.status == "active",
Subscription.next_billing_date <= datetime.utcnow()
).all()
for sub in due_subscriptions:
session = create_checkout_session(
amount=sub.plan.price,
customer=sub.user.to_dict()
)
result = process_payment(
session_id=session["session_id"],
card_token=sub.card_token
)
if result["success"]:
sub.next_billing_date = calculate_next_date(sub.plan.interval)
sub.retry_count = 0
else:
handle_failed_payment(sub)
Adım 3: Başarısız Ödeme Yönetimi
def handle_failed_payment(subscription):
subscription.retry_count += 1
retry_schedule = {1: 1, 2: 3, 3: 7}
if subscription.retry_count <= 3:
subscription.next_billing_date = (
datetime.utcnow() + timedelta(days=retry_schedule[subscription.retry_count])
)
send_payment_failed_email(subscription.user)
else:
subscription.status = "suspended"
send_subscription_suspended_email(subscription.user)
Abonelik İptali
def cancel_subscription(subscription_id):
sub = Subscription.query.get(subscription_id)
sub.status = "cancelled"
sub.cancelled_at = datetime.utcnow()
db.session.commit()
Abonelik Durumları
| Durum | Açıklama |
|---|---|
active | Aktif, tahsilatlar devam ediyor |
past_due | Ödeme başarısız, retry bekleniyor |
suspended | Tüm retry'lar başarısız, askıya alındı |
cancelled | Müşteri veya merchant tarafından iptal edildi |