Проблемы с изменением / обновлением подписки на Stripe (django)

В настоящее время у меня есть этот код для одной из подписок, доступных на моем сайте. Код проверяет, есть ли у пользователя план, если нет, запускается инструкция else (работает нормально), и если они есть, код для обновления их текущей подписки заменяется новой подпиской.(Не работает)

@login_required
def charge(request):

    user_info = request.user.profile
    email = user_info.inbox


    if request.method == 'POST':
        #returns card token in terminal
        print('Data:', request.POST)

        user_plan = request.user.profile.current_plan

        if user_plan != 'None':
            '''if they have a plan already, override that plan
            with this new plan this is using an already created
            user'''

            #this throws an error right now
            new_plan = stripe.Subscription.modify(
                #the current plan(wanting to change)
                user_info.subscription_id,
                cancel_at_period_end=True,
                proration_behavior='create_prorations',
                #the new subscription
                items=[{'plan':'price_HHU1Y81pU1wrNp',}]
                )

            user_info.subscription_id = new_plan.id

        #if they don't have a subscription already
        else:
            amount = 10

            customer = stripe.Customer.create(
                email=email,
                source=request.POST['stripeToken'],
                description=user_info.genre_one,
                )

            charge = stripe.Subscription.create(
                customer=customer.id,#email of logged in person
                items = [{"plan": "price_HHU1Y81pU1wrNp"}],#change plan id depending on plan chosen
                )

            #updates users current plan with its id and other info 
            user_info.subscription_id = charge.id
            user_info.customer_id = customer.id
        user_info.current_plan = 'B'
        user_info.save()

        return redirect(reverse('success', args=[amount]))

Когда я пытаюсь обновить подписку пользователей на новую, я получаю эту ошибку времени выполнения:

Request req_kK2v51jnhuuKsW: Cannot add multiple subscription items with the same plan: price_HHU1Y81pU1wrNp

У учетной записи, с которой я тестирую, есть план, отличный от того, который я пытаюсь обновить.(этот код предназначен для базового плана, в учетной записи включен стандартный план).

Любая помощь приветствуется!

Изменить: это данные модели, я попытался изменить все значения "Нет" на что-то еще, чтобы увидеть, изменит ли это ошибку, но этого не произошло.

SUB_PLANS = [
('None','None'),
('B','Basic Plan'),
('S', 'Standard Plan'),
('P', 'Premium Plan'),
]


GENRE_CHOICES = [
('1','None'),
('2','Adventure'),
('3','Action'),
('4','Puzzle'),
('5','Story Based'),

]

# Create your models here.
class Profile(models.Model):
    User = models.OneToOneField(User, null=True, on_delete=models.CASCADE)
    username = models.CharField(max_length=30)
    #where games are sent
    inbox = models.EmailField(max_length = 50)
    current_plan = models.CharField(max_length = 4, choices = SUB_PLANS, default='None')
    #genres they like
    genre_one = models.CharField(max_length = 20, choices = GENRE_CHOICES, default = 'None')
    genre_two = models.CharField(max_length = 20, choices = GENRE_CHOICES, default = 'None')
    genre_three = models.CharField(max_length = 20, choices = GENRE_CHOICES, default = 'None')

    subscription_id = models.CharField(max_length = 40, default="None")
    customer_id = models.CharField(max_length = 40, default = "None")

    '''on account creation plan == null, then once they buy one,
    plan is added as a dropdown that they can edit easy'''
    def __str__(self):
        return self.username

1 ответ

Решение

Уловка здесь в том, что если вы обновляете существующую подписку, в которой уже есть один элемент, вам нужно будет передать идентификатор этого SubscriptionItem при обновлении, чтобы API знал, что вы не пытаетесь добавить второй SubscriptionItem с тот же план.

На основании этого сообщения об ошибке кажется, что план уже был обновлен для этой подписки, но, вероятно, не так, как вы ожидаете. Если Подписка началась по "стандартному" плану, то ваш код, приведенный выше, был выполнен, вероятно, он добавил "базовый" план в дополнение к существующему стандарту. Бьюсь об заклад, они подписаны на обаbasic а также standardсейчас. Чтобы выполнить обновление, как вы ожидаете, вы захотите удалить стандартный SubscriptionItem и добавить базовый SubscriptionItem, код которого я покажу ниже. Кроме того, вы можете обновить SubscriptionItem напрямую, чтобы поменять тарифный план.

Обратите внимание, что если у вас есть несколько планов на подписку, этот пример необходимо изменить, чтобы найти правильный идентификатор SubscriptionItem. Вот один из способов сделать это:

current_subscription = stripe.Subscription.retrieve(user_info.subscription_id)

new_plan = stripe.Subscription.modify(
    user_info.subscription_id,
    cancel_at_period_end=True,
    proration_behavior='create_prorations',
    #the new subscription
    items=[{
        'id': current_subscription['items'].data[0].id, # note if you have more than one Plan per Subscription, you'll need to improve this. This assumes one plan per sub.
        'deleted': True,
    }, {
        'plan': 'price_HHU1Y81pU1wrNp'
    }]
)
Другие вопросы по тегам