internal bool isValidPurchaseState(AppleReceipt appleReceipt, string id)
        {
            var isValid = true;

            if (appleReceipt != null &&
                appleReceipt.inAppPurchaseReceipts != null &&
                appleReceipt.inAppPurchaseReceipts.Length > 0)
            {
                var foundReceipts = Array.FindAll(appleReceipt.inAppPurchaseReceipts, (r) => r.productID == id);
                if (foundReceipts != null && foundReceipts.Length > 0)
                {
                    Array.Sort(foundReceipts, (b, a) => (a.purchaseDate.CompareTo(b.purchaseDate)));
                    var mostRecentReceipt = foundReceipts[0];
                    var productType       = (AppleStoreProductType)Enum.Parse(typeof(AppleStoreProductType), mostRecentReceipt.productType.ToString());
                    if (productType == AppleStoreProductType.AutoRenewingSubscription)
                    {
                        // if the product is auto-renewing subscription, check if this transaction is expired
                        if (new SubscriptionInfo(mostRecentReceipt, null).isExpired() == Result.True)
                        {
                            isValid = false;
                        }
                    }
                }
            }
            return(isValid);
        }
Esempio n. 2
0
        public async Task Verify(AppleReceipt receipt)
        {
            var content  = new JsonContent(receipt);
            var response = await _client.PostAsync(BaseUrl + "ios?code=YOUR_CODE_HERE", content);

            response.EnsureSuccessStatusCode();
        }
Esempio n. 3
0
    public override void RestoreReciepts(IExtensionProvider sentProvider)
    {
        var apple = sentProvider.GetExtension <IAppleExtensions>();

        apple.RestoreTransactions((result) =>
        {
            if (result)
            {
                try
                {
                    ConfigurationBuilder builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());
                    appleReceipt = GetReceiptData(builder);
                    foreach (AppleInAppPurchaseReceipt productReceipt in appleReceipt.inAppPurchaseReceipts)
                    {
                        PurchaseAction(productReceipt.productID);
                    }
                }
                catch (System.Exception e)
                {
                    e.ToString();
                    Debug.Log("Faled to restore purchases");
                }
            }
            RestoreAction(result);
        });
    }
Esempio n. 4
0
        private SubscriptionInfo getAppleAppStoreSubInfo(string payload, string productId)
        {
            AppleReceipt receipt = null;

            var logger = UnityEngine.Debug.unityLogger;

            try {
                receipt = new AppleReceiptParser().Parse(Convert.FromBase64String(payload));
            } catch (ArgumentException e) {
                logger.Log("Unable to parse Apple receipt", e);
            } catch (Security.IAPSecurityException e) {
                logger.Log("Unable to parse Apple receipt", e);
            } catch (NullReferenceException e) {
                logger.Log("Unable to parse Apple receipt", e);
            }

            List <AppleInAppPurchaseReceipt> inAppPurchaseReceipts = new List <AppleInAppPurchaseReceipt>();

            if (receipt != null && receipt.inAppPurchaseReceipts != null && receipt.inAppPurchaseReceipts.Length > 0)
            {
                foreach (AppleInAppPurchaseReceipt r in receipt.inAppPurchaseReceipts)
                {
                    if (r.productID.Equals(productId))
                    {
                        inAppPurchaseReceipts.Add(r);
                    }
                }
            }
            return(inAppPurchaseReceipts.Count == 0 ? null : new SubscriptionInfo(findMostRecentReceipt(inAppPurchaseReceipts), this.intro_json));
        }
