I'm using using Google's Billing Library 4. The documentation for BillingClient.launchBillingFlow
says:
Initiates the billing flow for an in-app purchase or subscription.
It will show the Google Play purchase screen. The result will be delivered via the
PurchasesUpdatedListener
interface implementation set byBillingClient.Builder.setListener(PurchasesUpdatedListener)
.
The PurchasesUpdatedListener
is passed a BillingResult
object that contains a response code. However, the launchBillingFlow
method also returns a BillingResult
object. My question is, what response codes do I need to deal with in each place?
The documentation is, shall we say, less than clear, and also seems wrong. For launchBillingFlow
, it says that the method returns a BillingResult
with a code of BillingResponseCode.BILLING_CANCELED
if the user cancels the purchase flow. However, my experiments show that code is actually delivered in a call to PurchasesUpdatedListener.onPurchasesUpdated
.
Unfortunately, the source code for BillingClient
isn't available, but I did decompile the library module. As far as I can tell, the call to launchBillingFlow
can return the following result codes:
OK
- when the flow successfully starts (and the user is shown Google's purchase screen).SERVICE_DISCONNECTED
- when theBillingClient
isn't currently connected to Google Play on the device.SERVICE_TIMEOUT
- if the connection breaks during the attempt to launch the flow. (I think I read somewhere that this can happen if Google Play is being updated in the background.)FEATURE_NOT_SUPPORTED
- under various conditions where theBillingFlowParams
don't match the current configuration of theBillingClient
object.
There also seems to be a place in the decompiled code where certain error responses from the Google Play billing service are captured and returned here. Does anyone know what other response codes can be returned from a call to launchBillingFlow
?
launchBillingFlow
, the result OK here means the app starting purchase follow successfully. You should focus on the result pass toonPurchasesUpdated
method. this is final result when user purchased or cancelled or already owner of item... – ShifflettlaunchBillingFlow
returns and what codes need to be handled inonPurchasesUpdated()
? There's obviously some overlap, but there's also obviously some codes that are unique to each context. The documentation just lists all possible return codes, without distinguishing which should be handled where. – Hulton