无法重定向到Django + Stripe项目中的成功页面

问题描述 投票:0回答:1

我正在开发我的第一个测试 Django Stripe 项目,但我目前陷入困境,因为成功页面上的重定向不起作用。

这是我的views.py文件

import stripe
from django.conf import settings
from django.http import HttpResponse
from django.shortcuts import get_object_or_404
from django.views import View
from django.views.generic import TemplateView

from .models import Item

stripe.api_key = settings.STRIPE_SECRET_KEY


class ProductLandingPageView(TemplateView):
    template_name = 'landing.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        item_id = self.kwargs["id"]
        item = get_object_or_404(Item, id=item_id)
        context['item'] = item
        return context



class CreateCheckoutSessionView(View):
    def get(self, request, *args, **kwargs):
        item_id = self.kwargs["id"]
        DOMAIN: str = 'http://127.0.0.1:8000'
        item = Item.objects.get(id=item_id)
        session = stripe.checkout.Session.create(
            payment_method_types=['card'],
            line_items=[
                {
                    'price_data': {
                        'currency': 'usd',
                        'unit_amount': item.price * 100,
                        'product_data': {
                            'name': item.name,
                        },
                    },
                    'quantity': 1,
                },
            ],
            payment_intent_data={
                'metadata': {
                    'item_id': item.id,
                },
            },
            mode='payment',
            success_url=DOMAIN + '/success/',
            cancel_url=DOMAIN + '/cancel/',
        )
        return HttpResponse(session.id)


class SuccessView(TemplateView):
    template_name = "success.html"


class CancelView(TemplateView):
    template_name = "cancel.html"

这是我的 template.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Homepage</title>
    <script src="https://js.stripe.com/v3/"></script>
</head>
<body>
    <div class="description">
        <h3>{{ item.name }}</h3>
        <h5>{{ item.display_price }} USD.</h5>
    </div>
    <button id="buy-button" data-item-id="{{ item.id }}">Buy</button>



    <script>
    document.getElementById('buy-button').addEventListener('click', function() {
      var itemId = this.getAttribute('data-item-id');
      fetch('/buy/' + itemId)
        .then(function(response) {
          return response.json();
        })
        .then(function(data) {
          var stripe = Stripe(data.stripe_public_key);
          stripe.redirectToCheckout({
            sessionId: data.session_id
          });
        })
        .catch(function(error) {
          console.error('Ошибка:', error);
        });
    });
  </script>
</body>
</html>

您对如何解决该问题有什么建议吗? 顺便说一句,如果您发现任何其他需要改进的地方 - 请随时发表评论。 我对条纹服务非常陌生,仍在学习它是如何工作的。

python django django-views stripe-payments
1个回答
0
投票

一般来说,您有两种选择来执行结帐会话重定向。

选项 1:

  • 在后端创建结帐会话并将
    checkout.url
    发送到您的前端
  • 然后在前端使用
    window.location.href
  • 进行重定向

选项2:

  • 在您的前端有一个表单,例如
    <form action="/checkout-session" method="POST"> <button type="submit" /> </form>
  • 在后端,路由
    /checkout-session
    创建一个 Checkout Session 并返回带有 Checkout Session url 的 303 重定向
© www.soinside.com 2019 - 2024. All rights reserved.