Reputation: 3738
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
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
Reputation: 8598
for Kotlin
ProductDetailsParams.newBuilder()
.setProductDetails(productDetails)
.setOfferToken(it.offerToken)
.build()
Upvotes: 0
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
Reputation: 634
Found a solution with OfferToken
:
.setOfferToken(productDetails.getSubscriptionOfferDetails().get(0).getOfferToken())
Simple workaround. :)
Upvotes: 11
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