首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获得订阅内的所有计划[in_app_purchase]

获得订阅内的所有计划[in_app_purchase]
EN

Stack Overflow用户
提问于 2022-06-09 13:26:03
回答 2查看 285关注 0票数 1

我正在使用in_app_purchase包,但是我只能在订阅中得到一个计划

我有3份订阅:

代码语言:javascript
复制
Basic subscription
Premium subscription
Enterprise subscription

在每一次订阅中,我想有两个计划:

代码语言:javascript
复制
Month plan
Year plan

我总是得到具有“向后兼容性”的计划(“这将是被废弃的Google计费库方法querySkuDetailsAsync()返回的基线”)。

有没有办法得到所有的计划,或者我必须有6个订阅,每一个计划只有一个?

编辑:

代码语言:javascript
复制
import 'dart:async';
import 'dart:io';

import 'package:flutter/material.dart';
import 'package:flutter_i18n/flutter_i18n.dart';
import 'package:in_app_purchase/in_app_purchase.dart';
import 'package:in_app_purchase_storekit/in_app_purchase_storekit.dart';
import 'package:in_app_purchase_storekit/store_kit_wrappers.dart';
import 'package:motorline_home/widgets/materials/appbar/appbar_title_widget.dart';
import 'package:motorline_home/widgets/materials/pop_button_widget.dart';
import 'package:rxdart/subjects.dart';

class SubscriptionPage extends StatefulWidget {

  const SubscriptionPage({
    Key? key,
  }) : super(key: key);

  @override
  State<SubscriptionPage> createState() => _SubscriptionPageState();
}

class _SubscriptionPageState extends State<SubscriptionPage> {
  // In app subscriptions
  InAppPurchase _inAppPurchase = InAppPurchase.instance;
  late StreamSubscription<List<PurchaseDetails>> _inAppPurchaseSubscription;
  StreamController<List<ProductDetails>> _streamGooglePlaySubscriptions =
      BehaviorSubject();
  final List<String> _subscriptionsIDs = [
    "basic",
    "premium",
    "enterprise",
  ];

  @override
  void initState() {
    super.initState();

    // In app purchase subscription
    _inAppPurchaseSubscription =
        _inAppPurchase.purchaseStream.listen((purchaseDetailsList) {
      _listenToPurchaseUpdated(purchaseDetailsList);
    }, onDone: () {
      print("In app purchase onDone");
      _inAppPurchaseSubscription.cancel();
    }, onError: (error) {
      print("In app purchase error: ${error.toString()}");
      // handle error here.
      _inAppPurchaseSubscription.cancel();
    });
    // Initialize in app purchase
    _initializeInAppPurchase();
  }

  @override
  void dispose() {
    if (Platform.isIOS) {
      final InAppPurchaseStoreKitPlatformAddition iosPlatformAddition =
      _inAppPurchase
          .getPlatformAddition<InAppPurchaseStoreKitPlatformAddition>();
      iosPlatformAddition.setDelegate(null);
    }

    // Cancel in app purchase listener
    _inAppPurchaseSubscription.cancel();

    super.dispose();
  }

  @override
  Widget build(BuildContext context) {

    return Scaffold(
      appBar: AppBar(
        title: AppBarTitleWidget(
          title: FlutterI18n.translate(context, "subscriptions"),
        ),
        leading: PopButtonWidget(),
      ),
      // Body
      body: Container(),
    );
  }

  void _initializeInAppPurchase() async {
    print("Initializing in app purchase");
    bool available = await _inAppPurchase.isAvailable();
    print("In app purchase initialized: $available");

    if (available) {
      if (Platform.isIOS) {
        final InAppPurchaseStoreKitPlatformAddition iosPlatformAddition =
        _inAppPurchase
            .getPlatformAddition<InAppPurchaseStoreKitPlatformAddition>();
        await iosPlatformAddition.setDelegate(ExamplePaymentQueueDelegate());
      }

      // Get subscriptions
      List<ProductDetails> subscriptions = await _getSubscriptions(
        productIds:
          _subscriptionsIDs.toSet(),
      );
      // Sort by price
      subscriptions.sort((a, b) => a.rawPrice.compareTo(b.rawPrice));

      // Add subscriptions to stream
      _streamGooglePlaySubscriptions.add(subscriptions);

      // DEBUG: Print subscriptions
      print("In app purchase subscription subscriptions: ${subscriptions}");
      for (var subscription in subscriptions) {
        print("In app purchase plan: ${subscription.id}: ${subscription.rawPrice}");
        print("In app purchase description: ${subscription.description}");
        // HOW GET ALL PLANS IN EACH SUBSCRIPTION ID?
      }

      await InAppPurchase.instance.restorePurchases();
    }
  }

  // In app purchase updates
  void _listenToPurchaseUpdated(List<PurchaseDetails> purchaseDetailsList) {
    purchaseDetailsList.forEach((PurchaseDetails purchaseDetails) async {
      // If purchase is pending
      if (purchaseDetails.status == PurchaseStatus.pending) {
        print("In app purchase pending...");
        // Show pending ui
      } else {
        if (purchaseDetails.status == PurchaseStatus.canceled) {
          print("In app purchase cancelled");
        }
        // If purchase failed
        if (purchaseDetails.status == PurchaseStatus.error) {
          print("In app purchase error");
          // Show error
        } else if (purchaseDetails.status == PurchaseStatus.purchased ||
            purchaseDetails.status == PurchaseStatus.restored) {
          print("In app purchase restored or purchased");
        }

        if (purchaseDetails.pendingCompletePurchase) {
          debugPrint("In app purchase complete purchased");
          debugPrint(
              "In app purchase purchase id : ${purchaseDetails.purchaseID}");
          debugPrint(
              "In app purchase server data : ${purchaseDetails.verificationData.serverVerificationData}");
          debugPrint(
              "In app purchase local data  : ${purchaseDetails.verificationData.localVerificationData}");
          // Verify purchase on backend

          try {
            // VALIDADE PURCHASE IN BACKEND
          } catch (error) {
            debugPrint("In app purchase error: ${error.toString()}");
          }
        }
      }
    });
  }

  // Get subscription
  Future<List<ProductDetails>> _getSubscriptions(
      {required Set<String> productIds}) async {
    ProductDetailsResponse response =
        await _inAppPurchase.queryProductDetails(productIds);

    return response.productDetails;
  }
}

/// Example implementation of the
/// [`SKPaymentQueueDelegate`](https://developer.apple.com/documentation/storekit/skpaymentqueuedelegate?language=objc).
///
/// The payment queue delegate can be implementated to provide information
/// needed to complete transactions.
class ExamplePaymentQueueDelegate implements SKPaymentQueueDelegateWrapper {
  @override
  bool shouldContinueTransaction(
      SKPaymentTransactionWrapper transaction, SKStorefrontWrapper storefront) {
    return true;
  }

  @override
  bool shouldShowPriceConsent() {
    return false;
  }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-06-13 13:41:59

你喜欢做的事是不可能的。您需要为每个订阅创建一个新的计划,您不能说一个高级订阅有一个年度和一个月计划。

票数 0
EN

Stack Overflow用户

发布于 2022-12-04 12:05:32

这在目前是不可能的,因为它没有官方插件支持(我们不知道它什么时候会支持):

https://github.com/flutter/flutter/issues/110909

正如他们所提到的,解决方案是每个订阅都有一个计划,其中包含应用程序中所需的额外逻辑(例如,检测ID PLUS-year的订阅是否是PLUS-month的升级)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72561135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档