tylerjrichards / st-paywall

A python package for creating subscription Streamlit apps
MIT License
235 stars 46 forks source link

Subscription management for clients #52

Closed jozkotrapko closed 5 months ago

jozkotrapko commented 6 months ago

How can a client cancel their subscription arbitrarily? By some button/page to manage the subscription.

jozkotrapko commented 6 months ago

I played around with it a bit and came up with this, what do you think?

import streamlit as st
import stripe

def get_customer_id(email):
    customers = stripe.Customer.list(email=email).auto_paging_iter()
    for customer in customers:
        return customer['id']
    return None

def cancel_subscription(email):
    customer_id = get_customer_id(email)
    if customer_id is None:
        st.write("No customer with the provided email.")
        return

    subscriptions = stripe.Subscription.list(customer=customer_id).auto_paging_iter()
    for subscription in subscriptions:
        if subscription['status'] != 'canceled':
            if subscription['cancel_at_period_end']:
                st.write(f"Your subscription {subscription['id']} was already accepted to be canceled after the end of the period.")
            else:
                stripe.Subscription.modify(
                  subscription['id'],
                  cancel_at_period_end=True,
                )
                st.write(f"Subscription {subscription['id']} will be canceled at the end of the current period.")

email = st.session_state.email
if 'confirm' not in st.session_state:
    st.session_state.confirm = False

if st.button('Request to Cancel Subscription'):
    st.session_state.confirm = not st.session_state.confirm

if st.session_state.confirm:
    if st.button('Are you sure you want to cancel the subscription?'):
        cancel_subscription(email)
        st.session_state.confirm = False
oscolabs commented 1 month ago

getting this error, how did you approach this?

AttributeError: st.session_state has no attribute "email". Did you forget to initialize it? More info: https://docs.streamlit.io/library/advanced-features/session-state#initialization