diff --git a/MidrandBooksApi/Payments/Payfast/PayfastConfirmationEndpoint.cs b/MidrandBooksApi/Payments/Payfast/PayfastConfirmationEndpoint.cs index 65ed3c2..18cbf5c 100644 --- a/MidrandBooksApi/Payments/Payfast/PayfastConfirmationEndpoint.cs +++ b/MidrandBooksApi/Payments/Payfast/PayfastConfirmationEndpoint.cs @@ -16,7 +16,8 @@ public sealed class PayfastConfirmationEndpoint : IEndpoint public void Map(IEndpointRouteBuilder builder) { builder.MapPost("payments/payfast/confirm", async (HttpRequest request, PayfastService payfastService, - IJobOrchestrator jobOrchestrator, IConfiguration configuration, IHostEnvironment hostEnvironment, CancellationToken cancellationToken) => + IJobOrchestrator jobOrchestrator, IConfiguration configuration, IHostEnvironment hostEnvironment, + ILogger logger, CancellationToken cancellationToken) => { using Activity? activity = PaymentActivitySource.StartActivity("ReceivePayfastWebhook", ActivityKind.Server); @@ -39,7 +40,11 @@ public sealed class PayfastConfirmationEndpoint : IEndpoint var signatureCheck = PayfastService.GenerateSignature(paramDictionary, passphrase); if (signatureCheck.IsFailed || !string.Equals(signatureCheck.Value, incomingSignature, StringComparison.OrdinalIgnoreCase)) + { + logger.LogCritical("Incoming sugnature failed validation: {signature}, {errors}", incomingSignature, signatureCheck.Errors.Select(e => e.Message).ToList()); + return Results.Unauthorized(); + } var formPairs = formCollection.Select(kvp => $"{kvp.Key}={HttpUtility.UrlEncode(kvp.Value.ToString())}"); @@ -50,7 +55,11 @@ public sealed class PayfastConfirmationEndpoint : IEndpoint var serverConfirmation = await payfastService.ValidateServerConfirmationAsync(rawQueryParamString, isSandbox, cancellationToken); if (serverConfirmation.IsFailed || !serverConfirmation.Value) + { + logger.LogCritical("Server confirmation failed: {rawstring}, {errors}", rawQueryParamString, serverConfirmation.Errors.Select(e => e.Message).ToList()); + return Results.Unauthorized(); + } var notification = PayfastPaymentConfirmationReceivedEvent.Create(payload, payload.MerchantPaymentId!, allowLoopback: !hostEnvironment.IsProduction(), performBackgroundChecks: false); diff --git a/midrandbooksapi-uat.yml b/midrandbooksapi-uat.yml index f56f389..dfdb1be 100644 --- a/midrandbooksapi-uat.yml +++ b/midrandbooksapi-uat.yml @@ -161,8 +161,8 @@ spec: httpGet: path: /health port: 8080 - initialDelaySeconds: 5 - periodSeconds: 10 + initialDelaySeconds: 10 + periodSeconds: 15 readinessProbe: httpGet: path: /health