I have implemented in app purchases (IAP) as per in_app_purchase
package example
I am able to buy a product from the store (I only have one set up). But when it comes to testing "user has a new phone" scenario, the restore purchases does not seem to work. No error either.
I've implemented this in a provider pattern. Store connection is initialized like this:
_isStoreAvailable = await _inAppPurchase.isAvailable();
Purchasing is implemented this way:
Future<void> initializePurchase() async {
ProductDetailsResponse response =
await _inAppPurchase.queryProductDetails(_productIds);
if (response.notFoundIDs.isNotEmpty) {
// Handle the error.
print("not found product in store!)");
} else {
PurchaseParam purchaseParam = PurchaseParam(
productDetails: response.productDetails.first,
);
_inAppPurchase.buyNonConsumable(purchaseParam: purchaseParam);
}
}
I listen for changes using this code:
final Stream<List<PurchaseDetails>> purchaseUpdated =
_inAppPurchase.purchaseStream;
_subscription =
purchaseUpdated.listen((List<PurchaseDetails> purchaseDetailsList) {
_listenToPurchaseUpdated(purchaseDetailsList);
}, onDone: () {
_subscription.cancel();
}, onError: (error) {
print("listen error: $error");
});
...and this
Future<void> _listenToPurchaseUpdated(
List<PurchaseDetails> purchaseDetailsList) async {
for (final PurchaseDetails purchaseDetails in purchaseDetailsList) {
if (purchaseDetails.status != PurchaseStatus.pending) {
if (purchaseDetails.status == PurchaseStatus.error) {
//handle error
} else if (purchaseDetails.status == PurchaseStatus.purchased ||
purchaseDetails.status == PurchaseStatus.restored) {
setLicense(StoreLicenseStatus.paid);
notifyListeners();
if (purchaseDetails.pendingCompletePurchase) {
await _inAppPurchase.completePurchase(purchaseDetails);
}
}
}
}
}
User can request purchases to be restored using this code:
Future<void> restorePurchases() async {
await _inAppPurchase.restorePurchases();
}
Everything except restore works. I can buy a product, clear data, and when I start the app again, if I try to buy, I get a message from the store "you already own this item". So the store recognizes that the product was already purchased, great! But when I click "restore" nothing happens.
Am I missing something here?
This is on an emulator (Pixel 4 API 32), also on a real device.
Exactly the same situation for me. Restore purchase doesn’t restore anything though I definitely have a purchase.
Additionally I have to mention that it works perfectly when I build the app locally (both debug and release modes), but the issue appears when I build it with CICD and put on Firebase App Distribution or Play Console Internal testing.
GitHub thread.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With