From d76f6de15e13144b7b01248acb795a2ed02b4fde Mon Sep 17 00:00:00 2001 From: huyufei Date: Mon, 8 Apr 2024 22:59:23 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20IAP=20=E5=90=AF?= =?UTF-8?q?=E5=8A=A8=E6=8A=A5=E9=94=99=20BUG,=20=E4=BF=AE=E5=A4=8D=20?= =?UTF-8?q?=E5=8F=96=E5=80=BC=E4=B8=BA=E7=A9=BA=E7=9A=84=20BUG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Runtime/GuruIAP/Runtime/Code/IAPModel.cs | 54 ++++++++++++------- .../GuruIAP/Runtime/Code/IAPServiceBase.cs | 49 ++++++++++------- .../Runtime/Code/Settings/ProductInfo.cs | 25 +++++---- 3 files changed, 78 insertions(+), 50 deletions(-) diff --git a/Runtime/GuruIAP/Runtime/Code/IAPModel.cs b/Runtime/GuruIAP/Runtime/Code/IAPModel.cs index b8cbb94..1be7382 100644 --- a/Runtime/GuruIAP/Runtime/Code/IAPModel.cs +++ b/Runtime/GuruIAP/Runtime/Code/IAPModel.cs @@ -10,6 +10,7 @@ namespace Guru public class IAPModel { public static readonly float SaveInterval = 3; + public static readonly int MaxReceiptCount = 30; public static readonly string PlatformAndroid = "android"; public static readonly string PlatformIOS = "ios"; @@ -20,8 +21,6 @@ namespace Guru public List googleOrders; public List appleOrders; - - /// /// 是否还有未上报的 Google Order /// @@ -33,11 +32,12 @@ namespace Guru public bool HasUnreportedAppleOrder => (appleOrders?.Count ?? 0) > 0; + #region Initialize public IAPModel() { - androidTokens = new List(20); - iosReceipts = new List(20); + androidTokens = new List(MaxReceiptCount); + iosReceipts = new List(MaxReceiptCount); googleOrders = new List(20); appleOrders = new List(20); } @@ -72,35 +72,45 @@ namespace Guru PlayerPrefs.SetString(nameof(IAPModel), json); } + #endregion - #region Receipt + #region Google Token + /// + /// 添加 Google 的收据数据 + /// + /// public void AddToken(string token) { - if (androidTokens == null) androidTokens = new List(20); + if (androidTokens == null) androidTokens = new List(MaxReceiptCount); if(string.IsNullOrEmpty(token)) return; + if(androidTokens.Count >= MaxReceiptCount) androidTokens.RemoveAt(0); androidTokens.Add(token); Save(); } - /// - /// 添加收据 - /// - /// - /// - public void AddReceipt(string receipt) - { - if (iosReceipts == null) iosReceipts = new List(20); - if(string.IsNullOrEmpty(receipt)) return; - iosReceipts.Add(receipt); - Save(); - } - public bool IsTokenExists(string token) { if (androidTokens == null) return false; return androidTokens.Contains(token); } + #endregion + + #region iOS Receipt + /// + /// 添加收据 + /// + /// + public void AddReceipt(string receipt) + { + if (iosReceipts == null) iosReceipts = new List(MaxReceiptCount); + if(string.IsNullOrEmpty(receipt)) return; + if(iosReceipts.Count >= MaxReceiptCount) iosReceipts.RemoveAt(0); + iosReceipts.Add(receipt); + Save(); + } + + public bool IsReceiptExist(string receipt) { @@ -110,7 +120,7 @@ namespace Guru #endregion - #region Orders + #region Google Orders public void AddGoogleOrder(GoogleOrderData order) { @@ -153,6 +163,10 @@ namespace Guru Save(); } + #endregion + + #region Apple Orders + public void AddAppleOrder(AppleOrderData order) { if (HasAppleOrder(order)) return; diff --git a/Runtime/GuruIAP/Runtime/Code/IAPServiceBase.cs b/Runtime/GuruIAP/Runtime/Code/IAPServiceBase.cs index 5edcf53..77aa8a4 100644 --- a/Runtime/GuruIAP/Runtime/Code/IAPServiceBase.cs +++ b/Runtime/GuruIAP/Runtime/Code/IAPServiceBase.cs @@ -195,7 +195,7 @@ namespace Guru // 建立本地的商品信息列表 if (string.IsNullOrEmpty(item.Category)) item.Category = DefaultCategory; - _products[item.ProductId] = new ProductInfo() { Setting = item }; + _products[item.ProductId] = new ProductInfo(item); } } // 调用插件初始化 @@ -864,17 +864,25 @@ namespace Guru #if UNITY_ANDROID if (_model.HasUnreportedGoogleOrder) { - foreach (var o in _model.googleOrders) + int i = 0; + while (_model.googleOrders.Count > 0 + && i < _model.googleOrders.Count) { + var o = _model.googleOrders[i]; ReportGoogleOrder(o); + i++; } } #elif UNITY_IOS if (_model.HasUnreportedAppleOrder) { - foreach (var o in _model.appleOrders) + int i = 0; + while (_model.appleOrders.Count > 0 + && i < _model.appleOrders.Count) { + var o = _model.appleOrders[i]; ReportAppleOrder(o); + i++; } } #endif @@ -927,6 +935,7 @@ namespace Guru private void ReportNextOrder(RequestBase request) { + if(_orderRequests == null) _orderRequests = new Queue(20); _orderRequests.Enqueue(request); if(isOrderSending) return; @@ -943,11 +952,12 @@ namespace Guru { if (_orderRequests != null && _orderRequests.Count > 0) { + // 如果上报队列不为空, 则尝试上报 isOrderSending = true; var request = _orderRequests.Dequeue(); - if (request == null) { + // 跳过空请求 OnSendNextOrder(); return; } @@ -959,51 +969,50 @@ namespace Guru { if (_model.IsTokenExists(go.token)) { - OnSendNextOrder(); + OnSendNextOrder(); // 跳过上报过的 Google 订单 return; } - _model.AddGoogleOrder(go.orderData); // 尝试缓存 order + _model.AddGoogleOrder(go.orderData); // 缓存当前 orderData 等待上报后再消除 } - - if( ao != null) + else if( ao != null) { if (_model.IsReceiptExist(ao.receipt)) { - OnSendNextOrder(); + OnSendNextOrder(); // 跳过上报过的 Apple 订单 return; } - _model.AddAppleOrder(ao.orderData); // 尝试缓存 order + _model.AddAppleOrder(ao.orderData); // 缓存当前 orderData 等待上报后再消除 } request.SetTimeOut(OrderRequestTimeout) .SetRetryTimes(OrderRequestRetryTimes) .SetSuccessCallBack(() => { + //---------------- Success ------------------------ if (go != null) { - _model.AddToken(go.token); - _model.RemoveGoogleOrder(go.orderData); + _model.AddToken(go.token); // 记录当前的 Google 订单 + _model.RemoveGoogleOrder(go.orderData); // 成功后清除缓存 orderData } else if (ao != null) { - _model.AddReceipt(ao.receipt); - _model.RemoveAppleOrder(ao.orderData); + _model.AddReceipt(ao.receipt); // 记录当前的 Apple 订单 + _model.RemoveAppleOrder(ao.orderData); // 成功后清除缓存 orderData } - - OnSendNextOrder(); + OnSendNextOrder(); // NEXT Order }) .SetFailCallBack(() => { + //---------------- Fail ------------------------ if (go != null) { - ReportGoogleOrderLost(go.orderData); + ReportGoogleOrderLost(go.orderData); // 上报 Google 订单缺失打点 } else if (ao != null) { - ReportAppleOrderLost(ao.orderData); + ReportAppleOrderLost(ao.orderData); // 上报 Apple 订单缺失打点 } - - OnSendNextOrder(); + OnSendNextOrder(); // NEXT Order }) .Send(); } diff --git a/Runtime/GuruIAP/Runtime/Code/Settings/ProductInfo.cs b/Runtime/GuruIAP/Runtime/Code/Settings/ProductInfo.cs index c556be1..d3d0c75 100644 --- a/Runtime/GuruIAP/Runtime/Code/Settings/ProductInfo.cs +++ b/Runtime/GuruIAP/Runtime/Code/Settings/ProductInfo.cs @@ -64,19 +64,24 @@ namespace Guru public partial class ProductInfo { private Product _product; - public ProductSetting Setting; + private ProductSetting _setting; + public ProductSetting Setting => _setting; public Product Product => _product; + public ProductInfo(ProductSetting setting) + { + _setting = setting; + } + public void SetProduct(Product product) => _product = product; - - public string Name => Setting.ProductName; - public string Id => Product.definition.id; - public double Price => (double?)Product?.metadata?.localizedPrice ?? Setting.Price; - public string CurrencyCode => Product?.metadata?.isoCurrencyCode ?? "$"; - public string Category => Setting.Category; - public string Type => Setting.Type == ProductType.Subscription ? "subscription" : "product"; - public bool IsFree => Setting.IsFree; - public string LocalizedPriceString => Product?.metadata.localizedPriceString ?? $"{CurrencyCode}{Setting.Price}"; + public string Name => _setting.ProductName; + public string Id => _product?.definition?.id ?? _setting.ProductId; + public double Price => (double?)_product?.metadata?.localizedPrice ?? _setting.Price; + public string CurrencyCode => _product?.metadata?.isoCurrencyCode ?? "$"; + public string Category => _setting.Category; + public string Type => _setting.Type == ProductType.Subscription ? "subscription" : "product"; + public bool IsFree => _setting.IsFree; + public string LocalizedPriceString => _product?.metadata?.localizedPriceString ?? $"{CurrencyCode}{_setting.Price}"; } } \ No newline at end of file