gpt4 book ai didi

python - 更改/更新 strip 订阅 (django) 的问题

转载 作者:行者123 更新时间:2023-12-04 02:35:43 26 4
gpt4 key购买 nike

目前,我的网站上提供的订阅之一具有此代码。代码检查用户是否已经有计划,如果没有,则运行 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

最佳答案

这里的技巧是,如果您要更新已有单个项目的现有订阅,则需要在更新时传递该订阅项目的 ID,以便 API 知道您不会尝试添加第二个订阅项目同样的计划。

根据该错误消息,该计划似乎已在该订阅上更新,但可能不是您期望的方式。如果订阅开始于“标准”计划,那么您上面的代码已执行,它可能会在现有标准之外添加“基本”计划。我敢打赌他们都订阅了 basicstandard现在。为了update如您所料,您需要删除标准 SubscriptionItem 并添加基本 SubscriptionItem,我将在下面显示代码。或者,您可以 update the SubscriptionItem直接交换计划。

请注意,如果每个订阅有多个计划,则需要修改此示例以找到正确的订阅项目 ID。这是执行此操作的一种方法:

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'
}]
)

关于python - 更改/更新 strip 订阅 (django) 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61967415/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com