@ -1,3 +1,4 @@
from . stripe_utils import stripe_service
from django . shortcuts import render , redirect , get_object_or_404
from django . shortcuts import render , redirect , get_object_or_404
from django . contrib import messages
from django . contrib import messages
from . models import Product , Order , OrderItem , GuestUser , OrderStatus
from . models import Product , Order , OrderItem , GuestUser , OrderStatus
@ -46,7 +47,7 @@ def _create_stripe_checkout_session(request, order, line_items):
# Create metadata to identify this order
# Create metadata to identify this order
metadata = {
metadata = {
' order_id ' : str ( order . id ) , # Convert to string to be safe
' order_id ' : str ( order . id ) ,
}
}
# Add user info to metadata if available
# Add user info to metadata if available
@ -56,14 +57,9 @@ def _create_stripe_checkout_session(request, order, line_items):
metadata [ ' guest_email ' ] = request . session . get ( ' guest_email ' , ' ' )
metadata [ ' guest_email ' ] = request . session . get ( ' guest_email ' , ' ' )
try :
try :
# Initialize Stripe with your secret key
# Use the service to create the session
stripe . api_key = settings . STRIPE_SECRET_KEY
checkout_session = stripe_service . create_checkout_session (
# Create session
checkout_session = stripe . checkout . Session . create (
payment_method_types = [ ' card ' ] ,
line_items = line_items ,
line_items = line_items ,
mode = ' payment ' ,
success_url = success_url ,
success_url = success_url ,
cancel_url = cancel_url ,
cancel_url = cancel_url ,
metadata = metadata ,
metadata = metadata ,
@ -76,7 +72,6 @@ def _create_stripe_checkout_session(request, order, line_items):
return checkout_session
return checkout_session
except Exception as e :
except Exception as e :
# Log error and re-raise
print ( f " Stripe error: { str ( e ) } " )
print ( f " Stripe error: { str ( e ) } " )
raise
raise
@ -159,7 +154,9 @@ def create_order(request):
# Authenticated user order
# Authenticated user order
order = Order . objects . create (
order = Order . objects . create (
user = request . user ,
user = request . user ,
total_price = total_price
total_price = total_price ,
stripe_mode = stripe_service . mode # Add this line
)
)
else :
else :
# Guest user order
# Guest user order
@ -167,12 +164,15 @@ def create_order(request):
guest_user = GuestUser . objects . get ( email = request . session [ ' guest_email ' ] )
guest_user = GuestUser . objects . get ( email = request . session [ ' guest_email ' ] )
order = Order . objects . create (
order = Order . objects . create (
guest_user = guest_user ,
guest_user = guest_user ,
total_price = total_price
total_price = total_price ,
stripe_mode = stripe_service . mode # Add this line
)
)
except ( KeyError , GuestUser . DoesNotExist ) :
except ( KeyError , GuestUser . DoesNotExist ) :
# No guest user information, create order without user
# No guest user information, create order without user
order = Order . objects . create (
order = Order . objects . create (
total_price = total_price
total_price = total_price ,
stripe_mode = stripe_service . mode # Add this line
)
)
# Create order items
# Create order items
@ -282,10 +282,12 @@ def payment(request, order_id):
messages . error ( request , f " Payment processing error: { str ( e ) } " )
messages . error ( request , f " Payment processing error: { str ( e ) } " )
return redirect ( ' shop:view_cart ' )
return redirect ( ' shop:view_cart ' )
display_data = prepare_item_display_data ( order_items , is_cart = False )
# Render payment page
# Render payment page
return render ( request , ' shop/payment.html ' , {
return render ( request , ' shop/payment.html ' , {
' order ' : order ,
' order ' : order ,
' order_items ' : order_items ,
' display_data ' : display_data ,
' checkout_session_id ' : checkout_session_id ,
' checkout_session_id ' : checkout_session_id ,
' stripe_publishable_key ' : settings . STRIPE_PUBLISHABLE_KEY ,
' stripe_publishable_key ' : settings . STRIPE_PUBLISHABLE_KEY ,
} )
} )
@ -474,7 +476,7 @@ def simulate_payment_failure(request):
@require_POST
@require_POST
@csrf_exempt # Stripe can't provide CSRF tokens
@csrf_exempt
def stripe_webhook ( request ) :
def stripe_webhook ( request ) :
""" Handle Stripe webhook events """
""" Handle Stripe webhook events """
payload = request . body
payload = request . body
@ -488,23 +490,17 @@ def stripe_webhook(request):
return HttpResponse ( status = 400 )
return HttpResponse ( status = 400 )
try :
try :
# Initialize Stripe
# Use the service to verify the webhook
stripe . api_key = settings . STRIPE_SECRET_KEY
event = stripe_service . verify_webhook_signature ( payload , sig_header )
# Verify the event using webhook signing secret
event = stripe . Webhook . construct_event (
payload , sig_header , settings . STRIPE_WEBHOOK_SECRET
)
# Log the event type
# Log the event type and mode
print ( f " Webhook event type: { event [ ' type ' ] } " )
mode = " TEST " if stripe_service . is_test_mode else " LIVE "
print ( f " { mode } webhook event type: { event [ ' type ' ] } " )
except ValueError as e :
except ValueError as e :
# Invalid payload
print ( f " Invalid payload: { str ( e ) } " )
print ( f " Invalid payload: { str ( e ) } " )
return HttpResponse ( status = 400 )
return HttpResponse ( status = 400 )
except stripe . error . SignatureVerificationError as e :
except stripe . error . SignatureVerificationError as e :
# Invalid signature
print ( f " Invalid signature: { str ( e ) } " )
print ( f " Invalid signature: { str ( e ) } " )
return HttpResponse ( status = 400 )
return HttpResponse ( status = 400 )