【问题标题】:Issues with changin/updating stripe subscription (django)更改/更新条带订阅的问题(django)
【发布时间】:2020-05-25 04:39:02
【问题描述】:

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

【问题讨论】:

    标签: python django stripe-payments


    【解决方案1】:

    这里的诀窍是,如果您要更新已有的 Subscription 并且已经有一个项目,那么您需要在更新时传递该 SubscriptionItem 的 ID,以便 API 知道您没有尝试添加具有相同计划的第二个 SubscriptionItem。

    根据该错误消息,该计划似乎已根据该订阅进行了更新,但可能与您期望的方式不同。如果订阅以“标准”计划开始,那么您上面的代码已被执行,它可能会将“基本”计划添加到现有标准的addition中。我敢打赌,他们现在同时订阅了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'
        }]
    )
    

    【讨论】:

    • 感谢您的详细回复!我现在明白我哪里出错了:)
    猜你喜欢
    • 2018-09-20
    • 2021-05-30
    • 2014-02-14
    • 2016-04-27
    • 2021-01-28
    • 2015-11-08
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    相关资源
    最近更新 更多