Ошибка 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-файле! Большое вам спасибо!!!

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