如何在 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 返回的订阅状态和到期时间决定是否保留权益:
- 用户在 Google Play 中确认取消。
- 当前计费周期内,订阅仍然有效。
- 到期前不会再次自动扣款。
- 当前周期结束后,再关闭对应权益。
更稳妥的做法是由服务端通过 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 返回的到期时间和状态为准。
- 服务端主动退款、撤销订阅或终止权益产生的效果,可能与单纯停止自动续订不同,不能把它们视为同一种”取消”。
备注:内容仅供参考。
