我正在一个能够分析用户数据的平台上。我想使用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)
打破这一点来解决关键问题:
如果在更新订阅时想要change the billing cycle,则可以use the billing_cycle_anchor
parameter。这将影响以后的发票。
第二,虽然您可以billing_cycle_anchor
,但条带分配逻辑始终基于线性时间消耗(它仅适用于许可的每人座位计划)。如果您想贷记不同的金额,则需要手动进行,并禁用Stripe的按比例分配。您可以: