Проблемы с изменением / обновлением подписки на 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'
}]
)