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); }
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(); }
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); }); }
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)); }
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); }
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); }
public Task <AppleResult> VerifyApple(AppleReceipt receipt) { return(Task.FromResult(new AppleResult())); }
PurchaseReceipt IOrdersCommand.RecordOrder(Guid ownerId, Order order, Purchaser purchaser, AppleReceipt receipt) { return(RecordOrder(ownerId, order, purchaser, receipt)); }
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); }