Esempio n. 5
0
    public void saveLongestLastingExpirationDate()
    {
#if UNITY_IPHONE
        var             builder            = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());
        var             appleConfig        = builder.Configure <IAppleConfiguration>();
        List <DateTime> allExpirationDates = new List <DateTime>();
        if (!string.IsNullOrEmpty(appleConfig.appReceipt))
        {
            var receiptData            = System.Convert.FromBase64String(appleConfig.appReceipt);
            AppleReceiptParser parser  = new AppleReceiptParser();
            AppleReceipt       receipt = parser.Parse(receiptData);
            //AppleReceipt receipt = new AppleReceiptParser.Parse(receiptData);

            FMC_GameDataController.instance.writeToReceiptLog("sled " + receipt.bundleID);
            FMC_GameDataController.instance.writeToReceiptLog("sled " + receipt.receiptCreationDate);
            foreach (AppleInAppPurchaseReceipt productReceipt in receipt.inAppPurchaseReceipts)
            {
                FMC_GameDataController.instance.writeToReceiptLog("sled Transaction ID: " + productReceipt.transactionID);
                FMC_GameDataController.instance.writeToReceiptLog("sled Product ID: " + productReceipt.productID);
                FMC_GameDataController.instance.writeToReceiptLog("sled Sub Expiration Date: " + productReceipt.subscriptionExpirationDate);

                // Wenn eine der IDs im Receipt mit einer der Abo-IDs übereinstimmt: Testen, ob das Abo gültig ist.
                if (String.Equals(productReceipt.productID, FMC_InAppPurchasing.subscription01, StringComparison.Ordinal) ||
                    String.Equals(productReceipt.productID, FMC_InAppPurchasing.subscription02, StringComparison.Ordinal))
                {
                    allExpirationDates.Add(productReceipt.subscriptionExpirationDate);
                    //if (!JF_Utility.isExpired(productReceipt.subscriptionExpirationDate))
                    //{
                    //    FMC_GameDataController.instance.setSubscriptionToActive();
                    //    FMC_GameDataController.instance.saveNewExpirationDate(productReceipt.subscriptionExpirationDate);
                    //}
                }
            }
        }
        else
        {
            refreshAppleReceipt();
        }

        if (allExpirationDates.Count > 0)
        {
            DateTime longestExpirationDate = allExpirationDates[0];
            for (int i = 0; i < allExpirationDates.Count; i++)
            {
                FMC_GameDataController.instance.writeToReceiptLog("Sled: Test for longest expiration Date.");
                if (JF_Utility.getExpirationTime(allExpirationDates[i]) > JF_Utility.getExpirationTime(longestExpirationDate))
                {
                    longestExpirationDate = allExpirationDates[i];
                }
            }
            FMC_GameDataController.instance.setSubscriptionToActive();
            FMC_GameDataController.instance.saveNewExpirationDate(longestExpirationDate);
        }
#endif
    }
        public override void UpdatedTransactions(SKPaymentQueue queue, SKPaymentTransaction[] transactions)
        {
            foreach (var transaction in transactions)
            {
                //NOTE: you have to call "Finish" on every state
                if (transaction.TransactionState != SKPaymentTransactionState.Purchasing)
                {
                    SKPaymentQueue.DefaultQueue.FinishTransaction(transaction);
                }

                TaskCompletionSource <Receipt> source;
                if (Sources.TryGetValue(transaction.Payment.ProductIdentifier, out source))
                {
                    switch (transaction.TransactionState)
                    {
                    case SKPaymentTransactionState.Failed:
                        source.TrySetException(new Exception(transaction.Error?.LocalizedDescription ?? "Unknown Error"));
                        break;

                    case SKPaymentTransactionState.Purchased:
                    case SKPaymentTransactionState.Restored:

                        //First make sure the receipt exists
                        var url = NSBundle.MainBundle.AppStoreReceiptUrl;
                        if (!NSFileManager.DefaultManager.FileExists(url.Path))
                        {
                            source.TrySetException(new Exception("No app store receipt file found!"));
                            return;
                        }

                        //If the NSData is null
                        var data = NSData.FromUrl(url);
                        if (data == null)
                        {
                            source.TrySetException(new Exception("Could not load app store receipt!"));
                            return;
                        }

                        var receipt = new AppleReceipt
                        {
                            BundleId      = NSBundle.MainBundle.BundleIdentifier,
                            Id            = transaction.Payment.ProductIdentifier,
                            TransactionId = transaction.TransactionIdentifier,
                            Data          = data.ToArray(),
                        };
                        source.TrySetResult(receipt);
                        break;

                    default:
                        break;
                    }
                }
            }
        }
        internal AppleReceipt getAppleReceiptFromBase64String(string receipt)
        {
            AppleReceipt appleReceipt = null;

            if (!string.IsNullOrEmpty(receipt))
            {
                var parser = new AppleReceiptParser();
                try {
                    appleReceipt = parser.Parse(Convert.FromBase64String(receipt));
                } catch (Exception) {
                }
            }
            return(appleReceipt);
        }
        public AppleReceipt GetReceipt(string receiptData)
        {
            var          url    = _configuration["InAppPurshase:VerifyReceiptUrl"];
            AppleReceipt result = null;

            string post = PostRequest(url, ConvertReceiptToPost(receiptData));

            if (!string.IsNullOrEmpty(post))
            {
                try { result = new AppleReceipt(post); }
                catch (InvalidDataException e) { throw e; }
                catch (Exception) { result = null; }
            }

            return(result);
        }
