使用Shopify Billing开发应用:如何判断订阅是否已扣费?
解决方案:区分已扣费与未扣费的取消订阅
方法1:利用REST API的RecurringApplicationCharge的activated_on字段
你提到的activated_on字段完全可以作为已扣费的核心标识:
- 当订阅成功完成首次扣费(试用期结束后),
activated_on会被Shopify赋值为具体的日期时间; - 若客户在试用期内取消/卸载应用,
activated_on会保持null。
调用示例(以Ruby为例):
# 获取目标店铺的所有循环应用收费记录 charges = ShopifyAPI::RecurringApplicationCharge.all charges.each do |charge| if charge.activated_on.present? # 该订阅已完成扣费 else # 未扣费(试用期内取消) end end
方法2:使用GraphQL API查询订阅的交易/计费记录
如果偏好GraphQL方案,可以通过查询订阅的交易记录或计费尝试来判断是否有成功扣费:
query getSubscriptionDetails($subscriptionId: ID!) { appSubscription(id: $subscriptionId) { id status transactions(first: 10) { edges { node { amount status processedAt } } } billingAttempts(first: 10) { edges { node { status processedAt } } } } }
- 检查
transactions中是否存在status: SUCCESSFUL的条目,或billingAttempts中是否有status: SUCCEEDED的记录,这两种情况都说明订阅已完成至少一次扣费。
方法3:结合Webhook与本地状态记录
为了避免API查询延迟,建议在应用数据库中维护订阅的本地状态:
- 订阅创建时,记录试用期结束时间;
- 收到Shopify的
app_subscription_activatedwebhook(扣费成功触发)时,标记该订阅为「已扣费」; - 收到
app_uninstalledwebhook时,先查本地记录:若标记为已扣费则不降级账号;若未标记且已过试用期,再通过API验证是否有成功扣费记录。
注意事项
- REST API的
RecurringApplicationCharge仅适配旧版订阅模型,若使用新版AppSubscription GraphQL,优先采用GraphQL交易查询方法; - 确保应用拥有
read_own_subscriptions、write_own_subscriptions等必要权限; - 处理卸载事件时,切勿仅依赖
appSubscription的status: CANCELLED,必须结合扣费记录判断是否降级账号。
内容的提问来源于stack exchange,提问作者Viet Nguyen
相关产品推荐
相关产品推荐

