Android Billing 5.x:测试内购取消、订阅流程及场景验证问询
Android Kotlin Billing 5.x 测试相关问题解答
1. 取消应用内测试购买
根据商品类型不同,取消方式分两种:
- 一次性商品(消耗型/非消耗型)
- 消耗型商品:调用BillingClient的
consumeAsync方法,传入目标购买的令牌(purchase.purchaseToken),消耗完成后测试账号可再次购买该商品。 - 非消耗型商品:无法通过代码直接取消,可通过两种方式操作:
- 登录Google Play Console,进入「应用内商品」-「测试订单」,找到对应测试账号的订单手动取消/退款;
- 测试账号打开Google Play应用,进入「订单」页面找到对应测试订单,申请退款取消。
- 消耗型商品:调用BillingClient的
- 订阅类商品
- 测试账号打开Google Play应用,进入「订阅」页面找到目标订阅,点击取消订阅;
- 或登录Google Play Console,进入「订阅」-「测试订阅」,直接终止对应测试订阅。
2. 测试应用内计费的取消场景
订阅取消场景测试
- 立即取消验证:测试账号购买订阅后,直接在Google Play中取消订阅,随后调用
queryPurchasesAsync查询订阅状态,验证App是否正确识别订阅的取消状态(注意:订阅取消后仍会保持有效直到当前周期结束,需验证周期到期后的失效逻辑)。 - 到期自动取消验证:在Google Play Console创建短周期测试订阅(如1分钟),购买后等待订阅到期,查询购买状态并验证App对订阅失效的处理逻辑。
一次性购买取消场景测试
- 手动在Google Play Console取消测试订单后,调用
queryPurchasesAsync查询购买记录,验证App是否能正确识别已取消的订单,并同步调整功能权限(如移除已解锁的付费内容)。
代码模拟测试
- 在测试环境中,通过Mock BillingClient的返回结果,模拟购买状态为
PURCHASE_CANCELLED,验证App的错误处理逻辑是否正常运行。
3. 应用内订阅购买的操作步骤
前置准备
- 在Google Play Console创建订阅商品,配置价格、周期等信息,将测试账号添加到「许可测试」列表;
- 集成Billing 5.x SDK,初始化
BillingClient并设置PurchasesUpdatedListener监听购买结果。
具体流程(Kotlin代码示例)
- 查询订阅商品详情
val targetSku = listOf("your_subscription_sku") val skuParams = SkuDetailsParams.newBuilder() .setSkusList(targetSku) .setType(BillingClient.SkuType.SUBS) .build() billingClient.querySkuDetailsAsync(skuParams) { responseCode, skuDetails -> if (responseCode == BillingClient.BillingResponseCode.OK && skuDetails != null) { // 获取到订阅详情,展示给用户选择 } } - 发起购买请求
用户点击购买按钮后,用获取到的SkuDetails创建购买参数,启动购买流程:val billingFlowParams = BillingFlowParams.newBuilder() .setSkuDetails(selectedSkuDetails) // 传入用户选择的订阅详情 .build() billingClient.launchBillingFlow(activity, billingFlowParams) - 处理购买结果
在PurchasesUpdatedListener中处理不同购买状态:private val purchaseListener = PurchasesUpdatedListener { billingResult, purchases -> when (billingResult.responseCode) { BillingClient.BillingResponseCode.OK -> { purchases?.forEach { purchase -> handleValidPurchase(purchase) } } BillingClient.BillingResponseCode.USER_CANCELED -> { // 用户取消购买,提示或恢复原状态 } else -> { // 购买失败,处理错误提示 } } } - 确认订阅购买
购买成功后需调用acknowledgePurchaseAsync确认购买,避免订单被退款:private fun handleValidPurchase(purchase: Purchase) { if (!purchase.isAcknowledged) { val acknowledgeParams = AcknowledgePurchaseParams.newBuilder() .setPurchaseToken(purchase.purchaseToken) .build() billingClient.acknowledgePurchaseAsync(acknowledgeParams) { result -> if (result.responseCode == BillingClient.BillingResponseCode.OK) { // 订阅确认成功,解锁对应服务 } } } } - 查询当前订阅状态
App启动或需要验证订阅时,查询用户的有效订阅:billingClient.queryPurchasesAsync(BillingClient.SkuType.SUBS) { responseCode, purchases -> if (responseCode == BillingClient.BillingResponseCode.OK) { // 遍历订阅列表,判断用户是否有有效订阅 purchases?.forEach { subscription -> // 处理订阅状态逻辑 } } }
内容的提问来源于stack exchange,提问作者Sunny_Sony_singh
相关产品推荐
相关产品推荐

