Реализация 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
из сессии оформления заказа, чтобы получить связанную информацию.