This document contains release notes for the Google Play Billing Library.
Google Play Billing Library 7.1.1 Release (2024-10-03)
Version 7.1.1 of the Google Play Billing Library and Kotlin extensions are now available.
Bug fixes
- Fixed a bug in Play Billing Library 7.1.0 related to
testing
BillingResult
response codes.
Google Play Billing Library 7.1.0 Release (2024-09-19)
Version 7.1.0 of the Google Play Billing Library and Kotlin extensions are now available.
Summary of changes
- Improved thread safety related to connection status and management.
- Introduced partial changes for testing
BillingResult
response codes which is fully released in Play Billing Library 7.1.1. To test your integration using this feature, you'll need to upgrade to Play Billing Library 7.1.1. A bug exists that will only impact applications with billing overrides testing enabled and does not affect regular usage. For more information, see TestBillingResult
response codes.
Google Play Billing Library 7.0.0 Release (2024-05-14)
Version 7.0.0 of the Google Play Billing Library and Kotlin extensions are now available.
Summary of changes
Added APIs to support installment subscriptions.
- Added
ProductDetails.InstallmentPlanDetails
for installment base plans that users are eligible to purchase. This API helps your app identify the installment plan and its commitment setup to provide related information to the user. To learn more, see our subscription installments guide.
- Added
Added
PendingPurchasesParams
andBillingClient.Builder.enablePendingPurchases(PendingPurchaseParams)
to replaceBillingClient.Builder.enablePendingPurchases()
, which has been deprecated in this release.- The deprecated
enablePendingPurchases()
is functionally equivalent toenablePendingPurchases(PendingPurchasesParams.newBuilder().enableOneTimeProducts().build())
.
- The deprecated
Added APIs to support pending transactions for subscription prepaid plans:
- Use
PendingPurchasesParams.Builder.enablePrepaidPlans()
along withBillingClient.Builder.enablePendingPurchases(PendingPurchaseParams)
to enable pending transactions for subscription prepaid plans. When adding support, be sure that your app also correctly manages subscription lifecycles. To learn more see our pending purchases guide. - Added
Purchase.PendingPurchaseUpdate
andPurchase.getPendingPurchaseUpdate()
for retrieving the pending top-up or upgrade or downgrade to an existing subscription.
- Use
Removed
BillingClient.Builder.enableAlternativeBilling()
,AlternativeBillingListener
, andAlternativeChoiceDetails
.- Developers should use
BillingClient.Builder.enableUserChoiceBilling()
withUserChoiceBillingListener
andUserChoiceDetails
in the listener callback instead.
- Developers should use
Removed
BillingFlowParams.ProrationMode
,BillingFlowParams.SubscriptionUpdateParams.Builder.setReplaceProrationMode()
, andBillingFlowParams.SubscriptionUpdateParams.Builder.setReplaceSkusProrationMode()
.- Developers should use
BillingFlowParams.SubscriptionUpdateParams.ReplacementMode
withBillingFlowParams.SubscriptionUpdateParams.Builder#setSubscriptionReplacementMode(int)
instead. BillingFlowParams.SubscriptionUpdateParams.Builder.setReplaceProrationMode()
.BillingFlowParams.SubscriptionUpdateParams.Builder.setReplaceSkusProrationMode()
.
- Developers should use
Removed
BillingFlowParams.SubscriptionUpdateParams.Builder#setOldSkuPurchaseToken()
.- Developers should use
BillingFlowParams.SubscriptionUpdateParams.Builder#setOldPurchaseToken(java.lang.String)
instead.
- Developers should use
BillingClient.queryPurchaseHistoryAsync()
has been deprecated and will be removed in a future release. Developers should use the following alternatives instead:- Acknowledged and pending purchases: Use
BillingClient.queryPurchasesAsync()
to fetch the active purchases. - Consumed purchases: Developers should keep track of consumed purchases on their own servers.
- Canceled purchases: Use the voided-purchases developer API.
- For more details, see Query Purchase History
- Acknowledged and pending purchases: Use
BillingFlowParams.ProductDetailsParams.setOfferToken()
now throws an exception when developers specify an emptyofferToken
.Updated
minSdkVersion
to 21 andtargetSdkVersion
to 34.
Google Play Billing Library 6.2.1 Release (2024-04-16)
Version 6.2.1 of the Google Play Billing Library and Kotlin extensions are now available.
Summary of changes
- Fixed a bug in
BillingClient.showAlternativeBillingOnlyInformationDialog()
where theAlternativeBillingOnlyInformationDialogListener
may not be called in certain cases when the dialog completes.
Google Play Billing Library 6.2.0 Release (2024-03-06)
Version 6.2.0 of the Google Play Billing Library and Kotlin extensions are now available.
Summary of changes
- Added APIs to support external offers
- Added
BillingClient.Builder.enableExternalOffer()
to enable the ability to provide external offers. - Added
BillingClient.isExternalOfferAvailableAsync()
to check the availability of providing external offers functionality. - Added
BillingClient.showExternalOfferInformationDialog()
to show an information dialog to users before leading users outside the app. - Added
BillingClient.createExternalOfferReportingDetailsAsync()
to create a payload required to report transactions made through external offers.
- Added
Google Play Billing Library 6.1.0 Release (2023-11-14)
Version 6.1.0 of the Google Play Billing Library and Kotlin extensions are now available.
Summary of changes
- Added APIs to support alternative billing only (i.e. without user choice)
- Added
BillingClient.Builder.enableAlternativeBillingOnly()
to functionally enable the ability to offer alternative billing only. - Added
BillingClient.isAlternativeBillingOnlyAvailableAsync()
to check the availability of offering alternative billing only. - Added
BillingClient.showAlternativeBillingOnlyInformationDialog()
to show an information dialog to inform users when alternative billing only is being used. - Added
BillingClient.createAlternativeBillingOnlyReportingDetailsAsync()
to create a payload required to report transactions made through alternative billing only.
- Added
- Updated the user choice billing APIs
- Added
UserChoiceBillingListener
to replace AlternativeBillingListener which has been marked as deprecated. - Added
UserChoiceDetails
to replaceAlternativeChoiceDetails
which has been marked as deprecated. - Added
BillingClient.Builder.enableUserChoiceBilling()
to replaceBillingClient.Builder.enableAlternativeBilling()
which has been marked as deprecated.
- Added
- Added
BillingClient.getBillingConfigAsync()
to retrieve Google Play country.
Google Play Billing Library 6.0.1 Release (2023-06-22)
Version 6.0.1 of the Google Play Billing Library and Kotlin extensions are now available.
Summary of changes
Update Play Billing Library to be compatible with Android 14.
Google Play Billing Library 6.0 Release (2023-05-10)
Version 6.0.0 of the Google Play Billing Library and Kotlin extensions are now available.
Summary of changes
Added new
ReplacementMode
enum to replaceProrationMode
.Please note that
ProrationMode
is still available for backward compatibility reasons.Removed order ID for
PENDING
purchases.Previously, the order ID would always be created even if the purchase was pending. Starting with version 6.0.0, an order ID will not be created for pending purchases, and for these purchases, the order ID will be populated after the purchase is moved to the
PURCHASED
state.Removed
queryPurchases
andlaunchPriceConfirmationFlow
methods.The
queryPurchases
andlaunchPriceConfirmationFlow
methods that have previously been marked as deprecated have now been removed in Play Billing Library 6.0.0. Developers should usequeryPurchasesAsync
instead ofqueryPurchases
. ForlaunchPriceConfirmationFlow
alternatives, see Price changes.Added new network error response code.
A new network error response code,
NETWORK_ERROR
, has been added starting with PBL version 6.0.0. This code is returned when an error occurs due to a network connection issue. These network connection errors were previously reported asSERVICE_UNAVAILABLE
.Updated
SERVICE_UNAVAILABLE
andSERVICE_TIMEOUT
.Starting with PBL version 6.0.0, errors due to timeout in processing will be returned as
SERVICE_UNAVAILABLE
instead of the currentSERVICE_TIMEOUT
.The behavior does not change in earlier versions of PBL.
Removed
SERVICE_TIMEOUT
.Starting with PBL version 6.0.0,
SERVICE_TIMEOUT
will no longer be returned. Previous versions of PBL will still return this code.Added additional logging.
The Play Billing Library 6 release includes additional logging, which provides insight into API usage (such as success and failure) and service connection issues. This information will be used to improve the performance of the Play Billing Library and provide better support for errors.
Google Play Billing Library 5.2.1 Release (2023-06-22)
Version 5.2.1 of the Google Play Billing Library and Kotlin extensions are now available.
Summary of changes
Update Play Billing Library to be compatible with Android 14.
Google Play Billing Library 5.2 Release (2023-04-06)
Version 5.2.0 of the Google Play Billing Library and Kotlin extensions are now available.
Summary of changes
- Added classes to support alternative billing flows on mobile/tablet for users in South Korea:
- Added
BillingFlowParams.SubscriptionUpdateParams.Builder.setOriginalExternalTransactionId()
method to specify the external transaction id of the originating subscription. - Added
BillingClient.Builder.enableAlternativeBilling()
method to allow users in South Korea to select an alternative billing option.
Google Play Billing Library 5.1 Release (2022-10-31)
Version 5.1.0 of the Google Play Billing Library and Kotlin extensions are now available.
This version contains the following changes.
Summary of changes
- Added
ProductDetails.SubscriptionOfferDetails.getOfferId()
method to retrieve the offer ID. - Added
ProductDetails.SubscriptionOfferDetails.getBasePlanId()
method to retrieve the base plan ID. - Updated the
targetSdkVersion
to 31.
Google Play Billing Library 5.0 Release (2022-05-11)
Version 5.0.0 of the Google Play Billing Library and Kotlin extensions are now available.
This version contains the following changes.
Summary of changes
- Introduced a new model for subscriptions, including new entities that enable you to create multiple offers for a single subscription product. For more information, see the migration guide.
- Added
BillingClient.queryProductDetailsAsync()
to replaceBillingClient.querySkuDetailsAsync()
. - Added
setIsOfferPersonalized()
method for EU personalized pricing disclosure requirements. To learn more about how to use this method, see Indicate a personalized price. - Removed
queryPurchases()
, which was previously deprecated and replaced by queryPurchasesAsync introduced in Google Play Billing Library 4.0.0. launchPriceChangeFlow
has been deprecated and will be removed in a future release. To learn more about alternatives, see Launch a price change confirmation flow.- Removed
setVrPurchaseFlow()
, which was previously used when instantiating a purchase flow. In previous versions, this method redirected the user to complete the purchase on their Android device. Once you remove this method, users will complete the purchase through the standard purchase flow.
Google Play Billing Library 4.1 release (2022-02-23)
Version 4.1.0 of the Google Play Billing Library and Kotlin extensions are now available.
This version contains the following changes.
Summary of changes
- Added
BillingClient.showInAppMessages()
to help with handling subscription payment declines. To learn more about how to use in-app messaging for handling subscriptions payment declines, see Handling payment declines.
Google Play Billing Library 4.0 Release (2021-05-18)
Version 4.0.0 of the Google Play Billing Library and Kotlin extensions are now available.
Summary of changes
Added
BillingClient.queryPurchasesAsync()
to replaceBillingClient.queryPurchases()
which will be removed in a future release.Added new subscription replacement mode
IMMEDIATE_AND_CHARGE_FULL_PRICE
.Added
BillingClient.getConnectionState()
method to retrieve the Play Billing Library's connection state.Updated Javadoc and implementation to indicate which thread a method can be called on and which thread results are posted.
Added
BillingFlowParams.Builder.setSubscriptionUpdateParams()
as a new way to initiate subscription updates. This replacesBillingFlowParams#getReplaceSkusProrationMode
,BillingFlowParams#getOldSkuPurchaseToken
,BillingFlowParams#getOldSku
,BillingFlowParams.Builder#setReplaceSkusProrationMode
,BillingFlowParams.Builder#setOldSku
which have been removed.Added
Purchase.getQuantity()
andPurchaseHistoryRecord.getQuantity()
.Added
Purchase#getSkus()
andPurchaseHistoryRecord#getSkus()
. These replacePurchase#getSku
andPurchaseHistoryRecord#getSku
which have been removed.Removed
BillingFlowParams#getSku
,BillingFlowParams#getSkuDetails
andBillingFlowParams#getSkuType
.
Google Play Billing Library 3.0.3 Release (2021-03-12)
Version 3.0.3 of the Google Play Billing Library, Kotlin extension, and Unity plugin are now available.
Java and Kotlin Bug fixes
- Fix memory leak when
endConnection()
is called. - Fix issue when the Google Play Billing Library is used by apps which utilize
the single task launch mode. A
onPurchasesUpdated()
callback will be triggered when an app is resumed from the Android launcher and the billing dialog was visible prior to being suspended.
Unity Bug fixes
- Update to Java version 3.0.3 to fix memory leak and resolve issue preventing purchases when an app is resumed from the Android launcher and the billing dialog was visible prior to being suspended.
Google Play Billing Library 3.0.2 Release (2020-11-24)
Version 3.0.2 of the Google Play Billing Library and Kotlin extension are now available.
Bug fixes
- Fixed a bug in the Kotlin extension where the coroutine fails with error "Already resumed".
- Fixed unresolved references when the Kotlin extension is used with the kotlinx.coroutines library version 1.4+.
Google Play Billing Library 3.0.1 Release (2020-09-30)
Version 3.0.1 of the Google Play Billing Library and Kotlin extension are now available.
Bug fixes
- Fixed a bug where if the app was killed and restored during the billing flow,
PurchasesUpdatedListener
may not be called with the purchase result.
Google Play Billing Library 3.0 Release (2020-06-08)
Version 3.0.0 of the Google Play Billing Library, Kotlin extension, and Unity plugin are now available.
Summary of changes
- Removed rewarded SKU support.
- Removed the
ChildDirected
andUnderAgeOfConsent
parameters. - Removed deprecated developer payload methods.
- Removed deprecated methods
BillingFlowParams.setAccountId()
andBillingFlowParams.setDeveloperId()
. - Removed deprecated methods
BillingFlowParams.setOldSkus(String oldSku)
andBillingFlowParams.addOldSku(String oldSku)
. - Added nullability annotations.
Bug fixes
SkuDetails.getIntroductoryPriceCycles()
now returnsint
instead ofString
.- Fixed a bug where the billing flow would be treated as having extra params even if no extra params were set.
Google Play Billing Library 2.2.1 Release (2020-05-20)
Version 2.2.1 of the Google Play Billing library is now available.
Bug fixes
- Updated the default version of the Java Play Billing library that the Kotlin extension depends on.
Google Play Billing Library 2.2.0 release and Unity support (2020-03-23)
Version 2.2.0 of the Google Play Billing provides functionality that helps developers ensure purchases are attributed to the correct user. These changes replace the need to build custom solutions based on developer payload. As part of this update, the developer payload functionality has been deprecated and will be removed in a future release. For more information, including recommended alternatives, see Developer payload.
Google Play Billing Billing Library 2 for Unity
In addition to the current Java and Kotlin versions of Google Play Billing Library 2, we released a version of the library for use with Unity. Game developers using the Unity in-app purchase API can upgrade now to take advantage of all Google Play Billing Library 2 features and to make the subsequent upgrades to future versions of the Google Play Billing Library easier.
To learn more, see Use Google Play Billing with Unity.
Summary of changes
- Java Google Play Billing Library
- In
AcknowledgePurchaseParams
, deprecatedsetDeveloperPayload()
andgetDeveloperPayload()
methods. - In
ConsumeParams
, deprecatedsetDeveloperPayload()
andgetDeveloperPayload()
methods. - In
BillingFlowParams
, renamedsetAccountId()
tosetObfuscatedAccountId()
, and documented length restriction of 64 characters and restriction disallowing Personally Identifiable Information (PII) in this field.setAccountId()
has been marked as deprecated and will be removed in a future library version. - In
BillingFlowParams
, addedsetObfuscatedProfileId()
which works similarly tosetObfuscatedAccountId()
. For more information, see Developer payload updates and alternatives. - In
Purchase
, added thegetAccountIdentifiers()
method to return the obfuscated account identifiers set inBillingFlowParams
. - In
BillingClient
, theloadRewardedSku()
method has been marked deprecated as part of deprecating rewarded SKUs. You can find more information about the deprecation in the Play Console Help Center.
- In
Google Play Billing Library 2.1.0 Release and Kotlin Extension 2.1.0 Release (2019-12-10)
Version 2.1.0 of the Google Play Billing library and the new Kotlin extension are now available. The Play Billing Library Kotlin extension provides idiomatic API alternatives for Kotlin consumption, featuring better null-safety and coroutines. For code examples, see Use the Google Play Billing Library.
This version contains the following changes.
Summary of changes
- In
BillingFlowParams
, deprecatedsetOldSku(String oldSku)
and replaced withsetOldSku(String oldSku, String purchaseToken)
, to disambiguate when multiple accounts on the device own the same sku.
Google Play Billing Library 2.0.3 Release (2019-08-05)
Version 2.0.3 of the Google Play Billing library is now available.
Bug fixes
- Fixed a bug where
querySkuDetailsAsync()
would occasionally fail with codeDEVELOPER_ERROR
instead of returning a successful result.
Google Play Billing Library 2.0.2 Release (2019-07-08)
Version 2.0.2 of the Google Play Billing library is now available. This release contains updates to the reference documentation and does not change library functionality.
Google Play Billing Library 2.0.1 Release (2019-06-06)
Version 2.0.1 of the Google Play Billing library is now available. This version contains the following changes.
Bug fixes
- Fixed a bug where debug messages were being returned as
null
in some cases. - Fixed a potential memory leak issue.
Google Play Billing Library 2.0 Release (2019-05-07)
Version 2.0 of the Google Play Billing library is now available. This version contains the following changes.
Purchases must be acknowledged within three days
Google Play supports purchasing products from inside of your app (in-app) or
outside of your app (out-of-app). In order for Google Play to ensure a
consistent purchase experience regardless of where the user purchases your
product, you must acknowledge all purchases received through the Google Play
Billing Library as soon as possible after granting entitlement to the user. If
you do not acknowledge a purchase within three days, the user automatically
receives a refund, and Google Play revokes the purchase. For
pending transactions (new in version 2.0), the three-day window
starts when the purchase has moved to the PURCHASED
state and does not apply
while the purchase is in a PENDING
state.
For subscriptions, you must acknowledge any purchase that has a new purchase token. This means that all initial purchases, plan changes, and re-signups need to be acknowledged, but you do not need to acknowledge subsequent renewals. To determine if a purchase needs acknowledgment, you can check the acknowledgement field in the purchase.
The Purchase
object now includes an
isAcknowledged()
method that indicates whether a purchase has been acknowledged. In addition, the
Google Play Developer API includes acknowledgement boolean values for both
Purchases.products
and Purchases.subscriptions
.
Before acknowledging a purchase, be sure to use these methods to determine if
the purchase has already been acknowledged.
You can acknowledge a purchase by using one of the following methods:
- For consumable products, use
consumeAsync()
, found in the client API. - For products that aren't consumed, use
acknowledgePurchase()
, found in the client API. - A new
acknowledge()
method is also available in the Server API.
BillingFlowParams.setSku() has been removed
The previously-deprecated BillingFlowParams#setSku()
method has been removed
in this release. Before rendering products in a purchase flow, you must now call
BillingClient.querySkuDetailsAsync()
,
passing the resulting
SkuDetails
object to
BillingFlowParams.Builder.setSkuDetails()
.
For code examples, see Use the Google Play Billing Library.
Developer payload is supported
Version 2.0 of the Google Play Billing library adds support for developer payload—arbitrary strings that can be attached to purchases. You can attach a developer payload parameter to a purchase, but only when the purchase is acknowledged or consumed. This is unlike developer payload in AIDL, where the payload could be specified when launching the purchase flow. Because purchases can now be initiated from outside of your app, this change ensures that you always have an opportunity to add a payload to purchases.
To access the payload in the new library, Purchase
objects now include a
getDeveloperPayload()
method.
Consistent offers
When you offer a discounted SKU, Google Play now returns the original price of the SKU so that you can show users that they are receiving a discount.
SkuDetails
contains two
new methods for retrieving the original SKU price:
getOriginalPriceAmountMicros()
- returns the unformatted original price of the SKU before discount.getOriginalPrice()
- returns the original price with additional currency formatting.
Pending transactions
With version 2.0 of the Google Play Billing library, you must support purchases where additional action is required before granting entitlement. For example, a user might choose to purchase your in-app product at a physical store using cash. This means that the transaction is completed outside of your app. In this scenario, you should grant entitlement only after the user has completed the transaction.
To enable pending purchases, call
enablePendingPurchases()
as part of initializing your app.
Use Purchase.getPurchaseState()
to determine whether the purchase state is PURCHASED
or PENDING
. Note that
you should grant entitlement only when the state is PURCHASED
. You should
check for Purchase
status updates by doing the following:
- When starting your app, call
BillingClient.queryPurchases()
to retrieve the list of unconsumed products associated with the user. - Call
Purchase.getPurchaseState()
on each returnedPurchase
object. - Implement the
onPurchasesUpdated()
method to respond to changes toPurchase
objects.
In addition, the Google Play Developer API includes a PENDING
state
for Purchases.products
.
Pending transactions are not supported for
subscriptions.
This release also introduces a new real-time developer notification type,
OneTimeProductNotification
. This notification type contains a single message
whose value is either ONE_TIME_PRODUCT_PURCHASED
or
ONE_TIME_PRODUCT_CANCELED
. This notification type is sent only for purchases
associated with delayed forms of payment, such as cash.
When acknowledging pending purchases, be sure to acknowledge only when the
purchase state is PURCHASED
and not PENDING
.
API changes
Version 2.0 of the Google Play Billing library contains several API changes to support new features and clarify existing functionality.
consumeAsync
consumeAsync()
now takes a
ConsumeParams
object
instead of a purchaseToken
. ConsumeParams
contains the purchaseToken
as
well as an optional developer payload.
The previous version of consumeAsync()
has been removed in this release.
queryPurchaseHistoryAsync
To minimize confusion,
queryPurchaseHistoryAsync()
now returns a
PurchaseHistoryRecord
object instead of a Purchase
object. The PurchaseHistoryRecord
object is the
same as a Purchase
object, except that it reflects only the values returned by
queryPurchaseHistoryAsync()
and does not contain the autoRenewing
,
orderId
, and packageName
fields. Note that nothing has changed with the
returned data—queryPurchaseHistoryAsync()
returns the same data as
before.
BillingResult return values
APIs that previously returned a BillingResponse
integer value now return a
BillingResult
object. BillingResult
contains the BillingResponse
integer as well as a
debug string that you can use to diagnose errors. The debug string uses an en-US
locale and is not meant to be shown to end users.
Bug fixes
SkuDetails.getIntroductoryPriceAmountMicros()
now returns along
instead of aString
.
Google Play Billing Library 1.2.2 Release (2019-03-07)
Version 1.2.2 of the Google Play Billing library is now available. This version contains the following changes.
Bug fixes
- Fixed a threading issue introduced in v1.2.1. Background calls no longer block the main thread.
Other changes
- Although using the main thread is still recommended, you can now instantiate the Google Play Billing Library from a background thread.
- Instantiation has been fully migrated to the background thread to reduce the chance of causing ANRs.
Play Billing Library 1.2.1 Release (2019-03-04)
Version 1.2.1 of the Google Play Billing library is now available. This version contains the following changes.
Major changes
- Added support for rewarded products. For more information on monetization options, see Add rewarded-product-specific features.
Other changes
- Added public constructors for
PurchasesResult
andSkuDetailsResult
to make testing easier. SkuDetails
objects can use a new method,getOriginalJson()
.- All AIDL service calls are now handled by background threads.
Bug fixes
- Null callback listeners are no longer passed into public APIs.
Google Play Billing Library 1.2 Release (2018-10-18)
Version 1.2 of the Google Play Billing library is now available. This version contains the following changes.
Summary of changes
- The Google Play Billing Library is now licensed under the Android Software Development Kit License Agreement.
- Added the
launchPriceChangeConfirmationFlow
API, which prompts users to review a pending change to a subscription price. - Added support for a new proration mode,
DEFERRED
, when upgrading or downgrading a user's subscription. - In the
BillingFlowParams
class, replacedsetSku()
withsetSkuDetails()
. - Minor bug fixes and code optimizations.
Price change confirmation
You can now change the price of a subscription in Google Play Console and prompt users to review and accept the new price when they enter your app.
To use this API, create a PriceChangeFlowParams
object by using the
skuDetails
of the subscription product, and then call
launchPriceChangeConfirmationFlow()
. Implement the
PriceChangeConfirmationListener
to handle the result when the price change
confirmation flow finishes, as shown in the following code snippet:
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. } });
The price change confirmation flow displays a dialog containing the new pricing
information, asking users to accept the new price. This flow returns a
response code of type
BillingClient.BillingResponse
.
New proration mode
When upgrading or downgrading a user's subscription, you can use a new proration
mode, DEFERRED
. This mode updates the user's subscription when it next
renews. To learn more about how to set this proration mode, see Set proration
mode.
New method for setting SKU details
In the BillingFlowParams
class, the setSku()
method has been deprecated.
This change serves to optimize the Google Play Billing flow.
When constructing a new instance of BillingFlowParams
in your in-app billing
client, we recommend that you instead work with the JSON object directly using
setSkuDetails()
, as shown in the following code snippet:
In the BillingFlowParams
Builder class, the setSku()
method has been
deprecated. Instead, use the setSkuDetails()
method, as shown in the following
code snippet. The object passed into setSkuDetails()
object comes from the
querySkuDetailsAsync()
method.
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 Billing Library 1.1 Release (2018-05-07)
Version 1.1 of the Google Play Billing library is now available. This version contains the following changes.
Summary of changes
- Added support to specify a proration mode in
BillingFlowParams
when upgrading/downgrading an existing subscription. - The
replaceSkusProration
boolean flag inBillingFlowParams
is no longer supported. UsereplaceSkusProrationMode
instead. launchBillingFlow()
now triggers a callback for failed responses.
Behavior changes
Version 1.1 of the Google Play Billing library contains the following behavior changes.
Developers can set replaceSkusProrationMode
in BillingFlowParams
class
A ProrationMode
provides further details on the type of proration when upgrading or downgrading a
user's subscription.
Kotlin
BillingFlowParams.newBuilder() .setSku(skuId) .setType(billingType) .setOldSku(oldSku) .setReplaceSkusProrationMode(replaceSkusProrationMode) .build()
Java
BillingFlowParams.newBuilder() .setSku(skuId) .setType(billingType) .setOldSku(oldSku) .setReplaceSkusProrationMode(replaceSkusProrationMode) .build();
Currently, Google Play supports following proration modes:
IMMEDIATE_WITH_TIME_PRORATION |
Replacement takes effect immediately, and the new expiration time will be prorated and credited or charged to the user. This is the current default behavior. |
IMMEDIATE_AND_CHARGE_PRORATED_PRICE |
Replacement takes effect immediately, and the billing cycle remains the same. The price for
the remaining period will be charged.
Note: This option is only available for subscription upgrade. |
IMMEDIATE_WITHOUT_PRORATION |
Replacement takes effect immediately, and the new price will be charged on next recurrence time. The billing cycle stays the same. |
replaceSkusProration
is no longer supported in BillingFlowParams
class
Developers used to be able to set a boolean flag to charge a prorated amount for a subscription
upgrade request. Given that we are supporting ProrationMode
, which contains more detailed
proration instruction, this boolean flag is no longer supported.
launchBillingFlow()
now triggers a callback for failed responses
The Billing Library will always trigger the PurhcasesUpdatedListener
callback and return a BillingResponse
asynchronously. The synchronous return value of BillingResponse
is kept as well.
Bug fixes
- Properly exits early in async methods when service is disconnected.
Builder
param objects no longer mutates built objects.- Issue 68087141:
launchBillingFlow()
now trigger callback for failed responses.
Google Play Billing Library 1.0 Release (2017-09-19, Announcement)
Version 1.0 of the Google Play Billing library is now available. This version contains the following changes.
Important changes
- Embedded billing permission inside library’s manifest. It's not necessary to add the
com.android.vending.BILLING
permission inside Android manifest anymore. - New builder added to
BillingClient.Builder
class. - Introduced builder pattern for
SkuDetailsParams
class to be used on methods to query SKUs. - Several API methods were updated for consistency (the same return argument names and order).
Behavior changes
Version 1.0 of the Google Play Billing library contains the following behavior changes.
BillingClient.Builder class
BillingClient.Builder
is now initialized via the newBuilder pattern:
Kotlin
billingClient = BillingClient.newBuilder(context).setListener(this).build()
Java
billingClient = BillingClient.newBuilder(context).setListener(this).build();
launchBillingFlow method is now called using a BillingFlowParams class
To initiate the billing flow for a purchase or subscription, the
launchBillingFlow()
method receives a
BillingFlowParams
instance initialized with parameters specific to the request:
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());
New way to query available products
Arguments for queryPurchaseHistoryAsync()
and querySkuDetailsAsync()
methods were wrapped into a Builder pattern:
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() {...})
The result is now returned via result code and a list of
SkuDetails
objects instead of previous wrapper class for your convenience and to be consistent across our API:
Kotlin
fun onSkuDetailsResponse(@BillingResponse responseCode: Int, skuDetailsList: List<SkuDetails>)
Java
public void onSkuDetailsResponse(@BillingResponse int responseCode, List<SkuDetails> skuDetailsList)
Parameters order changed on onConsumeResponse()
method
The order of arguments for onConsumeResponse
from the ConsumeResponseListener
interface has changed to be consistent across our API:
Kotlin
fun onConsumeResponse(@BillingResponse responseCode: Int, outToken: String)
Java
public void onConsumeResponse(@BillingResponse int responseCode, String outToken)
Unwrapped PurchaseResult object
PurchaseResult
has been unwraped to be consistent across our API:
Kotlin
fun onPurchaseHistoryResponse(@BillingResponse responseCode: Int, purchasesList: List<Purchase>)
Java
void onPurchaseHistoryResponse(@BillingResponse int responseCode, List<Purchase> purchasesList)
Bug fixes
- No response code in PURCHASES_UPDATED Bundle
- Fix ProxyBillingActivity and PurchasesUpdatedListener issues during device rotation
Developer Preview 1 Release (2017-06-12, Announcement)
Developer preview launched, aimed to simplify the development process when it comes to billing, allowing developers to focus their efforts on implementing logic specific to the Android app, such as application architecture and navigation structure.
The library includes several convenient classes and features for you to use when integrating your Android apps with the Google Play Billing API. The library also provides an abstraction layer on top of the Android Interface Definition Language (AIDL) service, making it easier for developers to define the interface between the app and the Google Play Billing API.