PAYATHON 2026

如何在 Android 中取消 In-app Billing 自动续订订阅?

支付老李

结论

Android 客户端无法通过 BillingClient 直接关闭自动续订。通常需要将用户跳转到 Google Play 的订阅管理页面,让用户自行取消。

取消后,Google Play 默认只会停止下一周期的续费,不会退还当前周期的费用。订阅权益通常会保留到当前计费周期结束。

跳转到指定订阅的管理页面

可以通过 “Cancel Upgrade” 按钮打开对应订阅的 Google Play 管理页面:

import android.content.Context
import android.content.Intent
import android.net.Uri

fun openSubscriptionManagement(
    context: Context,
    productId: String
) {
    val uri = Uri.parse(
        "https://play.google.com/store/account/subscriptions" +
            "?sku=${Uri.encode(productId)}" +
            "&package=${Uri.encode(context.packageName)}"
    )

    val intent = Intent(Intent.ACTION_VIEW, uri).apply {
        addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
    }

    context.startActivity(intent)
}

调用示例:

cancelUpgradeButton.setOnClickListener {
    openSubscriptionManagement(
        context = this,
        productId = "premium_monthly"
    )
}

这里的 premium_monthly 必须是 Google Play Console 中配置的订阅商品 ID,不能使用基础方案 ID、优惠 ID 或订单号。

如果无法确定具体商品,也可以打开用户的全部订阅列表:

fun openAllSubscriptions(context: Context) {
    val intent = Intent(
        Intent.ACTION_VIEW,
        Uri.parse("https://play.google.com/store/account/subscriptions")
    ).apply {
        addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
    }

    context.startActivity(intent)
}

取消后的状态处理

用户点击 “Cancel Upgrade” 后,不要立即撤销会员权限。这个操作只会打开订阅管理页面,用户未必完成了取消。

即使已经关闭自动续订,购买记录通常在当前计费周期内仍然有效。应用应根据 Google Play 返回的订阅状态和到期时间决定是否保留权益:

  1. 用户在 Google Play 中确认取消。
  2. 当前计费周期内,订阅仍然有效。
  3. 到期前不会再次自动扣款。
  4. 当前周期结束后,再关闭对应权益。

更稳妥的做法是由服务端通过 Google Play Developer API 查询订阅状态,并结合 Real-time Developer Notifications 处理取消、续费、过期、暂停和撤销等状态变化。不要只依赖客户端缓存,也不要根据按钮点击事件直接修改会员状态。

是否可以由服务端代用户取消

Google Play Developer API 支持服务端管理订阅,可以在特定业务场景下停止续订。但它不是 Android 客户端 API,调用凭据也绝不能放入 APK。

如果需要在应用内实现 “一键取消”,调用链可以这样设计:

Android app
    -> 自有后端(验证用户身份和购买归属)
    -> Google Play Developer API
    -> 查询最新订阅状态
    -> 返回处理结果

具体的取消接口和可用取消类型,可能会随 Google Play Developer API 版本及订阅模型变化。实现时应以项目当前使用的官方接口定义为准。

对于普通用户主动取消的场景,跳转到 Google Play 订阅管理页面通常更简单,也可以避免账号不匹配、重复请求和服务账号泄露等问题。

注意事项

  • “取消续订”和”退款”不是一回事。停止续订通常不会自动退款。
  • 不要通过消费商品、确认购买或删除本地购买记录来实现取消按钮,这些操作都无法取消订阅。
  • 应明确提示用户:“取消后仍可使用至当前订阅周期结束。”
  • 用户必须使用购买该订阅的 Google 账号进行操作。如果设备上登录了多个 Google 账号,可能需要先切换账号。
  • 测试订阅的计费周期和状态变化速度可能与正式订阅不同,业务逻辑仍应以 Google Play 返回的到期时间和状态为准。
  • 服务端主动退款、撤销订阅或终止权益产生的效果,可能与单纯停止自动续订不同,不能把它们视为同一种”取消”。

备注:内容仅供参考。