Ana içeriğe geç

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ı

DurumAçıklama
activeAktif, tahsilatlar devam ediyor
past_dueÖdeme başarısız, retry bekleniyor
suspendedTüm retry'lar başarısız, askıya alındı
cancelledMüşteri veya merchant tarafından iptal edildi