本主题包含 Google Play 计费库的发行说明。
Google Play 计费库 7.0.0 版本 (2024-05-14)
Google Play 计费库和 Kotlin 扩展的 7.0.0 版本现已推出。
更改摘要
添加了 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
。删除了
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()
获取有效购买。 - 已消费的购买:开发者应自行在服务器上跟踪已消费的购买。
- 已取消的购买:使用 已作废购买 开发者 API。
- 有关更多详细信息,请参阅 查询购买历史记录
- 已确认和待处理的购买:使用
BillingFlowParams.ProductDetailsParams.setOfferToken()
现在在开发者指定空offerToken
时会抛出异常。将
minSdkVersion
更新为 21,targetSdkVersion
更新为 34。
Google Play 结算库 6.2.1 版本发布 (2024-04-16)
Google Play 结算库和 Kotlin 扩展程序的 6.2.1 版本现已推出。
更改摘要
- 修复了
BillingClient.showAlternativeBillingOnlyInformationDialog()
中的一个 bug,该 bug 会导致在对话框完成的某些情况下,AlternativeBillingOnlyInformationDialogListener
可能不会被调用。
Google Play 结算库 6.2.0 版本发布 (2024-03-06)
Google Play 结算库和 Kotlin 扩展程序的 6.2.0 版本现已推出。
更改摘要
- 添加了 API 来支持 外部优惠
- 添加了
BillingClient.Builder.enableExternalOffer()
来启用提供外部优惠的功能。 - 添加了
BillingClient.isExternalOfferAvailableAsync()
来检查提供外部优惠功能的可用性。 - 添加了
BillingClient.showExternalOfferInformationDialog()
来显示一个信息对话框,以在引导用户离开应用之前向用户提供信息。 - 添加了
BillingClient.createExternalOfferReportingDetailsAsync()
来创建通过外部优惠进行的交易所需的有效负载。
- 添加了
Google Play 结算库 6.1.0 版本发布 (2023-11-14)
Google Play 结算库和 Kotlin 扩展程序的 6.1.0 版本现已推出。
更改摘要
- 添加了 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 结算库和 Kotlin 扩展程序的 6.0.1 版本现已推出。
更改摘要
更新 Play 结算库以与 Android 14 兼容。
Google Play 结算库 6.0 版本发布 (2023-05-10)
Google Play 结算库和 Kotlin 扩展程序的 6.0.0 版本现已推出。
更改摘要
添加了新的
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 结算库和 Kotlin 扩展程序的 5.2.1 版本现已推出。
更改摘要
更新 Play 结算库以与 Android 14 兼容。
Google Play 结算库 5.2 版本发布 (2023-04-06)
Google Play 结算库和 Kotlin 扩展程序的 5.2.0 版本现已推出。
更改摘要
- 添加了类来支持韩国用户在移动设备/平板电脑上进行的替代结算流程
- 添加了
BillingFlowParams.SubscriptionUpdateParams.Builder.setOriginalExternalTransactionId()
方法来指定原始订阅的外部交易 ID。 - 添加了
BillingClient.Builder.enableAlternativeBilling()
方法,以允许韩国用户选择替代结算选项。
Google Play 结算库 5.1 版本发布 (2022-10-31)
Google Play 结算库和 Kotlin 扩展程序的 5.1.0 版本现已推出。
此版本包含以下更改。
更改摘要
- 添加了
ProductDetails.SubscriptionOfferDetails.getOfferId()
方法来检索优惠 ID。 - 添加了
ProductDetails.SubscriptionOfferDetails.getBasePlanId()
方法来检索基本方案 ID。 - 将
targetSdkVersion
更新为 31。
Google Play 结算库 5.0 版本发布 (2022-05-11)
Google Play 结算库和 Kotlin 扩展程序的 5.0.0 版本现已推出。
此版本包含以下更改。
更改摘要
- 引入了订阅的新模型,包括允许您为单个订阅产品创建多个优惠的新实体。有关更多信息,请参阅 迁移指南。
- 添加了
BillingClient.queryProductDetailsAsync()
来替换BillingClient.querySkuDetailsAsync()
。 - 添加了
setIsOfferPersonalized()
方法,用于欧盟个性化定价披露要求。要详细了解如何使用此方法,请参阅 指示个性化价格。 - 删除了
queryPurchases()
,该方法之前已弃用,并由 Google Play 结算库 4.0.0 中引入的 queryPurchasesAsync 替换。 launchPriceChangeFlow
已被弃用,将在未来版本中移除。要详细了解替代方案,请参阅 启动价格变更确认流程。- 删除了
setVrPurchaseFlow()
,该方法以前在实例化购买流程时使用。在以前的版本中,此方法会将用户重定向到其 Android 设备上完成购买。删除此方法后,用户将通过标准购买流程完成购买。
Google Play 结算库 4.1 版本发布 (2022-02-23)
Google Play 结算库和 Kotlin 扩展程序的 4.1.0 版本现已推出。
此版本包含以下更改。
更改摘要
- 添加了
BillingClient.showInAppMessages()
来帮助处理订阅付款失败。要详细了解如何使用应用内消息处理订阅付款失败,请参阅 处理付款失败。
Google Play 结算库 4.0 版本发布 (2021-05-18)
Google Play 结算库和 Kotlin 扩展程序的 4.0.0 版本现已推出。
更改摘要
添加了
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 结算库、Kotlin 扩展和 Unity 插件的 3.0.3 版本现已推出。
Java 和 Kotlin 的错误修复
- 修复了调用
endConnection()
时发生的内存泄漏。 - 修复了当 Google Play 结算库被使用单任务启动模式的应用使用时出现的问题。当应用从 Android 启动器恢复,并且结算对话框在被挂起之前可见时,
onPurchasesUpdated()
回调将被触发。
Unity 的错误修复
- 更新到 Java 3.0.3 版本,以修复内存泄漏并解决当应用从 Android 启动器恢复,并且结算对话框在被挂起之前可见时,导致无法进行购买的问题。
Google Play 结算库 3.0.2 版本发布 (2020-11-24)
Google Play 结算库和 Kotlin 扩展的 3.0.2 版本现已推出。
错误修复
- 修复了 Kotlin 扩展中的一个错误,该错误会导致协程以错误 "Already resumed" 失败。
- 修复了当 Kotlin 扩展与 kotlinx.coroutines 库版本 1.4+ 一起使用时出现的未解析引用。
Google Play 结算库 3.0.1 版本发布 (2020-09-30)
Google Play 结算库和 Kotlin 扩展的 3.0.1 版本现已推出。
错误修复
- 修复了如果应用在结算流程中被杀死并恢复,
PurchasesUpdatedListener
可能不会被调用以返回购买结果。
Google Play 结算库 3.0 版本发布 (2020-06-08)
Google Play 结算库、Kotlin 扩展和 Unity 插件的 3.0.0 版本现已推出。
更改摘要
- 移除奖励 SKU 支持。
- 移除
ChildDirected
和UnderAgeOfConsent
参数。 - 移除已弃用的开发者有效负载方法。
- 移除已弃用的方法
BillingFlowParams.setAccountId()
和BillingFlowParams.setDeveloperId()
。 - 移除已弃用的方法
BillingFlowParams.setOldSkus(String oldSku)
和BillingFlowParams.addOldSku(String oldSku)
。 - 添加了可空性注释。
错误修复
SkuDetails.getIntroductoryPriceCycles()
现在返回int
而不是String
。- 修复了即使没有设置额外参数,结算流程也会被视为具有额外参数的错误。
Google Play 结算库 2.2.1 版本发布 (2020-05-20)
Google Play 结算库的 2.2.1 版本现已推出。
错误修复
- 更新了 Kotlin 扩展所依赖的 Java Play 结算库的默认版本。
Google Play 结算库 2.2.0 版本发布以及 Unity 支持 (2020-03-23)
Google Play 结算库 2.2.0 版本提供了帮助开发者确保购买归因于正确用户的功能。这些更改替换了基于开发者有效负载构建自定义解决方案的必要性。作为此更新的一部分,开发者有效负载功能已弃用,并将被移除。有关更多信息,包括推荐的替代方案,请参阅 开发者有效负载。
Google Play 结算库 2 for Unity
除了当前的 Java 和 Kotlin 版本的 Google Play 结算库 2 之外,我们还发布了适用于 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 结算库和新的 Kotlin 扩展的 2.1.0 版本现已推出。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 版本现已推出。
错误修复
- 修复了
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 版本现已推出。此版本包含以下更改。
错误修复
- 修复了调试消息在某些情况下被返回为
null
的错误。 - 修复了潜在的内存泄漏问题。
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 开发者 API 为 Purchases.products
和 Purchases.subscriptions
都包含确认布尔值。在确认购买之前,请务必使用这些方法来确定购买是否已确认。
您可以使用以下方法之一确认购买
- 对于消耗型产品,请使用
consumeAsync()
,该方法位于客户端 API 中。 - 对于未消耗的产品,请使用
acknowledgePurchase()
,它位于客户端 API 中。 - 服务器 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 开发者 API 还包括 PENDING
状态,用于 Purchases.products
。订阅不支持待处理的交易。
此版本还引入了一种新的实时开发者通知类型 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 本地化,不应显示给最终用户。
错误修复
SkuDetails.getIntroductoryPriceAmountMicros()
现在返回一个long
,而不是String
。
Google Play 结算库 1.2.2 版本(2019 年 3 月 7 日)
Google Play 结算库的 1.2.2 版本现已推出。此版本包含以下更改。
错误修复
- 修复了 v1.2.1 中引入的线程问题。后台调用不再阻塞主线程。
其他更改
- 虽然仍然建议使用主线程,但您现在可以从后台线程实例化 Google Play 结算库。
- 实例化已完全迁移到后台线程,以减少导致 ANR 的可能性。
Play 结算库 1.2.1 版本(2019 年 3 月 4 日)
Google Play 结算库的 1.2.1 版本现已推出。此版本包含以下更改。
主要更改
- 添加了对 奖励产品 的支持。有关货币化选项的更多信息,请参阅 添加奖励产品特定功能。
其他更改
- 为
PurchasesResult
和SkuDetailsResult
添加了公共构造函数,以简化测试。 SkuDetails
对象可以使用一种新方法getOriginalJson()
。- 现在所有 AIDL 服务调用均由后台线程处理。
错误修复
- 不再将空回调侦听器传递到公共 API。
Google Play 结算库 1.2 版本(2018 年 10 月 18 日)
Google Play 结算库的 1.2 版本现已推出。此版本包含以下更改。
更改摘要
- Google Play 结算库现在根据 Android 软件开发工具包许可协议 获得许可。
- 添加了
launchPriceChangeConfirmationFlow
API,该 API 会提示用户查看对订阅价格的待处理更改。 - 在升级或降级用户的订阅时,添加了对新分摊模式
DEFERRED
的支持。 - 在
BillingFlowParams
类中,用setSkuDetails()
替换了setSku()
。 - 次要错误修复和代码优化。
价格变更确认
您现在可以在 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
的新实例时,建议您直接使用 JSON 对象,通过 setSkuDetails()
进行操作,如下面的代码片段所示
在 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 年 5 月 7 日)
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 |
立即生效,新的价格将在下次续订时收取。计费周期保持不变。 |
replaceSkusProration
不再受 BillingFlowParams
类的支持。
过去,开发者可以设置一个布尔标志,为订阅升级请求收取按比例计算的费用。鉴于我们支持包含更多计费方式说明的 ProrationMode
,因此不再支持此布尔标志。
launchBillingFlow()
现在会为失败的响应触发回调。
结算库将始终触发 PurhcasesUpdatedListener
回调并异步返回 BillingResponse
。 BillingResponse
的同步返回值也会保留。
错误修复
- 在服务断开连接时,异步方法会尽早正确退出。
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 模式初始化。
Kotlin
billingClient = BillingClient.newBuilder(context).setListener(this).build()
Java
billingClient = BillingClient.newBuilder(context).setListener(this).build();
launchBillingFlow 方法现在使用 BillingFlowParams 类调用。
要启动购买或订阅的结算流程,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()
方法的参数被封装到构建器模式中。
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() {...})
结果现在通过结果代码和 SkuDetails
对象列表返回,而不是以前为了方便和保持 API 一致性而使用的包装类。
Kotlin
fun onSkuDetailsResponse(@BillingResponse responseCode: Int, skuDetailsList: List<SkuDetails>)
Java
public void onSkuDetailsResponse(@BillingResponse int responseCode, List<SkuDetails> skuDetailsList)
onConsumeResponse()
方法的参数顺序已更改。
onConsumeResponse
接口的 ConsumeResponseListener
的参数顺序已更改,以保持 API 一致性。
Kotlin
fun onConsumeResponse(@BillingResponse responseCode: Int, outToken: String)
Java
public void onConsumeResponse(@BillingResponse int responseCode, String outToken)
解开的 PurchaseResult 对象
PurchaseResult
已被解开,以保持 API 一致性。
Kotlin
fun onPurchaseHistoryResponse(@BillingResponse responseCode: Int, purchasesList: List<Purchase>)
Java
void onPurchaseHistoryResponse(@BillingResponse int responseCode, List<Purchase> purchasesList)
错误修复
开发者预览版 1 发布(2017-06-12,公告)
开发者预览版已发布,旨在简化结算开发流程,使开发者能够将精力集中在实现特定于 Android 应用的逻辑上,例如应用架构和导航结构。
该库包含一些方便的类和功能,供您在将 Android 应用与 Google Play 结算 API 集成时使用。该库还在 Android 接口定义语言 (AIDL) 服务之上提供了一个抽象层,使开发者更容易定义应用和 Google Play 结算 API 之间的接口。