本文档包含 Google Play 结算库的发行说明。
Google Play 结算库 7.1.1 版发布 (2024-10-03)
Google Play 结算库和 Kotlin 扩展程序的 7.1.1 版现已推出。
错误修复
- 修复了 Play 结算库 7.1.0 中与 测试
BillingResult
响应代码 相关的错误。
Google Play 结算库 7.1.0 版发布 (2024-09-19)
Google Play 结算库和 Kotlin 扩展程序的 7.1.0 版现已推出。
更改摘要
- 改进了与连接状态和管理相关的线程安全性。
- 引入了测试
BillingResult
响应代码的部分更改,该更改将在 Play 结算库 7.1.1 中完全发布。要使用此功能测试您的集成,您需要升级到 Play 结算库 7.1.1。存在一个错误,只会影响启用了 结算覆盖测试 的应用程序,并且不会影响常规使用。有关更多信息,请参阅 测试BillingResult
响应代码。
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
。- 开发者应使用
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。
- 更多详细信息,请参阅 查询购买历史记录
- 已确认和待处理的购买:使用
BillingFlowParams.ProductDetailsParams.setOfferToken()
现在在开发者指定空offerToken
时会抛出异常。已将
minSdkVersion
更新为 21,并将targetSdkVersion
更新为 34。
Google Play 结算库 6.2.1 版本发布 (2024-04-16)
Google Play 结算库 6.2.1 版本和 Kotlin 扩展现已可用。
更改摘要
- 修复了
BillingClient.showAlternativeBillingOnlyInformationDialog()
中的一个错误,在某些情况下,当对话框完成时,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()
方法以满足欧盟个性化定价披露要求。要详细了解如何使用此方法,请参阅 指示个性化价格。 - 已移除先前已弃用的
queryPurchases()
,并将其替换为 Google Play 结算库 4.0.0 中引入的 queryPurchasesAsync。 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 错误修复
- 修复了调用
endConnection()
时出现的内存泄漏。 - 修复了使用单任务启动模式的应用使用 Google Play 结算库时出现的问题。当应用从 Android 启动器恢复,并且结算对话框在暂停之前可见时,将触发
onPurchasesUpdated()
回调。
Unity 错误修复
- 更新到 Java 3.0.3 版以修复内存泄漏并解决当应用从 Android 启动器恢复,并且结算对话框在暂停之前可见时阻止购买的问题。
Google Play 结算库 3.0.2 版发布 (2020-11-24)
Google Play 结算库 3.0.2 版及其 Kotlin 扩展现已推出。
错误修复
- 修复了 Kotlin 扩展中协程出现错误“已恢复”的问题。
- 修复了在 Kotlin 扩展与 kotlinx.coroutines 库 1.4+ 版一起使用时出现的未解析引用。
Google Play 结算库 3.0.1 版发布 (2020-09-30)
Google Play 结算库 3.0.1 版及其 Kotlin 扩展现已推出。
错误修复
- 修复了一个错误,即如果应用在结算流程期间被杀死并恢复,
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)
。 - 添加了可空性注释。
错误修复
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 版提供了帮助开发者确保购买归因于正确用户的功能。这些更改取代了基于开发者有效负载构建自定义解决方案的需求。作为此更新的一部分,开发者有效负载功能已弃用,并将在未来版本中移除。有关更多信息(包括建议的替代方案),请参阅 开发者有效负载。
适用于 Unity 的 Google Play 结算库 2
除了 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 Console 帮助中心 中找到有关弃用的更多信息。
- 在
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 版现已推出。
错误修复
- 修复了一个错误,即
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 Billing 库收到的所有购买请求。如果您未在三天内确认购买请求,用户将自动获得退款,并且 Google Play 会撤销购买。对于待处理交易(2.0 版新增功能),三天窗口从购买状态变为PURCHASED
时开始,并且在购买处于PENDING
状态时不适用。
对于订阅,您必须确认任何具有新购买令牌的购买请求。这意味着所有初始购买、计划更改和重新注册都需要确认,但您无需确认后续续订。要确定购买是否需要确认,您可以检查购买中的确认字段。
Purchase
对象现在包含一个isAcknowledged()
方法,该方法指示购买是否已确认。此外,Google Play 开发者 API 包含Purchases.products
和Purchases.subscriptions
的确认布尔值。在确认购买之前,请务必使用这些方法来确定购买是否已确认。
您可以使用以下方法之一确认购买
- 对于消耗型产品,请使用客户端 API 中的
consumeAsync()
。 - 对于未消耗的产品,请使用客户端 API 中的
acknowledgePurchase()
。 - 服务器 API 中也提供了一个新的
acknowledge()
方法。
BillingFlowParams.setSku() 已移除
在此版本中,之前已弃用的BillingFlowParams#setSku()
方法已被移除。在购买流程中呈现产品之前,您现在必须调用BillingClient.querySkuDetailsAsync()
,并将结果SkuDetails
对象传递给BillingFlowParams.Builder.setSkuDetails()
。
有关代码示例,请参阅使用 Google Play Billing 库。
开发者负载受支持
Google Play Billing 库 2.0 版增加了对开发者负载的支持,开发者负载是可以附加到购买请求的任意字符串。您可以将开发者负载参数附加到购买请求,但仅限在确认或消耗购买请求时。这与 AIDL 中的开发者负载不同,在 AIDL 中,可以在启动购买流程时指定负载。由于现在可以从应用外部启动购买请求,因此此更改可确保您始终有机会向购买请求添加负载。
要访问新库中的负载,Purchase
对象现在包含一个getDeveloperPayload()
方法。
一致的优惠
当您提供折扣 SKU 时,Google Play 现在会返回 SKU 的原始价格,以便您可以向用户显示他们正在享受折扣。
SkuDetails
包含两个用于检索原始 SKU 价格的新方法
getOriginalPriceAmountMicros()
- 返回 SKU 在折扣前的未格式化原始价格。getOriginalPrice()
- 返回带有其他货币格式的原始价格。
待处理交易
使用 Google Play Billing 库 2.0 版,您必须支持在授予权限之前需要额外操作的购买请求。例如,用户可能会选择在实体店使用现金购买您的应用内产品。这意味着交易是在应用外部完成的。在这种情况下,您应仅在用户完成交易后才授予权限。
要启用待处理购买请求,请在初始化应用时将enablePendingPurchases()
作为一部分进行调用。
使用Purchase.getPurchaseState()
确定购买状态是PURCHASED
还是PENDING
。请注意,您应仅在状态为PURCHASED
时授予权限。您应该通过执行以下操作来检查Purchase
状态更新
- 启动应用时,请调用
BillingClient.queryPurchases()
以检索与用户关联的未消耗产品的列表。 - 在每个返回的
Purchase
对象上调用Purchase.getPurchaseState()
。 - 实现
onPurchasesUpdated()
方法以响应Purchase
对象的更改。
此外,Google Play 开发者 API 包含Purchases.products
的PENDING
状态。订阅不支持待处理交易。
此版本还引入了新的实时开发者通知类型OneTimeProductNotification
。此通知类型包含一条消息,其值为ONE_TIME_PRODUCT_PURCHASED
或ONE_TIME_PRODUCT_CANCELED
。此通知类型仅用于与延迟付款方式(如现金)关联的购买请求。
在确认待处理购买请求时,请确保仅在购买状态为PURCHASED
而不是PENDING
时确认。
API 更改
Google Play Billing 库 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 Billing 库 1.2.2 版 (2019 年 3 月 7 日)
Google Play Billing 库 1.2.2 版现已推出。此版本包含以下更改。
错误修复
- 修复了 v1.2.1 中引入的线程问题。后台调用不再阻塞主线程。
其他更改
- 尽管仍然建议使用主线程,但您现在可以从后台线程实例化 Google Play Billing 库。
- 实例化已完全迁移到后台线程,以减少导致 ANR 的可能性。
Play Billing 库 1.2.1 版 (2019 年 3 月 4 日)
Google Play Billing 库 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 Console 中更改订阅的价格,并在用户进入您的应用时提示他们查看并接受新价格。
要使用此 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 |
替换立即生效,新价格将在下次重复时间收取。结算周期保持不变。 |
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() {...})
为了方便起见,并且为了与我们的 API 保持一致,结果现在通过结果代码和 SkuDetails
对象列表返回,而不是以前的包装器类
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 之间的接口。