更改/更新条带订阅 (django) 的问题

Mar*_*rko 3 python django stripe-payments stripe-api

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

当我尝试将用户订阅更新为新订阅时,出现此运行时错误:

Request req_kK2v51jnhuuKsW: Cannot add multiple subscription items with the same plan: price_HHU1Y81pU1wrNp
Run Code Online (Sandbox Code Playgroud)

我正在测试的帐户的计划与我尝试更新的计划不同。(此代码用于基本计划,该帐户已启用标准计划)。

非常感谢所有帮助!

编辑:这是模型数据,我尝试将所有“无”值更改为其他值,以查看它是否会更改错误,但没有更改。

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
Run Code Online (Sandbox Code Playgroud)

w1z*_*n1p 5

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

根据该错误消息,该计划似乎已在该订阅上更新,但可能不是您期望的方式。如果订阅开始于“标准”计划,那么您上面的代码已执行,它可能会在现有标准之外添加“基本”计划。我敢打赌,他们订购了两个basicstandard现在。为了按预期进行更新,您需要删除标准 SubscriptionItem 并添加基本 SubscriptionItem,我将在下面显示代码。或者,您可以直接更新 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'
    }]
)
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的详细回复!我现在明白我错在哪里了:) (2认同)