Shopify App订阅 APPLY_ON_NEXT_BILLING_CYCLE实在太坑了

问题描述

最近,我们在开发Shopify应用时,遇到了一个非常恼人的问题。我们希望允许商家降级他们当前的订阅计划,但是要求降级要在下一个计费周期才生效,当前的计划应该保持不变直到下一个计费周期。

我们发现了Shopify的 APPLY_ON_NEXT_BILLING_CYCLE 替换行为,本以为这就是我们想要的功能。但是,在测试时,我们发现当前的订阅立即被取消,降级后的订阅直接变成了 ACTIVE 状态,而这个行为应该是在下一个计费周期才触发的。

Shopify,你在逗我吗?

这特么是什么鬼设计?文档里写得清清楚楚,降级的订阅应该在下一个计费周期才生效,但实际上却是立即生效。这不是坑人吗?

更可笑的是,测试订阅和正式订阅的行为还不一致,test:true只会发生订阅的直接替换,旧订阅被直接取消,新订阅立即生效,订阅周期立即调整为新订阅,不会出现文档中的各种行为。这不是在逼我们用正式订阅来测试吗?那测试订阅还有个毛用?

订阅和计费周期分不清?

Shopify似乎把订阅和计费周期的概念混淆了。对他们来说,只要有新的计费周期,旧的订阅就可以立即取消,新的订阅就可以立即生效。但对我们开发者来说,我们需要知道哪些订阅是活跃的,哪些是延期的。

现在Shopify的做法,让我们根本无法区分一个订阅是否应该保持活跃状态。他们只关心到什么时间节点需要向用户收多少钱。

我们app降级的例子,这个例子在standard下会触发延期:

1
2
3
4
5
STANDARD  
Cancels the merchant's current app subscription immediately and replaces it with the newly created app subscription, with the exception of the following scenarios where replacing the current app subscription will be deferred until the start of the next billing cycle.
1. The current app subscription is annual and the newly created app subscription is annual, using the same currency, but is of a lesser value.
2. The current app subscription is annual and the newly created app subscription is monthly and using the same currency.
3. The current app subscription and the newly created app subscription are identical except for the discount value.

用户先购买了Pro的年付套餐,下一个bill时间是2025-03-08,然后他降级到了Basic的月付,猜猜shopify会返回什么?
它会返回active的套餐是Basic,下一个bill时间是2025-03-08!!!!!
而我们期望的是他返回active的套餐是Pro年付,到2025-03-08之后再变成Basic月付.

shopify只关心了他要在2025年3月8日收取用户Basic的套餐, 但是他完全忽略了当前active的应该是Pro套餐.

总结

Shopify的这个订阅替换功能,简直就是一个大坑。

我真的是忍无可忍,只能在这里吐槽一下。Shopify,你们好歹也是一个大公司,能不能把这些基础功能设计得更人性化一点?不要再坑开发者了好吗?

相比之下Stripe的设计就合理的多,它会保持套餐的有效,直到下一个周期才会改变套餐.

参考链接:

https://shopify.dev/docs/api/admin-graphql/2023-10/enums/AppSubscriptionReplacementBehavior

https://community.shopify.com/c/webhooks-and-events/working-of-appsubscriptionreplacementbehavior-apply-on-next/td-p/2002698