/// <summary> /// Consume a purchase with a purchase token. /// </summary> /// <param name="productId">Id or Sku of product</param> /// <param name="purchaseToken">Original Purchase Token</param> /// <returns>If consumed successful</returns> /// <exception cref="InAppBillingPurchaseException">If an error occures during processing</exception> public async override Task <InAppBillingPurchase> ConsumePurchaseAsync(string productId, string purchaseToken) { var result = await CurrentAppMock.ReportConsumableFulfillmentAsync(InTestingMode, productId, new Guid(purchaseToken)); switch (result) { case FulfillmentResult.ServerError: throw new InAppBillingPurchaseException(PurchaseError.AppStoreUnavailable); case FulfillmentResult.NothingToFulfill: throw new InAppBillingPurchaseException(PurchaseError.ItemUnavailable); case FulfillmentResult.PurchasePending: case FulfillmentResult.PurchaseReverted: throw new InAppBillingPurchaseException(PurchaseError.GeneralError); case FulfillmentResult.Succeeded: return(new InAppBillingPurchase { Id = purchaseToken, AutoRenewing = false, Payload = string.Empty, PurchaseToken = purchaseToken, ProductId = productId, State = PurchaseState.Purchased, TransactionDateUtc = DateTime.UtcNow }); default: return(null); } }
/// <summary> /// Consume a purchase with a purchase token. /// </summary> /// <param name="productId">Id or Sku of product</param> /// <param name="transactionIdentifier">Original Purchase Token</param> /// <returns>If consumed successful</returns> /// <exception cref="InAppBillingPurchaseException">If an error occures during processing</exception> public async override Task <bool> ConsumePurchaseAsync(string productId, string transactionIdentifier) { var result = await CurrentAppMock.ReportConsumableFulfillmentAsync(InTestingMode, productId, new Guid(transactionIdentifier)); return(result switch { FulfillmentResult.ServerError => throw new InAppBillingPurchaseException(PurchaseError.AppStoreUnavailable), FulfillmentResult.NothingToFulfill => throw new InAppBillingPurchaseException(PurchaseError.ItemUnavailable), FulfillmentResult.PurchasePending or FulfillmentResult.PurchaseReverted => throw new InAppBillingPurchaseException(PurchaseError.GeneralError), FulfillmentResult.Succeeded => true, _ => false, });
/// <summary> /// Consume a purchase /// </summary> /// <param name="productId">Id/Sku of the product</param> /// <param name="payload">Developer specific payload of original purchase</param> /// <param name="itemType">Type of product being consumed.</param> /// <param name="verifyPurchase">Verify Purchase implementation</param> /// <returns>If consumed successful</returns> /// <exception cref="InAppBillingPurchaseException">If an error occures during processing</exception> public async override Task <InAppBillingPurchase> ConsumePurchaseAsync(string productId, ItemType itemType, string payload, IInAppBillingVerifyPurchase verifyPurchase = null) { var items = await CurrentAppMock.GetAvailableConsumables(InTestingMode); var consumable = items.FirstOrDefault(i => i.ProductId == productId); if (consumable == null) { throw new InAppBillingPurchaseException(PurchaseError.ItemUnavailable); } var result = await CurrentAppMock.ReportConsumableFulfillmentAsync(InTestingMode, productId, consumable.TransactionId); switch (result) { case FulfillmentResult.ServerError: throw new InAppBillingPurchaseException(PurchaseError.GeneralError); case FulfillmentResult.NothingToFulfill: throw new InAppBillingPurchaseException(PurchaseError.ItemUnavailable); case FulfillmentResult.PurchasePending: case FulfillmentResult.PurchaseReverted: throw new InAppBillingPurchaseException(PurchaseError.GeneralError); case FulfillmentResult.Succeeded: return(new InAppBillingPurchase { AutoRenewing = false, Id = consumable.TransactionId.ToString(), Payload = payload, ProductId = consumable.ProductId, PurchaseToken = consumable.TransactionId.ToString(), State = PurchaseState.Purchased, TransactionDateUtc = DateTime.UtcNow }); default: return(null); } }
/// <summary> /// Consume a purchase with a purchase token. /// </summary> /// <param name="productId">Id or Sku of product</param> /// <param name="purchaseToken">Original Purchase Token</param> /// <returns>If consumed successful</returns> /// <exception cref="InAppBillingPurchaseException">If an error occures during processing</exception> public async override Task <bool> ConsumePurchaseAsync(string productId, string purchaseToken) { var result = await CurrentAppMock.ReportConsumableFulfillmentAsync(InTestingMode, productId, new Guid(purchaseToken)); switch (result) { case FulfillmentResult.ServerError: throw new InAppBillingPurchaseException(PurchaseError.AppStoreUnavailable); case FulfillmentResult.NothingToFulfill: throw new InAppBillingPurchaseException(PurchaseError.ItemUnavailable); case FulfillmentResult.PurchasePending: case FulfillmentResult.PurchaseReverted: throw new InAppBillingPurchaseException(PurchaseError.GeneralError); case FulfillmentResult.Succeeded: return(true); default: return(false); } }