Esempio n. 9
0
    public void checkIfSubscriptionIsActive()
    {
#if UNITY_IPHONE
        var builder     = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());
        var appleConfig = builder.Configure <IAppleConfiguration>();
        if (!string.IsNullOrEmpty(appleConfig.appReceipt))
        {
            var receiptData            = System.Convert.FromBase64String(appleConfig.appReceipt);
            AppleReceiptParser parser  = new AppleReceiptParser();
            AppleReceipt       receipt = parser.Parse(receiptData);
            //AppleReceipt receipt = new AppleReceiptParser.Parse(receiptData);

            FMC_GameDataController.instance.writeToReceiptLog("Check if Sub is active: Original Version: " + receipt.originalApplicationVersion);
            FMC_GameDataController.instance.writeToReceiptLog("Check if Sub is active: Bundle id: " + receipt.bundleID);
            FMC_GameDataController.instance.writeToReceiptLog("Check if Sub is active: Creation Date: " + receipt.receiptCreationDate);
            foreach (AppleInAppPurchaseReceipt productReceipt in receipt.inAppPurchaseReceipts)
            {
                FMC_GameDataController.instance.writeToReceiptLog("Check if Sub is active: Transaction ID: " + productReceipt.transactionID);
                FMC_GameDataController.instance.writeToReceiptLog("Check if Sub is active: Product ID: " + productReceipt.productID);
                FMC_GameDataController.instance.writeToReceiptLog("Check if Sub is active: Sub Expiration Date: " + productReceipt.subscriptionExpirationDate);

                // Wenn eine der IDs im Receipt mit einer der Abo-IDs übereinstimmt: Testen, ob das Abo gültig ist.
                if (String.Equals(productReceipt.productID, FMC_InAppPurchasing.subscription01, StringComparison.Ordinal) ||
                    String.Equals(productReceipt.productID, FMC_InAppPurchasing.subscription02, StringComparison.Ordinal))
                {
                    //TimeSpan utcOffset = DateTime.Now - DateTime.UtcNow;
                    //DateTime newDateToCheck = productReceipt.subscriptionExpirationDate + utcOffset;
                    //TimeSpan timeToExpiry = productReceipt.subscriptionExpirationDate - DateTime.UtcNow;
                    //Debug.Log("---------------------------- Time to expiry: " + timeToExpiry);
                    //if (timeToExpiry.TotalSeconds > 0)
                    //    return true;

                    if (!JF_Utility.isExpired(productReceipt.subscriptionExpirationDate))
                    {
                        FMC_GameDataController.instance.setSubscriptionToActive();
                        FMC_GameDataController.instance.saveNewExpirationDate(productReceipt.subscriptionExpirationDate);
                    }
                }
            }
            // Wenn keine übereinstimmende ID in den Product Receipts gefunden wurde: Subscription nicht aktiv.
        }
        else
        {
            refreshAppleReceipt();
        }
