我正在开发我的第一个测试 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>
您对如何解决该问题有什么建议吗? 顺便说一句,如果您发现任何其他需要改进的地方 - 请随时发表评论。 我对条纹服务非常陌生,仍在学习它是如何工作的。
一般来说,您有两种选择来执行结帐会话重定向。
选项 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 重定向