Я уже:
- Создал свое приложение в консоли Google Play
- Загрузил сборку (.aab)
- Определил три расходных продукта (бронза, серебро, золото)
- на разных эмуляторах с использованием flutter run
- двух разных физических устройствах Android с использованием flutter run
- загрузил приложение из Google Play на разных устройствах
В приложении я добавил отладочные сообщения, указывающие на инициирование Оплата и результат. Появляются первоначальные сообщения журнала, но затем ничего не происходит и ответа не приходит. (Конечно, после добавления тайм-аута к queryProducts он терпит неудачу по истечении тайм-аута; но без тайм-аута он ждет вечность).
При работе на физических устройствах я вижу такие записи в журнале с помощью Logcat:
getSkuDetails() не удалось выполнить queryProductDetailsAsync. Код ответа: 12
Это код, который я запускаю, когда пользователь пытается приобрести продукт:
Future purchaseProduct(
Map plan,
BuildContext context,
) async {
//check availability
print('Checking purchase availability');
final bool available = await InAppPurchase.instance.isAvailable();
if (!available) {
print('Purchase is not available');
eventBus.fire(
PurchaseFailed(
message: 'Failed to connect to store.',
),
);
return 'Failed';
}
//making product ids set
print('making product ids set');
Set productIds = {plan['play_product_id']};
print(productIds);
//checking products
try {
print('Getting product data');
final ProductDetailsResponse response = await InAppPurchase.instance
.queryProductDetails(productIds)
.timeout(const Duration(seconds: 30));
if (response.error != null) {
print(response.error);
eventBus.fire(
PurchaseFailed(
message: response.error.toString(),
),
);
return 'Failed';
} else if (response.notFoundIDs.isNotEmpty) {
print('Product not found');
eventBus.fire(
PurchaseFailed(
message: 'Product not found.',
),
);
return 'Failed';
}
final List products = response.productDetails;
final PurchaseParam purchaseParam = PurchaseParam(
productDetails: products[0],
);
print('Trying to start purchase with:');
print(purchaseParam);
InAppPurchase.instance.buyConsumable(purchaseParam: purchaseParam);
print('Started');
return 'pending';
} on TimeoutException {
print('Failed to retrieve product data in a timely manner.');
eventBus.fire(
PurchaseFailed(
message: 'Failed to retrieve product data in a timely manner.',
),
);
return 'Failed';
}
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... ses-iap-in
Мобильная версия