Ошибка Stripe InvalidRequestError в /subscription/ Request req_F6PVTyTtfDXnIf: вы передали пустую строку для 'line_items[0][price]'. Мы принимаем пустые значения
Я пытаюсь настроить услугу подписки на своем веб-сайте с помощью Django.
models.py
from django.db import models
from django.contrib.auth.models import User
from django.utils.timezone import now
class Subscription(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
customer_id= models.CharField(max_length=255)
subscription_id = models.CharField(max_length=225, unique=True)
product_name = models.CharField(max_length=255)
price = models.IntegerField()
interval = models.CharField(max_length=50, default="month")
start_date = models.DateTimeField(null=True, blank=True)
end_date = models.DateTimeField(null=True, blank=True)
canceled_at = models.DateTimeField(null=True, blank=True)
@property
def is_active(self):
if self.end_date:
if now() < self.enddate:
return True
else:
return False
else:
return True
@property
def tier(self):
tier_mapping = {
'Basic Membership': 1,
'Premium Membership':2,
'Pro Membership':3,
}
tier = tier_mapping.get(self.product_name, None)
return tier
def __str__(self):
return f"{self.user.username} - {self.product_name} Active: {self.is_active}"
views.py
from django.shortcuts import render, redirect, reverse
import stripe
from django.conf import settings
stripe.api_key = settings.STRIPE_SECRET_KEY
def subscription_view(request):
subscription = {
'Basic Membership' :'price_1RNgLNIoFyCdZSrgu83irObA',
'premium' :'price_1RNgLvIoFyCdZSrg9j87OiP7',
'pro' :'price_1RNgMUIoFyCdZSrgEIxgO9HP',
}
if request.method == 'POST':
if not request.user.is_authenticated:
return redirect(f"{reverse('account_login')}?next={request.get_full_path()}")
price_id = request.POST.get('price_id')
checkout_session = stripe.checkout.Session.create(
line_items=[
{
'price':price_id,
'quantity':1,
},
],
payment_method_types=['card'],
mode='subscription',
success_url = request.build_absolute_uri(reverse("create_subscription")) + f'?session_id={{CHECKOUT_SESSION_ID}}',
cancel_url=request.build_absolute_uri(f'{reverse("subscription")}'),
customer_email=request.user.email,
metadata={
'user_id': request.user.id,
}
)
return redirect(checkout_session.url, code=303)
return render(request, 'a_subscription/subscription.html', {'subscription' : subscription})
def create_subscription(request):
#create subscription object in database
return redirect('my_sub')
def my_sub_view(request):
return render(request, 'a_subscription/my-sub.html')
Сообщение об ошибке:
Ошибка InvalidRequestError в /subscription/ Request req_F6PVTyTtfDXnIf: вы передали пустую строку для 'line_items[0][price]'. Мы предполагаем, что пустые значения являются попыткой отменить установку параметра; однако 'line_items[0][price]' не может быть отменен. Вам следует удалить 'line_items[0][price]' из вашего запроса или указать непустое значение.
У меня это работало как раз перед этим, и это внезапно начало происходить, как только я попытался включить create_subscription в views.
Мы были бы очень признательны за любую помощь!
В этом случае сообщение об ошибке очень полезно (что не всегда бывает с сообщениями об ошибках API!). В нем сообщается, что вы передаете пустую строку для переменной price_id
при попытке создать сеанс проверки.
Поскольку это значение получено из аргумента request
в вашей функции subscription_view()
, вам нужно будет выяснить, почему вы не получаете допустимое значение price_id
. Возможно, имеет смысл указать значение False
по умолчанию и проверить его.
Ниже я выделил строку из вашего файла views.py
, в которой, как мне кажется, вам следует продолжить изучение:
def subscription_view(request):
subscription = {
'Basic Membership' :'price_1RNgLNIoFyCdZSrgu83irObA',
'premium' :'price_1RNgLvIoFyCdZSrg9j87OiP7',
'pro' :'price_1RNgMUIoFyCdZSrgEIxgO9HP',
}
if request.method == 'POST':
if not request.user.is_authenticated:
return redirect(f"{reverse('account_login')}?next={request.get_full_path()}")
price_id = request.POST.get('price_id') # <- Why is this empty?
# Check if you have a valid price_id before you run this next command
checkout_session = stripe.checkout.Session.create(
line_items=[
{
'price':price_id,
'quantity':1,
},
],
...
)
Как только вы сможете определить, почему в вашем POST-запросе нет ожидаемого идентификатора цены, вы, надеюсь, поймете, что вам нужно сделать, чтобы передать его обратно в код вашего сервера.
Я разобрался! простая ошибка от моего имени, я изменил базовое членство на базовое в Stripe и views.py но не в моем html-файле! Большое вам спасибо!!!