FEAT: Added Stripe webhook to handle user subscriptions

UPDATE: Improved the chat look
This commit is contained in:
JustIceO7
2025-02-16 03:53:04 +00:00
parent 97067e1f87
commit 4ddcb3e139
7 changed files with 89 additions and 47 deletions

View File

@@ -1,32 +1,41 @@
from flask import Blueprint, request, jsonify
from flask import Blueprint, request, jsonify, session as s
from blueprints.middleware import login_required
from utils.user_utils import subscribe
import os, stripe
stripe_bp = Blueprint("stripe", __name__)
stripe.api_key = os.getenv("STRIPE_SECRET_KEY")
endpoint_secret = ""
subscription = os.getenv("GANDER_SUBSCRIPTION")
@login_required
@stripe_bp.route('/create-checkout-session', methods=['POST'])
def create_checkout_session():
"""
Creates the stripe checkout session
"""
print("Creating checkout session")
print("Creating checkout session", flush=True)
try:
user_id = s.get("user_id")
streamer_id = request.args.get("streamer_id")
session = stripe.checkout.Session.create(
ui_mode = 'embedded',
payment_method_types=['card'],
line_items=[
{
'price': 'price_1QikNCGk6yuk3uA86mZf3dmM', #Subscription ID
'price': 'price_1QikNCGk6yuk3uA86mZf3dmM',
'quantity': 1,
},
],
mode='subscription',
redirect_on_completion = 'never'
redirect_on_completion = 'never',
client_reference_id = f"{user_id}-{streamer_id}"
)
except Exception as e:
print(e)
return str(e)
print(e, flush=True)
return str(e), 500
return jsonify(clientSecret=session.client_secret)
@@ -38,3 +47,32 @@ def session_status():
session = stripe.checkout.Session.retrieve(request.args.get('session_id'))
return jsonify(status=session.status, customer_email=session.customer_details.email)
@stripe_bp.route('/stripe/webhook', methods=['POST'])
def stripe_webhook():
"""
Webhook for handling stripe payments
"""
event = None
payload = request.data
sig_header = request.headers['STRIPE_SIGNATURE']
try:
event = stripe.Webhook.construct_event(
payload, sig_header, endpoint_secret
)
except ValueError as e:
raise e
except stripe.error.SignatureVerificationError as e:
raise e
if event['type'] == "checkout.session.completed":
session = event['data']['object']
product_id = stripe.checkout.Session.list_line_items(session['id'])['data'][0]['price']['product']
if product_id == subscription:
client_reference_id = session.get("client_reference_id")
user_id, streamer_id = client_reference_id.split("-")
print(f"user_id: {user_id} is subscribing to streamer_id: {streamer_id}", flush=True)
subscribe(user_id, streamer_id)
return "Success", 200

View File

@@ -22,17 +22,6 @@ def user_data(username: str):
return jsonify(data)
## Subscription Routes
@login_required
@user_bp.route('/user/subscribe/<int:streamer_id>')
def user_subscribe(streamer_id):
"""
Given a streamer subscribes as user
"""
#TODO: Keep this route secure so only webhooks from Stripe payment can trigger it
user_id = session.get("user_id")
subscribe(user_id, streamer_id)
return jsonify({"status": True})
@login_required
@user_bp.route('/user/subscription/<int:subscribed_id>')
def user_subscribed(subscribed_id: int):

View File

@@ -52,21 +52,18 @@ def is_user_partner(user_id: int) -> bool:
return bool(data)
def is_subscribed(user_id: int, subscribed_to_id: int) -> bool:
"""
Returns True if user is subscribed to a streamer, else False
"""
"""Returns True if user is subscribed to a streamer, else False"""
with Database() as db:
result = db.fetchone("""
SELECT *
return bool(db.fetchone(
"""
SELECT 1
FROM subscribes
WHERE user_id = ?
AND subscribed_id = ?
AND subscribed_id = ?
AND expires > ?;
""", (user_id, subscribed_to_id, datetime.now()))
print(result)
if result:
return True
return False
""",
(user_id, subscribed_to_id, datetime.now())
))
def is_following(user_id: int, followed_id: int) -> bool:
"""