diff --git a/CHANGELOG.md b/CHANGELOG.md index 0a4e2b8..947e2ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,11 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## [Unreleased] +### Changed +- Reduce calls to VBase +- Improve logging of VBase calls +- Retry GetPaymentData VBase calls + ## [1.22.1] - 2024-06-25 ### Fixed diff --git a/dotnet/Controlers/RoutesController.cs b/dotnet/Controlers/RoutesController.cs index ed848eb..d6b5eb4 100644 --- a/dotnet/Controlers/RoutesController.cs +++ b/dotnet/Controlers/RoutesController.cs @@ -93,7 +93,7 @@ public async Task CreatePayment() { //(createPaymentResponse, paymentsResponse) = await this._cybersourcePaymentService.CreatePayment(createPaymentRequest); var createPaymentTask = this._cybersourcePaymentService.CreatePayment(createPaymentRequest); - var winner = await Task.WhenAny(createPaymentTask, DelayedDummyResultTask<(CreatePaymentResponse, PaymentsResponse)>(TimeSpan.FromSeconds(25))); + var winner = await Task.WhenAny(createPaymentTask, DelayedDummyResultTask<(CreatePaymentResponse, PaymentsResponse)>(TimeSpan.FromSeconds(20))); if (winner == createPaymentTask) { //_context.Vtex.Logger.Debug("CreatePayment", "Timeout", $"Processed {createPaymentRequest.PaymentId} in time!"); diff --git a/dotnet/Data/CybersourceConstants.cs b/dotnet/Data/CybersourceConstants.cs index 53b561a..7c8c346 100644 --- a/dotnet/Data/CybersourceConstants.cs +++ b/dotnet/Data/CybersourceConstants.cs @@ -36,6 +36,7 @@ public class CybersourceConstants public const string CACHE_BUCKET = "tax-cache"; public const string SIGNATURE_ENCODING = "base64"; public const string SIGNATURE_KEY_FORMAT = "base64"; + public const string TOO_MANY_REQUESTS = "TooManyRequests"; public const string PAYMENTS = "/pts/v2/"; public const string RISK = "/risk/v1/"; diff --git a/dotnet/Data/CybersourceRepository.cs b/dotnet/Data/CybersourceRepository.cs index 70a2b5f..1e790ca 100644 --- a/dotnet/Data/CybersourceRepository.cs +++ b/dotnet/Data/CybersourceRepository.cs @@ -93,7 +93,12 @@ public async Task GetPaymentData(string paymentIdentifier) null, true); if (sendResponse.StatusCode == HttpStatusCode.NotFound.ToString()) { - _context.Vtex.Logger.Warn("GetPaymentData", null, $"Payment Id '{paymentIdentifier}' Not Found."); + _context.Vtex.Logger.Debug("GetPaymentData", null, $"Payment Id '{paymentIdentifier}' Not Found."); + return null; + } + else if (!sendResponse.Success) + { + _context.Vtex.Logger.Error("GetPaymentData", null, $"Could not retrieve Payment Id '{paymentIdentifier}' [{sendResponse.StatusCode}] "); return null; } @@ -114,7 +119,7 @@ public async Task GetPaymentData(string paymentIdentifier) return paymentData; } - public async Task SavePaymentData(string paymentIdentifier, PaymentData paymentData) + public async Task SavePaymentData(string paymentIdentifier, PaymentData paymentData, int retryNumber = 0) { if (paymentData == null) { @@ -128,7 +133,7 @@ public async Task SavePaymentData(string paymentIdentifier, PaymentData paymentD jsonSerializedCreatePaymentRequest); if (!sendResponse.Success) { - _context.Vtex.Logger.Error("SavePaymentData", null, $"Failed", + _context.Vtex.Logger.Error("SavePaymentData", null, $"({retryNumber}) Failed", null, new[] { @@ -137,6 +142,12 @@ public async Task SavePaymentData(string paymentIdentifier, PaymentData paymentD ( "paymentIdentifier", paymentIdentifier ), ( "paymentData", JsonConvert.SerializeObject(paymentData) ) }); + + if (sendResponse.StatusCode.Equals(CybersourceConstants.TOO_MANY_REQUESTS) && retryNumber < 5) + { + await Task.Delay(retryNumber * 100); + await this.SavePaymentData(paymentIdentifier, paymentData, ++retryNumber); + } } } diff --git a/dotnet/Data/ICybersourceRepository.cs b/dotnet/Data/ICybersourceRepository.cs index 5995754..d9fba71 100644 --- a/dotnet/Data/ICybersourceRepository.cs +++ b/dotnet/Data/ICybersourceRepository.cs @@ -9,7 +9,7 @@ public interface ICybersourceRepository Task SetMerchantSettings(MerchantSettings merchantSettings); Task GetPaymentData(string paymentIdentifier); - Task SavePaymentData(string paymentIdentifier, PaymentData paymentData); + Task SavePaymentData(string paymentIdentifier, PaymentData paymentData, int retryNumber = 0); Task GetCreatePaymentRequest(string id); Task SaveCreatePaymentRequest(string id, CreatePaymentRequest createPaymentRequest); diff --git a/dotnet/Services/CybersourcePaymentService.cs b/dotnet/Services/CybersourcePaymentService.cs index 39c1f88..3fd347b 100644 --- a/dotnet/Services/CybersourcePaymentService.cs +++ b/dotnet/Services/CybersourcePaymentService.cs @@ -671,7 +671,7 @@ public async Task BuildPayment(CreatePaymentRequest createPaymentReque { // Setting the TimedOut flag to true so that any follow up requests will check for previous captures paymentData.TimedOut = true; - await _cybersourceRepository.SavePaymentData(paymentData.PaymentId, paymentData); + // await _cybersourceRepository.SavePaymentData(paymentData.PaymentId, paymentData); } bool isPayerAuth = false; @@ -787,7 +787,10 @@ public async Task BuildPayment(CreatePaymentRequest createPaymentReque paymentData.Value = capturedAmount; } - await _cybersourceRepository.SavePaymentData(createPaymentRequest.PaymentId, paymentData); + if (!createPaymentResponse.Equals(CybersourceConstants.VtexAuthStatus.Denied)) + { + await _cybersourceRepository.SavePaymentData(createPaymentRequest.PaymentId, paymentData); + } } if (doCancel)