Флаттер.Как проверить, что подписка на автовозобновление остается в силе - PullRequest
0 голосов
/ 27 февраля 2019

Мое приложение подписано на 1 месяц.Когда пользователь нажимает кнопку «Купить подписку», я сохраняю дату покупки в общих настройках.Затем, через 1 месяц, мне нужно проверить, действует ли эта подписка.Так как я могу это реализовать?

Ответы [ 2 ]

0 голосов
/ 26 апреля 2019

ОБНОВЛЕНИЕ с 15.07.2019.Просто чтобы сэкономить время.Ответ ниже был дан для устаревшего плагина для платежей.После этого команда Flutter создала плагин https://pub.dev/packages/in_app_purchase, и я рекомендую его использовать.

=====

Лучший способ - использовать защищенный внутренний сервер для получения Уведомления разработчиков в режиме реального времени .Но, можно проверить статус прямо в приложении.Таким образом, когда пользователь пытается получить доступ к некоторым платным функциям, вы можете проверить, активна ли его подписка.Ниже приведен пример:

Создайте где-нибудь файл с классом

import 'dart:io' show Platform;
import 'package:flutter/services.dart';
import 'package:flutter_inapp_purchase/flutter_inapp_purchase.dart';
import 'dart:async';

class SubcsriptionStatus {
static Future<bool> subscriptionStatus(
  String sku,
  [Duration duration = const Duration(days: 30),
  Duration grace = const Duration(days: 0)]) async {
    if (Platform.isIOS) {
      var history = await FlutterInappPurchase.getPurchaseHistory();

      for (var purchase in history) {
        Duration difference =
        DateTime.now().difference(purchase.transactionDate);
        if (difference.inMinutes <= (duration + grace).inMinutes &&
            purchase.productId == sku) return true;
      }
      return false;
    } else if (Platform.isAndroid) {
      var purchases = await FlutterInappPurchase.getAvailablePurchases();

      for (var purchase in purchases) {
        if (purchase.productId == sku) return true;
      }
      return false;
    }
    throw PlatformException(
        code: Platform.operatingSystem, message: "platform not supported");
  }
}

Импортируйте его, где вам нужно проверить состояние подписки и использовать его в Конструкторе.Например:

class _SubscriptionState extends State<Subscription> {
  bool userSubscribed;
  _SubscriptionState() {
  SubcsriptionStatus.subscriptionStatus(iapId, const Duration(days: 30), const 
  Duration(days: 0)).then((val) => setState(() {
  userSubscribed = val;
   }));
   }
}

В переменной userSubscribeed будет состояние - true или false.(Обратите внимание, что вы должны добавить flutter_inapp_purchase к своему проекту).

0 голосов
/ 27 февраля 2019

Есть несколько способов сделать это, но я бы не стал делать это на мобильном устройстве.

На устройстве, как вы просили

Установить Flutter Cache Manager , при запуске установите значение ключа кэша 'Subscription' в true с maxAgeCacheObject:Продолжительность (дней: 30).При каждом запуске проверяйте, существует ли этот ключ в кеше.Если это так, то он все еще действителен, в противном случае срок его действия истек.

Предлагаемое решение с использованием FirebaseFunction

Я бы предложил настроить бэкэнд для управления всем этим.Это не задача для мобильного устройства.Вы можете получить Cloud Function из firebase, где вы передадите уникальный идентификатор устройства, и он вернет, действительна ли подписка или нет.Для этого должна работать безсерверная функция.Псевдо шаги:

  1. (на устройстве) Когда приложение запускается, сгенерируйте guid и сделайте http post-запрос с вашим guid.
  2. (Server) В вашей функции без сервера сохраните датузапрос делается в вашу базу данных вместе с отправленным вами уникальным идентификатором.Если ваш идентификатор уже находится в БД, проверьте, не истек ли он (дата добавлена ​​- текущая дата) <30 дней.Верните true или false из функции.True, если он все еще действителен, false, если он недействителен. </li>
  3. (на устройстве). Когда вы получаете true от своей функции, сохраняйте сгенерированный идентификатор локально на диске и продолжайте то, что вы хотите сделать.Если значение равно false, заблокируйте пользователя или покажите подписку, о которой вы хотите позаботиться.
...