purchase method

  1. @override
Future<void> purchase({
  1. required PurchaseProduct product,
  2. required VoidCallback onDone,
  3. PurchaseProduct? replacedProduct,
})
override

Process the purchase of product.

productの購入処理を行います。

Implementation

@override
Future<void> purchase({
  required PurchaseProduct product,
  required VoidCallback onDone,
  PurchaseProduct? replacedProduct,
}) async {
  final userId = onRetrieveUserId.call();
  if (product is _StoreConsumablePurchaseProduct) {
    final purchaseParam = PurchaseParam(
      productDetails: product.productDetails,
      applicationUserName: userId ?? product.userId,
    );
    if (!await _iap.buyConsumable(
      purchaseParam: purchaseParam,
      autoConsume: automaticallyConsumeOnAndroid || _platformInfo.isIOS,
    )) {
      throw Exception("Purchase failed or was canceled.");
    }
  } else if (product is _StoreNonConsumablePurchaseProduct) {
    final purchaseParam = PurchaseParam(
      productDetails: product.productDetails,
      applicationUserName: userId ?? product.userId,
    );
    if (!await _iap.buyNonConsumable(purchaseParam: purchaseParam)) {
      throw Exception("Purchase failed or was canceled.");
    }
  } else if (product is _StoreSubscriptionPurchaseProduct) {
    final changeSubscription =
        await _getReplacedPurchaseDetails(replacedProduct: replacedProduct);

    final purchaseParam = _platformInfo.isAndroid
        ? GooglePlayPurchaseParam(
            productDetails: product.productDetails,
            applicationUserName: userId ?? product.userId,
            changeSubscriptionParam: changeSubscription != null
                ? ChangeSubscriptionParam(
                    oldPurchaseDetails: changeSubscription,
                    replacementMode: ReplacementMode.withTimeProration,
                    // prorationMode: ProrationMode.immediateWithTimeProration,
                  )
                : null,
          )
        : PurchaseParam(
            productDetails: product.productDetails,
            applicationUserName: userId ?? product.userId,
          );
    if (!await _iap.buyNonConsumable(purchaseParam: purchaseParam)) {
      throw Exception("Purchase failed or was canceled.");
    }
  } else {
    throw Exception("Product not found: ${product.productId}");
  }
}