Skip to content

Commit

Permalink
Get Stripe webhook working
Browse files Browse the repository at this point in the history
  • Loading branch information
lcarvajal committed Jul 31, 2024
1 parent 1bbcc57 commit 6dffb83
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 20 deletions.
76 changes: 59 additions & 17 deletions app/routes/subscriptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,40 @@


@router.post("/checkout-session")
def create_checkout_session(firebase_user: Annotated[dict, Depends(get_firebase_user_from_token)]):
def create_checkout_session(firebase_user: Annotated[dict, Depends(get_firebase_user_from_token)], db: Session = Depends(get_db)):
user = crud.get_user_by_uid(db, "firebase", firebase_user["uid"])

if user is None:
raise HTTPException(
status_code=404,
detail="User not found")

if user.payment_gateway_customer_id is None:
stripe_customer = stripe.Customer.create(
name=user.name,
email=user.email,
)

if stripe_customer is None:
raise HTTPException(
status_code=500,
detail="Failed to create Stripe customer")

logger.info("Created Stripe customer")

user.payment_gateway_customer_id = stripe_customer.id
user.payment_gateway_provider = 'stripe'

updated_user = crud.update_user(db, user)

logger.info("Updated user with Stripe customer ID")
logger.info(updated_user)

if updated_user is None:
raise HTTPException(
status_code=500,
detail="Failed to update user")

try:
checkout_session = stripe.checkout.Session.create(
line_items=[
Expand All @@ -35,11 +68,15 @@ def create_checkout_session(firebase_user: Annotated[dict, Depends(get_firebase_
'quantity': 1,
},
],
customer=user.payment_gateway_customer_id,
customer_update={
'address': 'auto'
},
mode='subscription',
success_url=os.getenv('FRONTEND_URL') + \
'/order-preview?success=true',
'/checkout?success=true',
cancel_url=os.getenv('FRONTEND_URL') + \
'/order-preview?canceled=true',
'/checkout?canceled=true',
automatic_tax={'enabled': True},
)
except Exception as e:
Expand All @@ -55,9 +92,6 @@ async def stripe_webhook(request: Request, db: Session = Depends(get_db)):
payload = await request.body()
sig_header = request.headers.get('stripe-signature')

logger.info("Received webhook")
logger.info(payload)

try:
event = stripe.Webhook.construct_event(
payload, sig_header, os.getenv('STRIPE_ENDPOINT_SECRET'))
Expand All @@ -66,6 +100,11 @@ async def stripe_webhook(request: Request, db: Session = Depends(get_db)):
except stripe.error.SignatureVerificationError as e:
raise HTTPException(status_code=400, detail="Invalid signature")

logger.info("Received webhook")
logger.info('ID')
logger.info(event['data']['object']['id'])
logger.info('...')

if event['type'] == 'customer.subscription.created':
handle_subscription_created(event['data']['object'], db)
elif event['type'] == 'customer.subscription.updated':
Expand All @@ -78,34 +117,37 @@ async def stripe_webhook(request: Request, db: Session = Depends(get_db)):


def handle_subscription_created(subscription, db: Session):
user = crud.get_user_by_email(db, subscription['customer'])
user = crud.get_user_by_payment_gateway_customer_id(
db, subscription['customer'], 'stripe')
if user:
new_subscription = schemas.SubscriptionCreate(
new_subscription = schemas.subscription_schema.SubscriptionCreate(
user_id=user.id,
payment_gateway_customer_id=subscription['customer'],
payment_gateway_subscription_id=subscription['id'],
payment_gateway_provider='stripe',
status=subscription['status'],
current_period_end=datetime.fromtimestamp(
current_period_end=datetime.datetime.fromtimestamp(
subscription['current_period_end']),
)
crud.create_subscription(db, new_subscription)

crud.update_user(db, user, schemas.User(
payment_gateway_customer_id=subscription['customer'],
payment_gateway_provider='stripe'))
user.payment_gateway_customer_id = subscription['customer']
user.payment_gateway_provider = 'stripe'
crud.update_user(db, user)
else:
logger.info('User not found. Unable to create subscription.')


def handle_subscription_updated(subscription, db: Session):
db_subscription = crud.get_subscription_by_stripe_id(
db, subscription['id'])
if db_subscription:
update_data = {
"status": subscription['status'],
"current_period_end": datetime.fromtimestamp(subscription['current_period_end'])
}
db_subscription.status = subscription['status']
db_subscription.current_period_end = datetime.datetime.fromtimestamp(
subscription['current_period_end'])

crud.update_subscription(
db, db_subscription.id, schemas.SubscriptionUpdate(**update_data))
db, db_subscription)


def handle_subscription_deleted(subscription, db: Session):
Expand Down
6 changes: 3 additions & 3 deletions app/utils/crud.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ def get_user_by_uid(db: Session, authentication_service: str, uid: str):
return db.query(models.user.User).filter(and_(models.user.User.uid == uid, models.user.User.authentication_service == authentication_service)).first()


def get_user_by_email(db: Session, email: str):
return db.query(models.user.User).filter(models.user.User.email == email).first()
def get_user_by_payment_gateway_customer_id(db: Session, customer_id: str, provider: str):
return db.query(models.user.User).filter(and_(models.user.User.payment_gateway_customer_id == customer_id, models.user.User.payment_gateway_provider == provider)).first()


def update_user(db: Session, user: user_schema.User):
Expand Down Expand Up @@ -147,7 +147,7 @@ def get_active_subscriptions_for_user(db: Session, user_id: int):


def get_subscription_by_stripe_id(db: Session, subscription_id: str):
return db.query(models.subscription.Subscription).filter(models.subscription.Subscription.payment_gateway_subscription_id == subscription_id & models.subscription.Subscription.payment_gateway_provider == 'stripe').first()
return db.query(models.subscription.Subscription).filter(and_(models.subscription.Subscription.payment_gateway_subscription_id == subscription_id, models.subscription.Subscription.payment_gateway_provider == 'stripe')).first()


def update_subscription(db: Session, subscription: subscription_schema.Subscription):
Expand Down

0 comments on commit 6dffb83

Please sign in to comment.