72 lines
2.7 KiB
Python
72 lines
2.7 KiB
Python
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})
|