init
This commit is contained in:
0
backend/thirdparty/stripe/__init__.py
vendored
Normal file
0
backend/thirdparty/stripe/__init__.py
vendored
Normal file
3
backend/thirdparty/stripe/admin.py
vendored
Normal file
3
backend/thirdparty/stripe/admin.py
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.contrib import admin
|
||||
|
||||
# Register your models here.
|
||||
6
backend/thirdparty/stripe/apps.py
vendored
Normal file
6
backend/thirdparty/stripe/apps.py
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class StripeConfig(AppConfig):
|
||||
default_auto_field = 'django.db.models.BigAutoField'
|
||||
name = 'stripe'
|
||||
0
backend/thirdparty/stripe/migrations/__init__.py
vendored
Normal file
0
backend/thirdparty/stripe/migrations/__init__.py
vendored
Normal file
3
backend/thirdparty/stripe/models.py
vendored
Normal file
3
backend/thirdparty/stripe/models.py
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.db import models
|
||||
|
||||
# Create your models here.
|
||||
12
backend/thirdparty/stripe/serializers.py
vendored
Normal file
12
backend/thirdparty/stripe/serializers.py
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
from rest_framework import serializers
|
||||
|
||||
|
||||
class StripeCheckoutRequestSerializer(serializers.Serializer):
|
||||
amount = serializers.DecimalField(max_digits=12, decimal_places=2, min_value=0.01)
|
||||
product_name = serializers.CharField(required=False, default="Example Product")
|
||||
success_url = serializers.URLField(required=False)
|
||||
cancel_url = serializers.URLField(required=False)
|
||||
|
||||
|
||||
class StripeCheckoutResponseSerializer(serializers.Serializer):
|
||||
url = serializers.URLField()
|
||||
3
backend/thirdparty/stripe/tests.py
vendored
Normal file
3
backend/thirdparty/stripe/tests.py
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
6
backend/thirdparty/stripe/urls.py
vendored
Normal file
6
backend/thirdparty/stripe/urls.py
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
from django.urls import path
|
||||
from .views import StripeCheckoutCZKView
|
||||
|
||||
urlpatterns = [
|
||||
path('checkout/', StripeCheckoutCZKView.as_view(), name='stripe-checkout-czk'),
|
||||
]
|
||||
71
backend/thirdparty/stripe/views.py
vendored
Normal file
71
backend/thirdparty/stripe/views.py
vendored
Normal file
@@ -0,0 +1,71 @@
|
||||
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})
|
||||
Reference in New Issue
Block a user