import stripe import os from rest_framework.views import APIView from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from drf_spectacular.utils import extend_schema, OpenApiResponse, OpenApiExample, OpenApiParameter from .serializers import ( StripeCheckoutRequestSerializer, StripeCheckoutResponseSerializer, ) stripe.api_key = os.getenv("STRIPE_SECRET_KEY") class StripeCheckoutCZKView(APIView): permission_classes = [IsAuthenticated] @extend_schema( tags=["Stripe"], summary="Create Stripe Checkout session in CZK", description="Creates a Stripe Checkout session for payment in Czech Koruna (CZK). Requires authentication.", request=StripeCheckoutRequestSerializer, responses={ 200: OpenApiResponse(response=StripeCheckoutResponseSerializer, description="Stripe Checkout session URL returned successfully."), 400: OpenApiResponse(description="Amount is required or invalid."), }, examples=[ OpenApiExample( "Success", value={"url": "https://checkout.stripe.com/pay/cs_test_123456"}, response_only=True, status_codes=["200"], ), OpenApiExample( "Missing amount", value={"error": "Amount is required"}, response_only=True, status_codes=["400"], ), ] ) def post(self, request): serializer = StripeCheckoutRequestSerializer(data=request.data) if not serializer.is_valid(): return Response(serializer.errors, status=400) amount = serializer.validated_data.get("amount") product_name = serializer.validated_data.get("product_name", "Example Product") success_url = serializer.validated_data.get("success_url", "https://yourfrontend.com/success") cancel_url = serializer.validated_data.get("cancel_url", "https://yourfrontend.com/cancel") # Stripe expects amount in the smallest currency unit (haléř = 1/100 CZK) amount_in_haler = int(amount * 100) session = stripe.checkout.Session.create( payment_method_types=['card'], line_items=[{ 'price_data': { 'currency': 'czk', 'product_data': { 'name': product_name, }, 'unit_amount': amount_in_haler, }, 'quantity': 1, }], mode='payment', success_url=success_url, cancel_url=cancel_url, customer_email=getattr(request.user, 'email', None) ) return Response({"url": session.url})