#endif
    }
        public override void OnProductsRetrieved(string json)
        {
            // base.OnProductsRetrieved (json); // Don't call this, because we want to enrich the products first

            // get product list
            var productDescriptions = JSONSerializer.DeserializeProductDescriptions(json);
            List <ProductDescription> finalProductDescriptions = null;

            this.products_json = json;

            // parse app receipt
            if (m_Native != null)
            {
                var base64AppReceipt = m_Native.appReceipt;
                if (!string.IsNullOrEmpty(base64AppReceipt))
                {
                    AppleReceipt appleReceipt = getAppleReceiptFromBase64String(base64AppReceipt);
                    if (appleReceipt != null &&
                        appleReceipt.inAppPurchaseReceipts != null &&
                        appleReceipt.inAppPurchaseReceipts.Length > 0)
                    {
                        // Enrich the product descriptions with parsed receipt data
                        finalProductDescriptions = new List <ProductDescription> ();
                        foreach (var productDescription in productDescriptions)
                        {
                            // JDRjr this Find may not be sufficient for subsciptions (or even multiple non-consumables?)
                            var foundReceipts = Array.FindAll(appleReceipt.inAppPurchaseReceipts, (r) => r.productID == productDescription.storeSpecificId);
                            if (foundReceipts == null || foundReceipts.Length == 0)
                            {
                                finalProductDescriptions.Add(productDescription);
                            }
                            else
                            {
                                Array.Sort(foundReceipts, (b, a) => (a.purchaseDate.CompareTo(b.purchaseDate)));
                                var mostRecentReceipt = foundReceipts[0];
                                var productType       = (AppleStoreProductType)Enum.Parse(typeof(AppleStoreProductType), mostRecentReceipt.productType.ToString());
                                if (productType == AppleStoreProductType.AutoRenewingSubscription)
                                {
                                    // if the product is auto-renewing subscription, filter the expired products
                                    if (new SubscriptionInfo(mostRecentReceipt, null).isExpired() == Result.True)
                                    {
                                        finalProductDescriptions.Add(productDescription);
                                    }
                                    else
                                    {
                                        finalProductDescriptions.Add(
                                            new ProductDescription(
                                                productDescription.storeSpecificId,
                                                productDescription.metadata,
                                                base64AppReceipt,
                                                mostRecentReceipt.transactionID));
                                    }
                                }
                                else if (productType == AppleStoreProductType.Consumable)
                                {
                                    finalProductDescriptions.Add(productDescription);
                                }
                                else
                                {
                                    finalProductDescriptions.Add(
                                        new ProductDescription(
                                            productDescription.storeSpecificId,
                                            productDescription.metadata,
                                            base64AppReceipt,
                                            mostRecentReceipt.transactionID));
                                }
                            }
                        }
                    }
                }
            }

            // Pass along the enriched product descriptions
            unity.OnProductsRetrieved(finalProductDescriptions ?? productDescriptions);

            // Set up IAP promo product list (since we bypassed the JSON store here)
            Promo.ProvideProductsToAds(this, unity, shouldLogPromoInitialization);
            shouldLogPromoInitialization = false;

            // If there is a promotional purchase callback, tell the store to intercept those purchases.
            if (m_PromotionalPurchaseCallback != null)
            {
                m_Native.InterceptPromotionalPurchases();
            }

            // Indicate we are ready to start receiving payments.
            m_Native.AddTransactionObserver();
        }
 public bool IsReceiptValid(AppleReceipt receipt)
 {
     return(receipt != null && receipt.Status == 0);
 }
Esempio n. 12
0
 public Task <AppleResult> VerifyApple(AppleReceipt receipt)
 {
     return(Task.FromResult(new AppleResult()));
 }
Esempio n. 13
0
 PurchaseReceipt IOrdersCommand.RecordOrder(Guid ownerId, Order order, Purchaser purchaser, AppleReceipt receipt)
 {
     return(RecordOrder(ownerId, order, purchaser, receipt));
 }
Esempio n. 14
0
        private PurchaseReceipt RecordOrder(Guid ownerId, Order order, Purchaser purchaser, AppleReceipt receipt)
        {
            // Save the order.

            order.OwnerId     = ownerId;
            order.PurchaserId = purchaser.Id;
            _repository.CreateOrder(order);

            // Save the receipt.

            receipt.Prepare();
            receipt.Validate();
            _repository.CreateReceipt(order.Id, receipt);

            // Allocate the credits.

            var products = (from i in order.Items select _productsQuery.GetProduct(i.ProductId)).ToList();

            foreach (var product in products)
            {
                AllocateCredits(order.OwnerId, product, order.Id);
            }

            // Fire events.

            var handlers = OrderPurchased;

            if (handlers != null)
            {
                handlers(this, new OrderPurchasedEventArgs(order, receipt));
            }

            return(receipt);
        }