本文档包含 Google Play 结算库的版本说明。
Google Play 结算库 7.1.1 版本发布 (2024-10-03)
Google Play 结算库 7.1.1 版本和 Kotlin 扩展现已推出。
Bug 修复
- 修复了 Play 结算库 7.1.0 中与测试
BillingResult
响应代码相关的 bug。
Google Play 结算库 7.1.0 版本发布 (2024-09-19)
Google Play 结算库 7.1.0 版本和 Kotlin 扩展现已推出。
更改摘要
- 改进了与连接状态和管理相关的线程安全性。
- 引入了用于测试
BillingResult
响应代码的部分更改,该功能在 Play 结算库 7.1.1 中已完全发布。要使用此功能测试您的集成,您需要升级到 Play 结算库 7.1.1。存在一个 bug,只会影响启用结算覆盖测试的应用,但不影响常规使用。有关更多信息,请参阅测试BillingResult
响应代码。
Google Play 结算库 7.0.0 版本发布 (2024-05-14)
Google Play 结算库 7.0.0 版本和 Kotlin 扩展现已推出。
更改摘要
添加了支持分期订阅的 API。
- 为用户有资格购买的分期基础计划添加了
ProductDetails.InstallmentPlanDetails
。此 API 可帮助您的应用识别分期计划及其承诺设置,以便向用户提供相关信息。如需了解详情,请参阅我们的订阅分期指南。
- 为用户有资格购买的分期基础计划添加了
添加了
PendingPurchasesParams
和BillingClient.Builder.enablePendingPurchases(PendingPurchaseParams)
以取代此版本中已弃用的BillingClient.Builder.enablePendingPurchases()
。- 已弃用的
enablePendingPurchases()
在功能上等同于enablePendingPurchases(PendingPurchasesParams.newBuilder().enableOneTimeProducts().build())
。
- 已弃用的
添加了支持订阅预付费计划待处理交易的 API
- 将
PendingPurchasesParams.Builder.enablePrepaidPlans()
与BillingClient.Builder.enablePendingPurchases(PendingPurchaseParams)
结合使用,以启用订阅预付费计划的待处理交易。添加支持时,请确保您的应用也正确管理订阅生命周期。如需了解详情,请参阅我们的待处理购买指南。 - 添加了
Purchase.PendingPurchaseUpdate
和Purchase.getPendingPurchaseUpdate()
,用于检索现有订阅的待处理续订、升级或降级。
- 将
移除了
BillingClient.Builder.enableAlternativeBilling()
、AlternativeBillingListener
和AlternativeChoiceDetails
。- 开发者应改为在监听器回调中使用
BillingClient.Builder.enableUserChoiceBilling()
以及UserChoiceBillingListener
和UserChoiceDetails
。
- 开发者应改为在监听器回调中使用
移除了
BillingFlowParams.ProrationMode
、BillingFlowParams.SubscriptionUpdateParams.Builder.setReplaceProrationMode()
和BillingFlowParams.SubscriptionUpdateParams.Builder.setReplaceSkusProrationMode()
。- 开发者应改为使用
BillingFlowParams.SubscriptionUpdateParams.ReplacementMode
和BillingFlowParams.SubscriptionUpdateParams.Builder#setSubscriptionReplacementMode(int)
。 BillingFlowParams.SubscriptionUpdateParams.Builder.setReplaceProrationMode()
.BillingFlowParams.SubscriptionUpdateParams.Builder.setReplaceSkusProrationMode()
.
- 开发者应改为使用
移除了
BillingFlowParams.SubscriptionUpdateParams.Builder#setOldSkuPurchaseToken()
。BillingClient.queryPurchaseHistoryAsync()
已弃用,并将在未来的版本中移除。开发者应改为使用以下替代方案- 已确认和待处理购买:使用
BillingClient.queryPurchasesAsync()
获取活动购买。 - 已消耗购买:开发者应在自己的服务器上跟踪已消耗的购买。
- 已取消购买:使用 voided-purchases 开发者 API。
- 有关更多详细信息,请参阅查询购买历史记录
- 已确认和待处理购买:使用
当开发者指定空的
offerToken
时,BillingFlowParams.ProductDetailsParams.setOfferToken()
现在会抛出异常。将
minSdkVersion
更新为 21,将targetSdkVersion
更新为 34。
Google Play 结算库 6.2.1 版本发布 (2024-04-16)
Google Play 结算库 6.2.1 版本和 Kotlin 扩展现已推出。
更改摘要
- 修复了
BillingClient.showAlternativeBillingOnlyInformationDialog()
中的一个 bug,在某些情况下对话框完成后可能不会调用AlternativeBillingOnlyInformationDialogListener
。
Google Play 结算库 6.2.0 版本发布 (2024-03-06)
Google Play 结算库 6.2.0 版本和 Kotlin 扩展现已推出。
更改摘要
- 添加了支持外部优惠的 API
- 添加了
BillingClient.Builder.enableExternalOffer()
,以启用提供外部优惠的功能。 - 添加了
BillingClient.isExternalOfferAvailableAsync()
,以检查提供外部优惠功能的可用性。 - 添加了
BillingClient.showExternalOfferInformationDialog()
,用于在引导用户离开应用之前向用户显示信息对话框。 - 添加了
BillingClient.createExternalOfferReportingDetailsAsync()
,用于创建通过外部优惠进行的交易所需的载荷。
- 添加了
Google Play 结算库 6.1.0 版本发布 (2023-11-14)
Google Play 结算库 6.1.0 版本和 Kotlin 扩展现已推出。
更改摘要
- 添加了支持仅替代结算(即无需用户选择)的 API
- 添加了
BillingClient.Builder.enableAlternativeBillingOnly()
,以功能上启用仅提供替代结算的能力。 - 添加了
BillingClient.isAlternativeBillingOnlyAvailableAsync()
,以检查仅提供替代结算的可用性。 - 添加了
BillingClient.showAlternativeBillingOnlyInformationDialog()
,以显示信息对话框,告知用户正在使用仅替代结算。 - 添加了
BillingClient.createAlternativeBillingOnlyReportingDetailsAsync()
,用于创建通过仅替代结算进行的交易所需的载荷。
- 添加了
- 更新了用户选择结算 API
- 添加了
UserChoiceBillingListener
,以取代已被标记为弃用的 AlternativeBillingListener。 - 添加了
UserChoiceDetails
,以取代已被标记为弃用的AlternativeChoiceDetails
。 - 添加了
BillingClient.Builder.enableUserChoiceBilling()
,以取代已被标记为弃用的BillingClient.Builder.enableAlternativeBilling()
。
- 添加了
- 添加了
BillingClient.getBillingConfigAsync()
,用于检索 Google Play 国家/地区。
Google Play 结算库 6.0.1 版本发布 (2023-06-22)
Google Play 结算库 6.0.1 版本和 Kotlin 扩展现已推出。
更改摘要
更新 Play 结算库以兼容 Android 14。
Google Play 结算库 6.0 版本发布 (2023-05-10)
Google Play 结算库 6.0.0 版本和 Kotlin 扩展现已推出。
更改摘要
添加了新的
ReplacementMode
枚举,以取代ProrationMode
。请注意,出于向后兼容性原因,
ProrationMode
仍然可用。移除了
PENDING
购买的订单 ID。之前,即使购买待处理,订单 ID 也会始终创建。从版本 6.0.0 开始,待处理购买将不会创建订单 ID,对于这些购买,订单 ID 将在购买状态变为
PURCHASED
后填充。移除了
queryPurchases
和launchPriceConfirmationFlow
方法。之前标记为弃用的
queryPurchases
和launchPriceConfirmationFlow
方法已在 Play 结算库 6.0.0 中移除。开发者应使用queryPurchasesAsync
代替queryPurchases
。对于launchPriceConfirmationFlow
的替代方案,请参阅价格变化。添加了新的网络错误响应代码。
从 PBL 6.0.0 版本开始,添加了新的网络错误响应代码
NETWORK_ERROR
。当因网络连接问题发生错误时,会返回此代码。这些网络连接错误之前报告为SERVICE_UNAVAILABLE
。更新了
SERVICE_UNAVAILABLE
和SERVICE_TIMEOUT
。从 PBL 6.0.0 版本开始,由于处理超时导致的错误将返回
SERVICE_UNAVAILABLE
,而不是当前的SERVICE_TIMEOUT
。在 PBL 的早期版本中,此行为不会改变。
移除了
SERVICE_TIMEOUT
。从 PBL 6.0.0 版本开始,将不再返回
SERVICE_TIMEOUT
。PBL 的早期版本仍将返回此代码。添加了额外的日志记录。
Play 结算库 6 版本包含额外的日志记录,这提供了有关 API 使用情况(例如成功和失败)和服务连接问题的见解。这些信息将用于改进 Play 结算库的性能并为错误提供更好的支持。
Google Play 结算库 5.2.1 版本发布 (2023-06-22)
Google Play 结算库 5.2.1 版本和 Kotlin 扩展现已推出。
更改摘要
更新 Play 结算库以兼容 Android 14。
Google Play 结算库 5.2 版本发布 (2023-04-06)
Google Play 结算库 5.2.0 版本和 Kotlin 扩展现已推出。
更改摘要
- 添加了类以支持韩国用户在移动设备/平板电脑上的替代结算流程
- 添加了
BillingFlowParams.SubscriptionUpdateParams.Builder.setOriginalExternalTransactionId()
方法,用于指定原始订阅的外部交易 ID。 - 添加了
BillingClient.Builder.enableAlternativeBilling()
方法,以允许韩国用户选择替代结算选项。
Google Play 结算库 5.1 版本发布 (2022-10-31)
Google Play 结算库 5.1.0 版本和 Kotlin 扩展现已推出。
此版本包含以下更改。
更改摘要
- 添加了
ProductDetails.SubscriptionOfferDetails.getOfferId()
方法,用于检索优惠 ID。 - 添加了
ProductDetails.SubscriptionOfferDetails.getBasePlanId()
方法,用于检索基础计划 ID。 - 将
targetSdkVersion
更新为 31。
Google Play 结算库 5.0 版本发布 (2022-05-11)
Google Play 结算库 5.0.0 版本和 Kotlin 扩展现已推出。
此版本包含以下更改。
更改摘要
- 引入了新的订阅模型,包括新的实体,使您能够为单个订阅产品创建多个优惠。有关更多信息,请参阅迁移指南。
- 添加了
BillingClient.queryProductDetailsAsync()
,以取代BillingClient.querySkuDetailsAsync()
。 - 添加了
setIsOfferPersonalized()
方法,用于满足欧盟个性化定价披露要求。要了解如何使用此方法,请参阅指明个性化价格。 - 移除了之前已弃用并在 Google Play 结算库 4.0.0 中被 queryPurchasesAsync 取代的
queryPurchases()
。 launchPriceChangeFlow
已弃用,并将在未来的版本中移除。要了解替代方案,请参阅启动价格变更确认流程。- 移除了
setVrPurchaseFlow()
,该方法之前在实例化购买流程时使用。在之前的版本中,此方法会将用户重定向到其 Android 设备上完成购买。移除此方法后,用户将通过标准购买流程完成购买。
Google Play 结算库 4.1 版本发布 (2022-02-23)
Google Play 结算库 4.1.0 版本和 Kotlin 扩展现已推出。
此版本包含以下更改。
更改摘要
- 添加了
BillingClient.showInAppMessages()
,以帮助处理订阅付款失败。要了解如何使用应用内消息处理订阅付款失败,请参阅处理付款失败。
Google Play 结算库 4.0 版本发布 (2021-05-18)
Google Play 结算库 4.0.0 版本和 Kotlin 扩展现已推出。
更改摘要
添加了
BillingClient.queryPurchasesAsync()
,以取代将在未来的版本中移除的BillingClient.queryPurchases()
。添加了新的订阅替换模式
IMMEDIATE_AND_CHARGE_FULL_PRICE
。添加了
BillingClient.getConnectionState()
方法,用于检索 Play 结算库的连接状态。更新了 Javadoc 和实现,以指示可以在哪个线程上调用方法以及结果发布到哪个线程。
添加了
BillingFlowParams.Builder.setSubscriptionUpdateParams()
作为启动订阅更新的新方法。这取代了已移除的BillingFlowParams#getReplaceSkusProrationMode
、BillingFlowParams#getOldSkuPurchaseToken
、BillingFlowParams#getOldSku
、BillingFlowParams.Builder#setReplaceSkusProrationMode
、BillingFlowParams.Builder#setOldSku
。添加了
Purchase.getQuantity()
和PurchaseHistoryRecord.getQuantity()
。添加了
Purchase#getSkus()
和PurchaseHistoryRecord#getSkus()
。这些取代了已移除的Purchase#getSku
和PurchaseHistoryRecord#getSku
。移除了
BillingFlowParams#getSku
、BillingFlowParams#getSkuDetails
和BillingFlowParams#getSkuType
。
Google Play 结算库 3.0.3 版本发布 (2021-03-12)
Google Play 结算库 3.0.3 版本、Kotlin 扩展和 Unity 插件现已推出。
Java 和 Kotlin Bug 修复
- 修复调用
endConnection()
时出现的内存泄漏问题。 - 修复了 Google Play 结算库被使用单一任务启动模式的应用使用时出现的问题。当应用从 Android 启动器恢复,且在暂停前结算对话框可见时,会触发
onPurchasesUpdated()
回调。
Unity Bug 修复
- 更新到 Java 3.0.3 版本,以修复内存泄漏并解决当应用从 Android 启动器恢复且在暂停前结算对话框可见时阻止购买的问题。
Google Play 结算库 3.0.2 版本发布 (2020-11-24)
Google Play 结算库 3.0.2 版本和 Kotlin 扩展现已推出。
Bug 修复
- 修复了 Kotlin 扩展中协程因错误“Already resumed”而失败的 bug。
- 修复了将 Kotlin 扩展与 kotlinx.coroutines 库 1.4+ 版本一起使用时未解析的引用问题。
Google Play 结算库 3.0.1 版本发布 (2020-09-30)
Google Play 结算库 3.0.1 版本和 Kotlin 扩展现已推出。
Bug 修复
- 修复了一个 bug,当应用在结算流程中被终止并恢复时,
PurchasesUpdatedListener
可能不会被调用并返回购买结果。
Google Play 结算库 3.0 版本发布 (2020-06-08)
Google Play 结算库 3.0.0 版本、Kotlin 扩展和 Unity 插件现已推出。
更改摘要
- 移除了奖励 SKU 支持。
- 移除了
ChildDirected
和UnderAgeOfConsent
参数。 - 移除了已弃用的开发者载荷方法。
- 移除了已弃用的方法
BillingFlowParams.setAccountId()
和BillingFlowParams.setDeveloperId()
。 - 移除了已弃用的方法
BillingFlowParams.setOldSkus(String oldSku)
和BillingFlowParams.addOldSku(String oldSku)
。 - 添加了可空性注解。
Bug 修复
SkuDetails.getIntroductoryPriceCycles()
现在返回int
而不是String
。- 修复了一个 bug,即使未设置任何额外参数,结算流程也会被视为具有额外参数。
Google Play 结算库 2.2.1 版本发布 (2020-05-20)
Google Play 结算库 2.2.1 版本现已推出。
Bug 修复
- 更新了 Kotlin 扩展所依赖的 Java Play 结算库的默认版本。
Google Play 结算库 2.2.0 版本发布和 Unity 支持 (2020-03-23)
Google Play 结算库 2.2.0 版本提供了帮助开发者确保购买归属正确用户的功能。这些更改取代了基于开发者载荷构建自定义解决方案的需求。作为本次更新的一部分,开发者载荷功能已弃用,并将在未来的版本中移除。有关更多信息(包括推荐的替代方案),请参阅开发者载荷。
Google Play 结算库 2 Unity 版本
除了当前的 Google Play 结算库 2 Java 和 Kotlin 版本外,我们还发布了用于 Unity 的库版本。使用 Unity 应用内购 API 的游戏开发者现在可以升级,以利用 Google Play 结算库 2 的所有功能,并使后续升级到未来版本的 Google Play 结算库更加容易。
要了解更多信息,请参阅将 Google Play 结算与 Unity 配合使用。
更改摘要
- Java Google Play 结算库
- 在
AcknowledgePurchaseParams
中,弃用了setDeveloperPayload()
和getDeveloperPayload()
方法。 - 在
ConsumeParams
中,弃用了setDeveloperPayload()
和getDeveloperPayload()
方法。 - 在
BillingFlowParams
中,将setAccountId()
重命名为setObfuscatedAccountId()
,并记录了该字段的长度限制为 64 个字符,且禁止包含个人身份信息 (PII)。setAccountId()
已标记为弃用,并将在未来的库版本中移除。 - 在
BillingFlowParams
中,添加了setObfuscatedProfileId()
,其工作方式类似于setObfuscatedAccountId()
。有关更多信息,请参阅开发者载荷更新和替代方案。 - 在
Purchase
中,添加了getAccountIdentifiers()
方法,用于返回在BillingFlowParams
中设置的混淆账户标识符。 - 在
BillingClient
中,loadRewardedSku()
方法已作为奖励 SKU 弃用的一部分被标记为弃用。您可以在 Play 管理中心帮助中心找到有关弃用的更多信息。
- 在
Google Play 结算库 2.1.0 版本发布和 Kotlin 扩展 2.1.0 版本发布 (2019-12-10)
Google Play 结算库 2.1.0 版本和新的 Kotlin 扩展现已推出。Play 结算库 Kotlin 扩展为 Kotlin 使用提供了惯用的 API 替代方案,具有更好的空安全和协程。有关代码示例,请参阅使用 Google Play 结算库。
此版本包含以下更改。
更改摘要
- 在
BillingFlowParams
中,弃用了setOldSku(String oldSku)
,并替换为setOldSku(String oldSku, String purchaseToken)
,以区分设备上多个账户拥有相同 SKU 的情况。
Google Play 结算库 2.0.3 版本发布 (2019-08-05)
Google Play 结算库 2.0.3 版本现已推出。
Bug 修复
- 修复了一个 bug,
querySkuDetailsAsync()
有时会因代码DEVELOPER_ERROR
而失败,而不是返回成功结果。
Google Play 结算库 2.0.2 版本发布 (2019-07-08)
Google Play 结算库 2.0.2 版本现已推出。此版本包含对参考文档的更新,不改变库的功能。
Google Play 结算库 2.0.1 版本发布 (2019-06-06)
Google Play 结算库 2.0.1 版本现已推出。此版本包含以下更改。
Bug 修复
- 修复了在某些情况下调试消息返回
null
的 bug。 - 修复了潜在的内存泄漏问题。
Google Play 结算库 2.0 版本发布 (2019-05-07)
Google Play 结算库 2.0 版本现已推出。此版本包含以下更改。
购买必须在三天内确认
Google Play 支持在您的应用内部(应用内)或应用外部(应用外)购买产品。为了让 Google Play 无论用户在哪里购买您的产品都能确保一致的购买体验,您必须在授予用户权限后尽快确认通过 Google Play 结算库收到的所有购买。如果您未在三天内确认购买,用户将自动收到退款,并且 Google Play 将撤销购买。对于 待处理交易(版本 2.0 中的新增功能),三天窗口期从购买状态变为 PURCHASED
开始计算,在购买处于 PENDING
状态时此规则不适用。
对于订阅,您必须确认任何具有新购买令牌的购买。这意味着所有初始购买、计划变更和重新注册都需要确认,但您无需确认后续的续订。要确定购买是否需要确认,您可以检查购买中的确认字段。
Purchase
对象现在包含一个 isAcknowledged()
方法,该方法指示购买是否已被确认。此外,Google Play Developer API 为 Purchases.products
和 Purchases.subscriptions
提供了确认布尔值。在确认购买之前,请务必使用这些方法确定购买是否已被确认。
您可以使用以下任一方法确认购买
- 对于可消耗产品,请使用客户端 API 中的
consumeAsync()
。 - 对于不可消耗的产品,请使用客户端 API 中的
acknowledgePurchase()
。 - Server API 中也提供了一个新的
acknowledge()
方法。
BillingFlowParams.setSku() 已移除
此版本中已移除之前已弃用的 BillingFlowParams#setSku()
方法。在购买流程中渲染产品之前,您现在必须调用 BillingClient.querySkuDetailsAsync()
,并将生成的 SkuDetails
对象传递给 BillingFlowParams.Builder.setSkuDetails()
。
有关代码示例,请参阅使用 Google Play 结算库。
支持开发者载荷
Google Play 结算库 2.0 版本增加了对开发者载荷的支持,开发者载荷是可以附加到购买上的任意字符串。您可以将开发者载荷参数附加到购买,但只能在购买被确认或消耗时附加。这与 AIDL 中的开发者载荷不同,在 AIDL 中可以在启动购买流程时指定载荷。由于现在可以从应用外部发起购买,因此此更改确保您始终有机会将载荷添加到购买中。
要在新库中访问载荷,Purchase
对象现在包含一个 getDeveloperPayload()
方法。
一致的优惠
当您提供打折 SKU 时,Google Play 现在会返回 SKU 的原始价格,以便您可以向用户显示他们正在获得折扣。
SkuDetails
包含两个用于检索原始 SKU 价格的新方法
getOriginalPriceAmountMicros()
- 返回折扣前 SKU 的未格式化原始价格。getOriginalPrice()
- 返回带有额外货币格式的原始价格。
待处理交易
使用 Google Play 结算库 2.0 版本,您必须支持在授予权限之前需要额外操作的购买。例如,用户可能选择在实体店使用现金购买您的应用内产品。这意味着交易在您的应用外部完成。在这种情况下,您应仅在用户完成交易后授予权限。
要启用待处理购买,请在初始化应用时调用 enablePendingPurchases()
。
使用 Purchase.getPurchaseState()
确定购买状态是 PURCHASED
还是 PENDING
。请注意,您应该仅在状态为 PURCHASED
时授予权限。您应该通过执行以下操作检查 Purchase
状态更新
- 启动应用时,调用
BillingClient.queryPurchases()
检索与用户关联的未消耗产品列表。 - 对每个返回的
Purchase
对象调用Purchase.getPurchaseState()
。 - 实现
onPurchasesUpdated()
方法,以响应Purchase
对象的更改。
此外,Google Play Developer API 为 Purchases.products
包含 PENDING
状态。订阅不支持待处理交易。
此版本还引入了一种新的实时开发者通知类型 OneTimeProductNotification
。此通知类型包含一个消息,其值为 ONE_TIME_PRODUCT_PURCHASED
或 ONE_TIME_PRODUCT_CANCELED
。此通知类型仅发送给与延迟付款方式(如现金)相关的购买。
确认待处理购买时,请务必仅在购买状态为 PURCHASED
时确认,而不是在 PENDING
时确认。
API 变更
Google Play 结算库 2.0 版本包含多项 API 变更,以支持新功能并澄清现有功能。
consumeAsync
consumeAsync()
现在接受一个 ConsumeParams
对象,而不是 purchaseToken
。ConsumeParams
包含 purchaseToken
以及可选的开发者载荷。
此版本已移除之前的 consumeAsync()
版本。
queryPurchaseHistoryAsync
为了尽量减少混淆,queryPurchaseHistoryAsync()
现在返回一个 PurchaseHistoryRecord
对象,而不是 Purchase
对象。PurchaseHistoryRecord
对象与 Purchase
对象相同,只是它仅反映 queryPurchaseHistoryAsync()
返回的值,并且不包含 autoRenewing
、orderId
和 packageName
字段。请注意,返回的数据没有变化——queryPurchaseHistoryAsync()
返回与之前相同的数据。
BillingResult 返回值
之前返回 BillingResponse
整数值的 API 现在返回一个 BillingResult
对象。BillingResult
包含 BillingResponse
整数以及可用于诊断错误的调试字符串。调试字符串使用 en-US 区域设置,不 intended 用于显示给最终用户。
Bug 修复
SkuDetails.getIntroductoryPriceAmountMicros()
现在返回long
而不是String
。
Google Play 结算库 1.2.2 版本发布 (2019-03-07)
Google Play 结算库 1.2.2 版本现已推出。此版本包含以下更改。
Bug 修复
- 修复了 v1.2.1 中引入的线程问题。后台调用不再阻塞主线程。
其他更改
- 尽管仍建议使用主线程,但您现在可以从后台线程实例化 Google Play 结算库。
- 实例化已完全迁移到后台线程,以减少导致 ANR 的可能性。
Play 结算库 1.2.1 版本发布 (2019-03-04)
Google Play 结算库 1.2.1 版本现已推出。此版本包含以下更改。
主要更改
- 添加了对奖励产品的支持。有关创收选项的更多信息,请参阅添加奖励产品特定功能。
其他更改
- 添加了
PurchasesResult
和SkuDetailsResult
的公共构造函数,以使测试更容易。 SkuDetails
对象可以使用一个新方法getOriginalJson()
。- 所有 AIDL 服务调用现在都由后台线程处理。
Bug 修复
- 不再将 Null 回调监听器传递给公共 API。
Google Play 结算库 1.2 版本发布 (2018-10-18)
Google Play 结算库 1.2 版本现已推出。此版本包含以下更改。
更改摘要
- Google Play 结算库现在根据 Android 软件开发工具包许可协议获得许可。
- 添加了
launchPriceChangeConfirmationFlow
API,该 API 提示用户查看订阅价格的待定更改。 - 在升级或降级用户订阅时,添加了对新分摊模式
DEFERRED
的支持。 - 在
BillingFlowParams
类中,将setSku()
替换为setSkuDetails()
。 - 次要错误修复和代码优化。
价格变更确认
您现在可以在 Google Play 管理中心更改订阅价格,并在用户进入应用时提示用户查看并接受新价格。
要使用此 API,请使用订阅产品的 skuDetails
创建一个 PriceChangeFlowParams
对象,然后调用 launchPriceChangeConfirmationFlow()
。实现 PriceChangeConfirmationListener
来处理价格变更确认流程完成时的结果,如下面的代码片段所示
Kotlin
val priceChangeFlowParams = PriceChangeFlowParams.newBuilder() .setSkuDetails(skuDetailsOfThePriceChangedSubscription) .build() billingClient.launchPriceChangeConfirmationFlow(activity, priceChangeFlowParams, object : PriceChangeConfirmationListener() { override fun onPriceChangeConfirmationResult(responseCode: Int) { // Handle the result. } })
Java
PriceChangeFlowParams priceChangeFlowParams = PriceChangeFlowParams.newBuilder() .setSkuDetails(skuDetailsOfThePriceChangedSubscription) .build(); billingClient.launchPriceChangeConfirmationFlow(activity, priceChangeFlowParams, new PriceChangeConfirmationListener() { @Override public void onPriceChangeConfirmationResult(int responseCode) { // Handle the result. } });
价格变更确认流程会显示一个包含新定价信息的对话框,要求用户接受新价格。此流程返回类型为 BillingClient.BillingResponse
的响应代码。
新的分摊模式
在升级或降级用户订阅时,您可以使用新的分摊模式 DEFERRED
。此模式会在用户订阅下次续订时更新。要了解如何设置此分摊模式,请参阅设置分摊模式。
设置 SKU 详情的新方法
在 BillingFlowParams
类中,setSku()
方法已弃用。此更改旨在优化 Google Play 结算流程。
在应用内结算客户端中构造 BillingFlowParams
的新实例时,建议您改为直接使用 setSkuDetails()
处理 JSON 对象,如下面的代码片段所示
在 BillingFlowParams
Builder 类中,setSku()
方法已弃用。请改为使用 setSkuDetails()
方法,如下面的代码片段所示。传递给 setSkuDetails()
对象的对象来自 querySkuDetailsAsync()
方法。
Kotlin
private lateinit var mBillingClient: BillingClient private val mSkuDetailsMap = HashMap<String, SkuDetails>() private fun querySkuDetails() { val skuDetailsParamsBuilder = SkuDetailsParams.newBuilder() mBillingClient.querySkuDetailsAsync(skuDetailsParamsBuilder.build() ) { responseCode, skuDetailsList -> if (responseCode == 0) { for (skuDetails in skuDetailsList) { mSkuDetailsMap[skuDetails.sku] = skuDetails } } } } private fun startPurchase(skuId: String) { val billingFlowParams = BillingFlowParams.newBuilder() .setSkuDetails(mSkuDetailsMap[skuId]) .build() }
Java
private BillingClient mBillingClient; private Map<String, SkuDetails> mSkuDetailsMap = new HashMap<>(); private void querySkuDetails() { SkuDetailsParams.Builder skuDetailsParamsBuilder = SkuDetailsParams.newBuilder(); mBillingClient.querySkuDetailsAsync(skuDetailsParamsBuilder.build(), new SkuDetailsResponseListener() { @Override public void onSkuDetailsResponse(int responseCode, List<SkuDetails> skuDetailsList) { if (responseCode == 0) { for (SkuDetails skuDetails : skuDetailsList) { mSkuDetailsMap.put(skuDetails.getSku(), skuDetails); } } } }); } private void startPurchase(String skuId) { BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder() .setSkuDetails(mSkuDetailsMap.get(skuId)) .build(); }
Play 结算库 1.1 版本发布 (2018-05-07)
Google Play 结算库 1.1 版本现已推出。此版本包含以下更改。
更改摘要
- 在升级/降级现有订阅时,添加了在
BillingFlowParams
中指定分摊模式的支持。 BillingFlowParams
中的replaceSkusProration
布尔标志不再受支持。请改用replaceSkusProrationMode
。launchBillingFlow()
现在会触发失败响应的回调。
行为变更
Google Play 结算库 1.1 版本包含以下行为变更。
开发者可以在 BillingFlowParams
类中设置 replaceSkusProrationMode
ProrationMode
在升级或降级用户订阅时提供有关分摊类型的更多详细信息。
Kotlin
BillingFlowParams.newBuilder() .setSku(skuId) .setType(billingType) .setOldSku(oldSku) .setReplaceSkusProrationMode(replaceSkusProrationMode) .build()
Java
BillingFlowParams.newBuilder() .setSku(skuId) .setType(billingType) .setOldSku(oldSku) .setReplaceSkusProrationMode(replaceSkusProrationMode) .build();
目前,Google Play 支持以下分摊模式
IMMEDIATE_WITH_TIME_PRORATION |
替换立即生效,新的过期时间将按比例计算并计入或扣除用户的费用。这是当前的默认行为。 |
IMMEDIATE_AND_CHARGE_PRORATED_PRICE |
注意:此选项仅适用于订阅升级。 IMMEDIATE_WITHOUT_PRORATION |
替换立即生效,新价格将在下次续订时收取。结算周期保持不变。 |
BillingFlowParams 类中不再支持 replaceSkusProration |
开发者过去可以设置一个布尔标志,以便对订阅升级请求收取按比例计算的金额。鉴于我们支持包含更详细分摊说明的 ProrationMode
,因此不再支持此布尔标志。
launchBillingFlow()
现在会触发失败响应的回调
结算库将始终触发 PurhcasesUpdatedListener
回调,并异步返回一个 BillingResponse
。同时也保留了 BillingResponse
的同步返回值。
在服务断开连接时,异步方法会正确提前退出。
Bug 修复
Builder
参数对象不再修改构建的对象。- 问题 68087141:
launchBillingFlow()
现在触发失败响应的回调。 - Google Play 结算库 1.0 版本发布 (2017-09-19, 公告)
Google Play 结算库 1.0 版本现已推出。此版本包含以下更改。
重要变更
在库的清单中嵌入了结算权限。不再需要在 Android 清单中添加 com.android.vending.BILLING
权限。
- 向
BillingClient.Builder
类添加了新的构建器。 - 为
SkuDetailsParams
类引入了构建器模式,用于查询 SKU 的方法。 - 为了保持一致性,更新了几个 API 方法(相同的返回参数名称和顺序)。
- Google Play 结算库 1.0 版本包含以下行为变更。
行为变更
BillingClient.Builder 类
BillingClient.Builder
现在通过 newBuilder 模式初始化
launchBillingFlow 方法现在使用 BillingFlowParams 类调用
Kotlin
billingClient = BillingClient.newBuilder(context).setListener(this).build()
Java
billingClient = BillingClient.newBuilder(context).setListener(this).build();
要启动购买或订阅的结算流程,launchBillingFlow()
方法接收一个使用请求特定参数初始化的 BillingFlowParams
实例
查询可用产品的新方法
Kotlin
BillingFlowParams.newBuilder().setSku(skuId) .setType(billingType) .setOldSku(oldSku) .build() // Then, use the BillingFlowParams to start the purchase flow val responseCode = billingClient.launchBillingFlow(builder.build())
Java
BillingFlowParams.newBuilder().setSku(skuId) .setType(billingType) .setOldSku(oldSku) .build(); // Then, use the BillingFlowParams to start the purchase flow int responseCode = billingClient.launchBillingFlow(builder.build());
queryPurchaseHistoryAsync()
和 querySkuDetailsAsync()
方法的参数被封装到 Builder 模式中
为了您的方便并与我们的 API 保持一致,结果现在通过结果代码和 SkuDetails
对象列表返回,而不是之前的包装类
Kotlin
val params = SkuDetailsParams.newBuilder() params.setSkusList(skuList) .setType(itemType) billingClient.querySkuDetailsAsync(params.build(), object : SkuDetailsResponseListener() { ... })
Java
SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder(); params.setSkusList(skuList) .setType(itemType); billingClient.querySkuDetailsAsync(params.build(), new SkuDetailsResponseListener() {...})
onConsumeResponse()
方法的参数顺序发生变化
Kotlin
fun onSkuDetailsResponse(@BillingResponse responseCode: Int, skuDetailsList: List<SkuDetails>)
Java
public void onSkuDetailsResponse(@BillingResponse int responseCode, List<SkuDetails> skuDetailsList)
为了与我们的 API 保持一致,来自 ConsumeResponseListener
接口的 onConsumeResponse
的参数顺序已更改
解包的 PurchaseResult 对象
Kotlin
fun onConsumeResponse(@BillingResponse responseCode: Int, outToken: String)
Java
public void onConsumeResponse(@BillingResponse int responseCode, String outToken)
为了与我们的 API 保持一致,PurchaseResult
已被解包
PURCHASES_UPDATED Bundle 中没有响应代码
Kotlin
fun onPurchaseHistoryResponse(@BillingResponse responseCode: Int, purchasesList: List<Purchase>)
Java
void onPurchaseHistoryResponse(@BillingResponse int responseCode, List<Purchase> purchasesList)
Bug 修复
开发者预览版已启动,旨在简化结算相关的开发流程,使开发者能够将精力集中在实现 Android 应用特有的逻辑上,例如应用架构和导航结构。
该库包含多个方便的类和功能,您可以在将 Android 应用与 Google Play Billing API 集成时使用。该库还在 Android Interface Definition Language (AIDL) 服务之上提供了一个抽象层,使开发者更容易定义应用与 Google Play Billing API 之间的接口。
本页面上的内容和代码示例受内容许可中描述的许可协议约束。Java 和 OpenJDK 是 Oracle 和/或其附属公司的商标或注册商标。