#flutter #dart #in-app-purchase
Вопрос:
BillingResponse.Ошибка разработчика I/flutter ( 5091): Покупка находится в недопустимом состоянии.
Иногда я получаю эту ошибку, но у меня бывают случаи, когда ответ на выставление счета в порядке (BillingResponse.ok). В чем может быть проблема? Мой код следует официальному примеру flutter.dev, который является https://pub.dev/packages/in_app_purchase Все хорошо до этого фрагмента кода
var completePurchase = await InAppPurchaseConnection.instance
.completePurchase(purchaseDetails);
который возвращает BillingResponse.developerError или иногда magic возвращает BillingResponse.ok
В виджете я просто называю buyNonConsumable
instance.buyNonConsumable(prod);
Есть ли шанс быть, потому что он не находится в производстве или что-то еще, что связано с внутренним тестированием, потому что приложение находится на внутреннем тестировании?
Вкратце, код выглядит следующим образом
_subscription = getPurchaseStream.listen(
(purchaseDetailsList) {
_listenToPurchaseUpdated(purchaseDetailsList);
}, onDone: () {
_subscription.cancel();
}, onError: (error) {
// handle error here.
print('Subscription error: $error');
});
_isAvailable = await _connection.isAvailable();
if(!_isAvailable) {
print('The store is not available, try again later..');
return;
}
_myProductsIds = await _categoryRepository.getCategoriesGoogleProductsIds();
await _getProducts();
await _getPastPurchases();
for (PurchaseDetails purchase in _purchases) {
verifyPurchase(purchase.productID);
if (_isPurchased) { //Check if product is purchased
await deliverProduct(); // Give the products on the user
} else {
_handleInvalidPurchase(purchase);
}
}
purchaseDetailsList.forEach((PurchaseDetails purchaseDetails) async {
if (purchaseDetails.status == PurchaseStatus.pending) {
print('Pending..');
} else {
if (purchaseDetails.status == PurchaseStatus.error) {
print('To purchases status error: ${purchaseDetails.error}');
} else if (purchaseDetails.status == PurchaseStatus.purchased) {
verifyPurchase(purchaseDetails.productID); // change value of _isPurchased
if (_isPurchased) {
_purchases.add(purchaseDetails);
for(String id in _myProductsIds) {
if (purchaseDetails.productID == id) {
await deliverProduct(); // Give the products on the user
}
}
} else {
_handleInvalidPurchase(purchaseDetails);
return;
}
}
if (Platform.isAndroid) {
for(String id in _myProductsIds) {
if (purchaseDetails.productID == id) {
await InAppPurchaseConnection.instance
.consumePurchase(purchaseDetails);
}
}
}
if (purchaseDetails.pendingCompletePurchase) {
var completePurchase = await InAppPurchaseConnection.instance
.completePurchase(purchaseDetails);
}
}
Ответ №1:
Я не знаю, почему в официальном примере есть consumePurchase, если платформа Android, но из-за этого фрагмента кода мое приложение выходило из строя, и оно возвращало ошибку «Разработчик.ошибка» в важных строках, и они
var completePurchase = await InAppPurchaseConnection.instance
.completePurchase(purchaseDetails);
Я прочитал документацию по методу completePurchase и увидел важный комментарий, который гласит:
/// The [consumePurchase] acts as an implicit [completePurchase] on Android.
Future<BillingResultWrapper> completePurchase(PurchaseDetails purchase);
Возможно, было обновление версии покупок в приложении, и после этого определенный пример не был обновлен.
Ссылка на пример: https://github.com/flutter/plugins/tree/master/packages/in_app_purchase/in_app_purchase/example