Skip to content

Commit

Permalink
Update consumepurchaseasync and finish to take in purchase id and als…
Browse files Browse the repository at this point in the history
…o the ids not to finish automatically.
  • Loading branch information
jamesmontemagno committed Mar 7, 2022
1 parent a2b3d56 commit cd325bb
Show file tree
Hide file tree
Showing 5 changed files with 38 additions and 30 deletions.
2 changes: 1 addition & 1 deletion src/Plugin.InAppBilling/InAppBilling.android.cs
Original file line number Diff line number Diff line change
Expand Up @@ -402,7 +402,7 @@ public async override Task<bool> AcknowledgePurchaseAsync(string purchaseToken)
/// <param name="productId">Id or Sku of product</param>
/// <param name="purchaseToken">Original Purchase Token</param>
/// <returns>If consumed successful</returns>
public override async Task<bool> ConsumePurchaseAsync(string productId, string purchaseToken)
public override async Task<bool> ConsumePurchaseAsync(string productId, string purchaseToken, string purchaseId, List<string> doNotFinishProductIds = null)
{
if (BillingClient == null || !IsConnected)
{
Expand Down
23 changes: 12 additions & 11 deletions src/Plugin.InAppBilling/InAppBilling.apple.cs
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,7 @@ public async override Task<IEnumerable<InAppBillingPurchase>> GetPurchasesAsync(



Task<SKPaymentTransaction[]> RestoreAsync(List<string> doNotFinishTransactionIds = null)
Task<SKPaymentTransaction[]> RestoreAsync(List<string> doNotFinishTransactionIds)
{
var tcsTransaction = new TaskCompletionSource<SKPaymentTransaction[]>();

Expand Down Expand Up @@ -415,37 +415,38 @@ public override string ReceiptData
/// </summary>
/// <param name="productId">Id or Sku of product</param>
/// <param name="purchaseToken">Original Purchase Token</param>
/// <param name="purchaseId">Original transaction id</param>
/// <returns>If consumed successful</returns>
/// <exception cref="InAppBillingPurchaseException">If an error occurs during processing</exception>
public override Task<bool> ConsumePurchaseAsync(string productId, string purchaseToken) =>
FinishTransaction(purchaseToken);
public override Task<bool> ConsumePurchaseAsync(string productId, string purchaseToken, string purchaseId, List<string> doNotFinishProductIds = null) =>
FinishTransaction(purchaseId, doNotFinishProductIds);


/// <summary>
/// Manually finish a transaction
/// </summary>
/// <param name="purchase"></param>
/// <returns></returns>
public override Task<bool> FinishTransaction(InAppBillingPurchase purchase) =>
FinishTransaction(purchase?.Id);
public override Task<bool> FinishTransaction(InAppBillingPurchase purchase, List<string> doNotFinishProductIds = null) =>
FinishTransaction(purchase?.Id, doNotFinishProductIds);

/// <summary>
/// Finish a transaction manually
/// </summary>
/// <param name="purchaseToken"></param>
/// <param name="purchaseId"></param>
/// <returns></returns>
/// <exception cref="ArgumentException"></exception>
public override async Task<bool> FinishTransaction(string purchaseToken)
public override async Task<bool> FinishTransaction(string purchaseId, List<string> doNotFinishProductIds = null)
{
if (string.IsNullOrWhiteSpace(purchaseToken))
throw new ArgumentException("Purchase Token must be valid", nameof(purchaseToken));
if (string.IsNullOrWhiteSpace(purchaseId))
throw new ArgumentException("Purchase Token must be valid", nameof(purchaseId));

var purchases = await RestoreAsync();
var purchases = await RestoreAsync(doNotFinishProductIds);

if (purchases == null)
return false;

var transaction = purchases.Where(p => p.TransactionIdentifier == purchaseToken).FirstOrDefault();
var transaction = purchases.Where(p => p.TransactionIdentifier == purchaseId).FirstOrDefault();
if (transaction == null)
return false;

Expand Down
2 changes: 1 addition & 1 deletion src/Plugin.InAppBilling/InAppBilling.uwp.cs
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ public async override Task<InAppBillingPurchase> PurchaseAsync(string productId,
/// <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)
public async override Task<bool> ConsumePurchaseAsync(string productId, string purchaseToken, string purchaseId, List<string> doNotFinishProductIds = null)
{
var result = await CurrentAppMock.ReportConsumableFulfillmentAsync(InTestingMode, productId, new Guid(purchaseToken));
return result switch
Expand Down
17 changes: 10 additions & 7 deletions src/Plugin.InAppBilling/Shared/BaseInAppBilling.shared.cs
Original file line number Diff line number Diff line change
Expand Up @@ -56,9 +56,9 @@ public abstract class BaseInAppBilling : IInAppBilling, IDisposable
/// Get all current purchases for a specific product type. If verification fails for some purchase, it's not contained in the result.
/// </summary>
/// <param name="itemType">Type of product</param>
/// <param name="doNotFinishTransactionIds">List of ids not to finish (iOS only)</param>
/// <param name="doNotFinishProductIds">List of ids not to finish (iOS only)</param>
/// <returns>The current purchases</returns>
public abstract Task<IEnumerable<InAppBillingPurchase>> GetPurchasesAsync(ItemType itemType, List<string> doNotFinishTransactionIds = null);
public abstract Task<IEnumerable<InAppBillingPurchase>> GetPurchasesAsync(ItemType itemType, List<string> doNotFinishProductIds = null);



Expand Down Expand Up @@ -93,11 +93,12 @@ public abstract class BaseInAppBilling : IInAppBilling, IDisposable
/// <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>
/// <param name="purchaseId">Original transaction id</param>
/// <param name="doNotFinishProductIds">List of ids not to finish (iOS only)</param>
/// <returns>If consumed successful</returns>
/// <exception cref="InAppBillingPurchaseException">If an error occurs during processing</exception>
public abstract Task<bool> ConsumePurchaseAsync(string productId, string purchaseToken);
public abstract Task<bool> ConsumePurchaseAsync(string productId, string purchaseToken, string purchaseId, List<string> doNotFinishProductIds = null);

/// <summary>
/// Dispose of class and parent classes
Expand Down Expand Up @@ -138,15 +139,17 @@ public virtual void Dispose(bool disposing)
/// Manually finish a transaction
/// </summary>
/// <param name="purchase"></param>
/// <param name="doNotFinishProductIds">List of ids not to finish (iOS only)</param>
/// <returns></returns>
public virtual Task<bool> FinishTransaction(InAppBillingPurchase purchase) => Task.FromResult(true);
public virtual Task<bool> FinishTransaction(InAppBillingPurchase purchase, List<string> doNotFinishProductIds = null) => Task.FromResult(true);

/// <summary>
/// manually finish a transaction
/// </summary>
/// <param name="purchaseToken"></param>
/// <param name="purchaseId">Original transaction id</param>
/// <param name="doNotFinishProductIds">List of ids not to finish (iOS only)</param>
/// <returns></returns>
public virtual Task<bool> FinishTransaction(string purchaseToken) => Task.FromResult(true);
public virtual Task<bool> FinishTransaction(string purchaseId, List<string> doNotFinishProductIds = null) => Task.FromResult(true);

/// <summary>
/// acknowledge a purchase
Expand Down
24 changes: 14 additions & 10 deletions src/Plugin.InAppBilling/Shared/IInAppBilling.shared.cs
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,9 @@ public interface IInAppBilling : IDisposable
/// Get all current purchases for a specific product type. If you use verification and it fails for some purchase, it's not contained in the result.
/// </summary>
/// <param name="itemType">Type of product</param>
/// <param name="doNotFinishTransactionIds"></param>
/// <param name="doNotFinishProductIds">All of Ids of products that you do not want to auto finish (iOS consumables)</param>
/// <returns>The current purchases</returns>
Task<IEnumerable<InAppBillingPurchase>> GetPurchasesAsync(ItemType itemType, List<string> doNotFinishTransactionIds = null);
Task<IEnumerable<InAppBillingPurchase>> GetPurchasesAsync(ItemType itemType, List<string> doNotFinishProductIds = null);


/// <summary>
Expand Down Expand Up @@ -88,25 +88,29 @@ public interface IInAppBilling : IDisposable
/// <summary>
/// Consume a purchase with a purchase token.
/// </summary>
/// <param name="productId">Id or Sku of product</param>
/// <param name="productId">Product id or sku</param>
/// <param name="purchaseToken">Original Purchase Token</param>
/// <returns>If consumed successful</returns>
/// <param name="purchaseId">Original Transaction Id</param>
/// <param name="doNotFinishProductIds">All of Ids of products that you do not want to auto finish (iOS consumables)</param>
/// <returns>If consumed successful</returns>
/// <exception cref="InAppBillingPurchaseException">If an error occurs during processing</exception>
Task<bool> ConsumePurchaseAsync(string productId, string purchaseToken);
Task<bool> ConsumePurchaseAsync(string productId, string purchaseToken, string purchaseId, List<string> doNotFinishProductIds = null);

/// <summary>
/// Manually finish a transaction
/// </summary>
/// <param name="purchase"></param>
/// <returns></returns>
Task<bool> FinishTransaction(InAppBillingPurchase purchase);
/// <param name="doNotFinishProductIds">All of Ids of products that you do not want to auto finish (iOS consumables)</param>
/// <returns></returns>
Task<bool> FinishTransaction(InAppBillingPurchase purchase, List<string> doNotFinishProductIds = null);

/// <summary>
/// Manually finish a transaction
/// </summary>
/// <param name="purchaseToken"></param>
/// <returns></returns>
Task<bool> FinishTransaction(string purchaseToken);
/// <param name="purchaseId">Original transaction id</param>
/// <param name="doNotFinishProductIds">All of Ids of products that you do not want to auto finish (iOS consumables)</param>
/// <returns></returns>
Task<bool> FinishTransaction(string purchaseId, List<string> doNotFinishProductIds = null);

/// <summary>
/// Get receipt data on iOS
Expand Down

0 comments on commit cd325bb

Please sign in to comment.