Mark
Mark

Reputation: 3738

How to pass token of a one time purchase product to Google Play Billing Library 5?

How do you get token of PurchaseDetails object in Android? Based on the docs, https://developer.android.com/google/play/billing/integrate#java, to launch a purchase flow we need to do something like below:

// An activity reference from which the billing flow will be launched.
Activity activity = ...;

ImmutableList productDetailsParamsList =
    ImmutableList.of(
        ProductDetailsParams.newBuilder()
             // retrieve a value for "productDetails" by calling queryProductDetailsAsync()
            .setProductDetails(productDetails)
            // to get an offer token, call ProductDetails.getSubscriptionOfferDetails()
            // for a list of offers that are available to the user
            .setOfferToken(selectedOfferToken)
            .build()
    );

BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
    .setProductDetailsParamsList(productDetailsParamsList)
    .build();

// Launch the billing flow
BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);

Note that it shows to get the offer token:

to get an offer token, call ProductDetails.getSubscriptionOfferDetails()

This assumes we are using a subscription, however in my case I'm using an in app purchase which is a one-off purchase. If it is a subscription I believe I could try and use the getOfferToken() method as show here: https://developer.android.com/reference/com/android/billingclient/api/ProductDetails.SubscriptionOfferDetails#getOfferToken()

However, with a one time purchase the object does not contain any methods to deal with tokens, https://developer.android.com/reference/com/android/billingclient/api/ProductDetails.OneTimePurchaseOfferDetails.

So my question is what do we pass into the selectedOfferToken for a one time purchase product?

Upvotes: 27

Views: 8206

Answers (5)

Ricardo Veloz
Ricardo Veloz

Reputation: 19

im use this in maui:

        var productDetails = await QueryProductDetailsAsync(productId);
        var productDetailsParamsList = new List<ProductDetailsParams>
        {

            ProductDetailsParams.NewBuilder()
            .SetProductDetails(productDetails)  
            .SetOfferToken(productDetails.GetSubscriptionOfferDetails().FirstOrDefault().OfferToken)
            .Build()
        };

Upvotes: 0

Yuliia Ashomok
Yuliia Ashomok

Reputation: 8598

for Kotlin

ProductDetailsParams.newBuilder()
                            .setProductDetails(productDetails)
                            .setOfferToken(it.offerToken)
                            .build()

Upvotes: 0

MatthiasL
MatthiasL

Reputation: 139

If you use a product with subscription not specifying getOfferToken results in a crash. At the moment is am using MoD s workaround, but i still get "Error - The item you requested is not available for purchase". I do not know if this is due to getOfferToken. In the description of product+base plane + offer Google said that a "base plane" has multiple "offers", but i never defined any offer. So this also could be the reason. In the debugger one can see values in the offer string, so Google seems to provide some default offer , but , yes need to further test. In any case - if you use subscriptions you need to set an offer String. I also tried what happens when sending a wrong offer string - something like "cheesymeasy". Google then returns "Error Something went wrong on our end. Please try again". So most likely the string returned by getOfferToken is indeed valid.

Upvotes: 0

MoD
MoD

Reputation: 634

Found a solution with OfferToken:

.setOfferToken(productDetails.getSubscriptionOfferDetails().get(0).getOfferToken())

Simple workaround. :)

Upvotes: 11

Mark
Mark

Reputation: 3738

For anyone who has been struggling with this, I hope this helps, took days of my time...it seems we don't need to call the .setOfferToken(selectedOfferToken) method.

ImmutableList productDetailsParamsList =
    ImmutableList.of(
        ProductDetailsParams.newBuilder()
             // retrieve a value for "productDetails" by calling queryProductDetailsAsync()
            .setProductDetails(productDetails)
            // to get an offer token, call ProductDetails.getSubscriptionOfferDetails()
            // for a list of offers that are available to the user
            .build()
    );

Upvotes: 33

Related Questions