You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
padelclub_backend/shop/stripe_utils.py

90 lines
3.2 KiB

import stripe
from django.conf import settings
import logging
logger = logging.getLogger(__name__)
class StripeService:
"""Service class to manage Stripe operations with mode awareness"""
def __init__(self):
# Determine if we're in test mode
self.mode = getattr(settings, 'STRIPE_MODE', 'test')
self.is_test_mode = self.mode == 'test'
# Get appropriate keys based on mode
self.api_key = settings.STRIPE_SECRET_KEY
self.publishable_key = settings.STRIPE_PUBLISHABLE_KEY
self.webhook_secret = settings.STRIPE_WEBHOOK_SECRET
self.currency = getattr(settings, 'STRIPE_CURRENCY', 'eur')
# Configure Stripe library
stripe.api_key = self.api_key
# Log initialization in debug mode
mode_str = "TEST" if self.is_test_mode else "LIVE"
logger.debug(f"Initialized StripeService in {mode_str} mode")
def create_checkout_session(self, line_items, success_url, cancel_url, metadata=None):
"""Create a Stripe Checkout Session for one-time payments"""
if self.is_test_mode:
logger.info(f"Creating checkout session in TEST mode with metadata: {metadata}")
session = stripe.checkout.Session.create(
payment_method_types=['card'],
line_items=line_items,
mode='payment',
success_url=success_url,
cancel_url=cancel_url,
metadata=metadata or {},
)
return session
def verify_webhook_signature(self, payload, signature):
"""Verify webhook signature using mode-appropriate secret"""
try:
event = stripe.Webhook.construct_event(
payload, signature, self.webhook_secret
)
return event
except stripe.error.SignatureVerificationError as e:
logger.error(f"Webhook signature verification failed: {str(e)}")
raise
def construct_event_for_testing(self, payload, signature):
"""Helper method to construct events during testing"""
return stripe.Webhook.construct_event(
payload, signature, self.webhook_secret
)
def get_checkout_session(self, session_id):
"""Retrieve a checkout session by ID"""
return stripe.checkout.Session.retrieve(session_id)
def get_payment_intent(self, payment_intent_id):
"""Retrieve a payment intent by ID"""
return stripe.PaymentIntent.retrieve(payment_intent_id)
# Create a singleton instance for import and use throughout the app
stripe_service = StripeService()
# For backward compatibility, expose some functions directly
def create_payment_intent(amount, currency=None, metadata=None):
"""Legacy function for backward compatibility"""
if currency is None:
currency = stripe_service.currency
return stripe.PaymentIntent.create(
amount=amount,
currency=currency,
metadata=metadata or {},
)
def create_checkout_session(line_items, success_url, cancel_url, metadata=None):
"""Legacy function for backward compatibility"""
return stripe_service.create_checkout_session(
line_items=line_items,
success_url=success_url,
cancel_url=cancel_url,
metadata=metadata or {},
)