有谁知道我如何在条带中设置对升级和降级有特殊要求的特定订阅?

问题描述 投票:0回答:1

我正在一个能够分析用户数据的平台上。我想使用Stripe付款,但是有一些问题。首先,我想描述一下我希望自己的定价如何,以便更清楚地为您理解我想要实现的目标。在创建帐户的过程中,用户可以选择一个金额,例如从1 $到1000 $,将可用于所有服务。每月将收取此金额,因此它将用作订阅计划。区别在于,每月的每一天都不会按比例使用该金额,就像订阅一样。例如,用户从当月5号开始一个月的定价期,金额等于10 $。在此期间的前10天,他没有执行任何操作,因此他仍然有10美元。在第11天,他开始服务并在5小时内使用4 $。从那时起,他一直没有使用任何工具,直到当前期间结束,他还有6美元。我目前决定未使用的资金可能不会转入下一个结算期,因此从下个月的第5天起,他将再次获得10美元。当然,他的帐单每月会提前收取10美元。在我看来,到目前为止,我已经找到了解决方案。我的应用程序基于Angular前端和Django后端。因此,在前端中,我会在初始订阅创建过程中使用设置和帐户进行如下所示的操作:

pay(amount) {
  var self = this;
  var handler = (<any>window).StripeCheckout.configure({
    key: ‘key’,
    locale: 'auto',
    token: (token: any) => {

      this.UserService.sendAccountPricing(token.id, amount).subscribe((data: any) => {
    // some code
        },
        (err: HttpErrorResponse) => {
          console.log(err.error)
          alert(err.error)
        });

    }
  });

  handler.open({
    closed: function () {
      self.UploaderService.displayNewPaymentButton = true;
    },
    name: 'Demo Site',
    description: '2 widgets',
    amount: amount * 100,
    email: this.UploaderService.email
  });
}

在后端:

def post(self, request):

    serializer = AccountSerializer(data=request.data)

    if serializer.is_valid():

        key = request.META.get('HTTP_AUTHORIZATION').split()[1]

        user_id = Token.objects.get(key=key).user_id

        user = User.objects.get(id=user_id)

        customer = stripe.Customer.create(
            email=user.email,
            source=request.data['token']
        )

        subscription = stripe.Subscription.create(
            customer=customer.id,
            items=[
                {
                    'plan': 'plan_H8Kg0c8l8WmaQM',
                    'quantity': request.data['amount'],
                },
            ],
            expand=['latest_invoice.payment_intent'],
        )

        Account.objects.filter(user=user).update(subscription=subscription['id'])
        Account.objects.filter(user=user).update(plan_selected=True)

        return Response(status=status.HTTP_200_OK)

我已在订阅设置中配置为每1个数量等于1 $。因此,当用户选择等于13 $的每月定价计划时,我会向后端发送金额等于13的信息,然后Django后端向Stripe发送请求以创建13个数量等于13 $的订阅。上面的源代码负责这部分。您可以看看并检查是否正确完成吗?也许有更好的方法可以做到这一点?这只是我想到的唯一解决方案,但似乎可行。当我想降级或升级我的计划时,问题就开始了。这就是我想要的样子。当用户降级或升级他的定价计划时,我只是计算出他在当前账单期间花费了多少钱,我还给了他所有剩余的钱。然后,我用他在新计划中选择的金额向他的发票收费,从这一刻开始,我开始一个新的计费期。示例:

用户在5月3日创建了一个每月订阅额等于20美元的帐户。在5月10日,他意识到预算不足,因为他已经使用了17美元,因此决定将其计划升级到50美元。系统返回他剩下的3 $,并向他的帐户收取等于50 $的金额。现在,他的帐单周期从5月10日开始,下一张等于50美元的发票将在6月10日开始。这就是问题所在。我在Stripe中找不到允许我执行此操作的功能。我试图做如下所示的操作,但是当然不起作用。订阅修改是不够的,因为它不起作用,正如我上面已经描述过的那样。有谁知道我该怎么做?我将非常感谢您的帮助。此外,对于我可以做得更好的建议和技巧也非常感谢。

前端:

  newPlan(amount) {

    var handler = (<any>window).StripeCheckout.configure({
      key: ‘key’,
      locale: 'auto',
      token: (token: any) => {

        alert('Your pricing plan has been changed.');


        this.UserService.sendChangeAccountPricing(token.id, amount).subscribe((data: any) => {
        // some code
          },
          (err: HttpErrorResponse) => {
            console.log(err.error)
            alert(err.error)
          });

      }
    });

    handler.open({
      name: 'Demo Site',
      description: '2 widgets',
      amount: amount * 100
    });

  }

后端:

def put(self, request):

    serializer = AccountSerializer(data=request.data)

    if serializer.is_valid():

        key = request.META.get('HTTP_AUTHORIZATION').split()[1]

        user_id = Token.objects.get(key=key).user_id

        user = User.objects.get(id=user_id)

        account = Account.objects.filter(user=user)

        account = Account.objects.get(user=user)

        subscription = stripe.Subscription.retrieve(account.subscription)

        subscription = stripe.Subscription.modify(
            subscription.id,
            items=[{
                'id': subscription['items']['data'][0].id,
                'plan': ‘myplan',
                'quantity': request.data['amount']
            }],
            billing_cycle_anchor='now',
            proration_behavior='none',
        )

        return Response(status=status.HTTP_200_OK)
python django angular stripe-payments payment
1个回答
0
投票

打破这一点来解决关键问题:

如果在更新订阅时想要change the billing cycle,则可以use the billing_cycle_anchor parameter。这将影响以后的发票。

第二,虽然您可以billing_cycle_anchor,但条带分配逻辑始终基于线性时间消耗(它仅适用于许可的每人座位计划)。如果您想贷记不同的金额,则需要手动进行,并禁用Stripe的按比例分配。您可以:

  • prorate the plan/quantity changes升级前的客户,负数表示信用。当为客户创建下一个发票时,该项目将被提取,并且贷项将应用于新的订阅金额。
  • 为上一张发票的付款开具Create an invoice item,以考虑应退还给客户的金额。
© www.soinside.com 2019 - 2024. All rights reserved.