diff --git a/src/Plugin.InAppBilling.Abstractions/BaseInAppBilling.cs b/src/Plugin.InAppBilling.Abstractions/BaseInAppBilling.cs index 49c2382..15b1c9e 100644 --- a/src/Plugin.InAppBilling.Abstractions/BaseInAppBilling.cs +++ b/src/Plugin.InAppBilling.Abstractions/BaseInAppBilling.cs @@ -108,5 +108,9 @@ public virtual void Dispose(bool disposing) disposed = true; } } - } + + public virtual Task FinishTransaction(InAppBillingPurchase purchase) => Task.FromResult(true); + + public virtual Task FinishTransaction(string purchaseId) => Task.FromResult(true); + } } diff --git a/src/Plugin.InAppBilling.Abstractions/IInAppBilling.cs b/src/Plugin.InAppBilling.Abstractions/IInAppBilling.cs index cffc49c..a4de9b4 100644 --- a/src/Plugin.InAppBilling.Abstractions/IInAppBilling.cs +++ b/src/Plugin.InAppBilling.Abstractions/IInAppBilling.cs @@ -75,5 +75,10 @@ public interface IInAppBilling : IDisposable /// If consumed successful /// If an error occures during processing Task ConsumePurchaseAsync(string productId, ItemType itemType, string payload, IInAppBillingVerifyPurchase verifyPurchase = null); - } + + Task FinishTransaction(InAppBillingPurchase purchase); + + Task FinishTransaction(string purchaseId); + + } } diff --git a/src/Plugin.InAppBilling.iOS/InAppBillingImplementation.cs b/src/Plugin.InAppBilling.iOS/InAppBillingImplementation.cs index 41a7c02..c496a79 100644 --- a/src/Plugin.InAppBilling.iOS/InAppBillingImplementation.cs +++ b/src/Plugin.InAppBilling.iOS/InAppBillingImplementation.cs @@ -90,7 +90,7 @@ Task> GetProductAsync(string[] productId) /// - /// Get all current purhcase for a specifiy product type. + /// Get all current purchase for a specifiy product type. /// /// Type of product /// Interface to verify purchase @@ -310,6 +310,28 @@ Task PurchaseAsync(string productId) public override Task ConsumePurchaseAsync(string productId, ItemType itemType, string payload, IInAppBillingVerifyPurchase verifyPurchase = null) => null; + public override Task FinishTransaction(InAppBillingPurchase purchase) => + FinishTransaction(purchase?.Id); + + public override async Task FinishTransaction(string purchaseId) + { + if (string.IsNullOrWhiteSpace(purchaseId)) + throw new ArgumentException("PurchaseId must be valid", nameof(purchaseId)); + + var purchases = await RestoreAsync(); + + if (purchases == null) + return false; + + var transaction = purchases.Where(p => p.TransactionIdentifier == purchaseId).FirstOrDefault(); + if (transaction == null) + return false; + + SKPaymentQueue.DefaultQueue.FinishTransaction(transaction); + + return true; + } + PaymentObserver paymentObserver; static DateTime NSDateToDateTimeUtc(NSDate date)