Реализация Stripe в django не перенаправляет на страницу успеха

Я пытался внедрить stripe в Django и все работало хорошо, пока я не попытался перенаправить пользователя на страницу успеха после оплаты. Может ли кто-нибудь взглянуть на мой код и сказать мне, что я делаю неправильно?

views.py

@csrf_exempt
def create_checkout_session(request, id):
    request_data = json.loads(request.body)
    gig = get_object_or_404(Gig, pk=id)
    stripe.api_key = settings.STRIPE_SECRET_KEY
    checkout_session = stripe.checkout.Session.create(
        customer_email=request_data['email'],
        payment_method_types=['card'],
        line_items=[
            {
                'price_data': {
                    'currency': 'eur',
                    'product_data': {
                        'name': gig.seller,
                    },
                    'unit_amount': int(gig.price * 100),
                },
                'quantity': 1,
            }
        ],

        mode='payment',
        success_url='http://127.0.0.1:8000/checkout/success?session_id={CHECKOUT_SESSION_ID}',
        cancel_url='http://127.0.0.1:8000/checkout/failed/',
    )

    order = OrderDetail()
    order.customer_email = request_data['email']
    order.gig = gig
    order.stripe_payment_intent = checkout_session.payment_intent
    order.amount = int(gig.price * 100)
    order.save()
    
    # return JsonResponse({'data': checkout_session})
    return JsonResponse({'sessionId': checkout_session.id})


class PaymentSuccessView(TemplateView):
    template_name = "checkout/payment_success.html"

    def get(self, request, *args, **kwargs):
        session_id = request.GET.get('session_id')
        if session_id is None:
            return HttpResponse("failed")
        
        stripe.api_key = settings.STRIPE_SECRET_KEY
        session = stripe.checkout.Session.retrieve(session_id)
        
        order = get_object_or_404(OrderDetail, stripe_payment_intent=session.payment_intent)
        order.has_paid = True
        order.save()
        return render(request, self.template_name)

models.py

from django.db import models
from django.core import validators




class OrderDetail(models.Model):

    id = models.BigAutoField(
        primary_key=True
    )

    # You can change as a Foreign Key to the user model
    customer_email = models.EmailField(
        verbose_name='Customer Email'
    )

    gig = models.ForeignKey(
        to=Gig,
        verbose_name='Product',
        on_delete=models.PROTECT
    )

    amount = models.IntegerField(
        verbose_name='Amount'
    )

    stripe_payment_intent = models.CharField(
        max_length=200, null=True, blank=True
    )

    # This field can be changed as status
    has_paid = models.BooleanField(
        default=False,
        verbose_name='Payment Status'
    )

    created_on = models.DateTimeField(
        auto_now_add=True
    )

    updated_on = models.DateTimeField(
        auto_now_add=True
    )


class Gig(models.Model):
    id = models.BigAutoField(
        primary_key=True
    )

    gigger = models.ForeignKey(
        Mentors, 
        on_delete=models.CASCADE,
        related_name="seller")
    
    description = models.TextField(
        blank=True,
        max_length=800,
        verbose_name='Description'
    )

    price = models.DecimalField(
        verbose_name='Price',
        decimal_places=2,
        max_digits=6,
    )


    def __str__(self):
       return f"{self.gigger}, ${self.price}, id:{self.id}"


class Comments:
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="Commentor")
    comment = models.TextField(blank=True)
    stars = models.PositiveSmallIntegerField()

product.html

После размещения заказа, когда я захожу в объект 'order details' и вижу, что ключ 'stripe_payment_intend' всегда пустой, он не сохраняется. Что еще я могу попробовать, чтобы получить каждый отдельный заказ?

Проблема заключается в том, что момент создания сессии Checkout Session и установки данных order не связан с моментом, когда вы отображаете страницу успеха с помощью класса PaymentSuccessView. То, что эти две части кода находятся в одном файле, не означает, что состояние будет сохраняться между различными запросами.

Вместо этого вы можете добавить информацию о заказе в сессию оформления заказа с помощью metadata. Затем, когда вы получаете сессию оформления заказа на странице успеха, вы можете прочитать metadata из сессии оформления заказа, чтобы получить связанную информацию.

Вернуться на верх