소스 검색

Load subscription from server using the verification data fetched from IAP

Vishnu Mohandas 4 년 전
부모
커밋
2e8b3b25fe
2개의 변경된 파일43개의 추가작업 그리고 4개의 파일을 삭제
  1. 29 1
      lib/services/billing_service.dart
  2. 14 3
      lib/ui/subscription_page.dart

+ 29 - 1
lib/services/billing_service.dart

@@ -1,3 +1,6 @@
+import 'dart:io';
+
+import 'package:dio/dio.dart';
 import 'package:logging/logging.dart';
 import 'package:photos/core/configuration.dart';
 import 'package:photos/core/network.dart';
@@ -13,6 +16,7 @@ class BillingService {
 
   final _logger = Logger("BillingService");
   final _dio = Network.instance.getDio();
+  final _config = Configuration.instance;
 
   SharedPreferences _prefs;
   Future<List<BillingPlan>> _future;
@@ -24,7 +28,7 @@ class BillingService {
   Future<List<BillingPlan>> getBillingPlans() {
     if (_future == null) {
       _future = _dio
-          .get(Configuration.instance.getHttpEndpoint() + "/billing/plans")
+          .get(_config.getHttpEndpoint() + "/billing/plans")
           .then((response) {
         final plans = List<BillingPlan>();
         for (final plan in response.data["plans"]) {
@@ -36,6 +40,30 @@ class BillingService {
     return _future;
   }
 
+  Future<Subscription> loadSubscription(String verificationData) async {
+    return _dio
+        .get(
+      _config.getHttpEndpoint() + "/billing/subscription",
+      queryParameters: {
+        "client": Platform.isAndroid ? "android" : "ios",
+        "verificationData": verificationData,
+      },
+      options: Options(
+        headers: {
+          "X-Auth-Token": _config.getToken(),
+        },
+      ),
+    )
+        .then((response) {
+      if (response == null || response.statusCode != 200) {
+        throw Exception(response);
+      }
+      final subscription = Subscription.fromMap(response.data["subscription"]);
+      setSubscription(subscription);
+      return subscription;
+    });
+  }
+
   // TODO: Fetch new subscription once the current one has expired?
   Subscription getSubscription() {
     final jsonValue = _prefs.getString(subscriptionKey);

+ 14 - 3
lib/ui/subscription_page.dart

@@ -27,13 +27,24 @@ class _SubscriptionPageState extends State<SubscriptionPage> {
 
   @override
   void initState() {
-    _purchaseUpdateSubscription =
-        InAppPurchaseConnection.instance.purchaseUpdatedStream.listen((event) {
+    _purchaseUpdateSubscription = InAppPurchaseConnection
+        .instance.purchaseUpdatedStream
+        .listen((event) async {
       for (final e in event) {
         if (e.status == PurchaseStatus.purchased) {
           Logger("SubscriptionPage")
               .info(e.verificationData.serverVerificationData);
-          // TODO: Send this to /billing/subscription/verify?data=
+          try {
+            await BillingService.instance
+                .loadSubscription(e.verificationData.serverVerificationData);
+          } catch (e) {
+            showErrorDialog(
+                context,
+                "payment failed",
+                "please talk to " +
+                    (Platform.isAndroid ? "PlayStore" : "AppStore") +
+                    " support if you were charged");
+          }
           Bus.instance.fire(UserAuthenticatedEvent());
           Navigator.pop(context);
           AwesomeDialog(