Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions src/Axepta.SDK/Entities/Response/Notification.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
namespace Axepta.SDK;

public sealed record Notification
{
[JsonPropertyName("payment")]
public required Payment Payment { get; init; }
}
49 changes: 49 additions & 0 deletions src/Axepta.SDK/Entities/Response/NotificationPayment.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
namespace Axepta.SDK;

public sealed record NotificationPayment
{
[JsonPropertyName("id")]
public required Guid Id { get; init; }

[JsonPropertyName("title")]
public required string Title { get; init; }

[JsonPropertyName("amount")]
public required int Amount { get; init; }

[JsonPropertyName("status")]
public required string Status { get; init; }

[JsonPropertyName("created")]
public required int Created { get; init; }

[JsonPropertyName("orderId")]
public required string OrderId { get; init; }

[JsonPropertyName("currency")]
public required string Currency { get; init; }

[JsonPropertyName("modified")]
public required int Modified { get; init; }

[JsonPropertyName("serviceId")]
public required Guid ServiceId { get; init; }

[JsonPropertyName("notificationUrl")]
public required string NotificationUrl { get; init; }

[JsonPropertyName("amountPaid")]
public required int AmountPaid { get; init; }

[JsonPropertyName("amountRefunded")]
public required int AmountRefunded { get; init; }

[JsonPropertyName("amountSubmittedRefund")]
public required int AmountSubmittedRefund { get; init; }

[JsonPropertyName("transactions")]
public required IReadOnlyList<Transaction> Transactions { get; init; }

[JsonPropertyName("notifyTransactionData")]
public required NotificationTransactionData NotifyTransactionData { get; init; }
}
46 changes: 46 additions & 0 deletions src/Axepta.SDK/Entities/Response/NotificationTransaction.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
namespace Axepta.SDK;

public sealed record NotificationTransaction
{
[JsonPropertyName("id")]
public required Guid Id { get; init; }

[JsonPropertyName("type")]
public required string Type { get; init; }

[JsonPropertyName("status")]
public required string Status { get; init; }

[JsonPropertyName("source")]
public required string Source { get; init; }

[JsonPropertyName("created")]
public required int Created { get; init; }

[JsonPropertyName("modified")]
public required int Modified { get; init; }

[JsonPropertyName("notificationUrl")]
public required string NotificationUrl { get; init; }

[JsonPropertyName("serviceId")]
public required Guid ServiceId { get; init; }

[JsonPropertyName("amount")]
public required int Amount { get; init; }

[JsonPropertyName("currency")]
public required string Currency { get; init; }

[JsonPropertyName("title")]
public required string Title { get; init; }

[JsonPropertyName("orderId")]
public required string OrderId { get; init; }

[JsonPropertyName("paymentMethod")]
public required PaymentMethod PaymentMethod { get; init; }

[JsonPropertyName("paymentMethodCode")]
public required string PaymentMethodCode { get; init; }
}
10 changes: 10 additions & 0 deletions src/Axepta.SDK/Entities/Response/NotificationTransactionData.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
namespace Axepta.SDK;

public sealed record NotificationTransactionData
{
[JsonPropertyName("id")]
public required Guid Id { get; init; }

[JsonPropertyName("type")]
public required string Type { get; init; }
}
40 changes: 20 additions & 20 deletions src/Axepta.SDK/Entities/Response/PaymentResponse.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,62 +3,62 @@ namespace Axepta.SDK;
public sealed record PaymentResponse
{
[JsonPropertyName("id")]
public required string Id { get; set; }
public required string Id { get; init; }

[JsonPropertyName("url")]
public string? Url { get; set; }
public string? Url { get; init; }

[JsonPropertyName("serviceId")]
public Guid? ServiceId { get; set; }
public Guid? ServiceId { get; init; }

[JsonPropertyName("orderId")]
public string? OrderId { get; set; }
public string? OrderId { get; init; }

[JsonPropertyName("amount")]
public string? Amount { get; set; }
public string? Amount { get; init; }

[JsonPropertyName("amountPaid")]
public int? AmountPaid { get; set; }
public int? AmountPaid { get; init; }

[JsonPropertyName("amountRefunded")]
public int? AmountRefunded { get; set; }
public int? AmountRefunded { get; init; }

[JsonPropertyName("amountSubmittedRefund")]
public int? AmountSubmittedRefund { get; set; }
public int? AmountSubmittedRefund { get; init; }

[JsonPropertyName("currency")]
public string? Currency { get; set; }
public string? Currency { get; init; }

[JsonPropertyName("status")]
public required OrderStatus Status { get; set; }
public required OrderStatus Status { get; init; }

[JsonPropertyName("isActive")]
public bool? IsActive { get; set; }
public bool? IsActive { get; init; }

[JsonPropertyName("createdAt")]
public int? CreatedAt { get; set; }
public int? CreatedAt { get; init; }

[JsonPropertyName("modifiedAt")]
public int? ModifiedAt { get; set; }
public int? ModifiedAt { get; init; }

[JsonPropertyName("isGenerated")]
public bool? IsGenerated { get; set; }
public bool? IsGenerated { get; init; }

[JsonPropertyName("isUsed")]
public bool? IsUsed { get; set; }
public bool? IsUsed { get; init; }

[JsonPropertyName("isConfirmVisited")]
public bool? IsConfirmVisited { get; set; }
public bool? IsConfirmVisited { get; init; }

[JsonPropertyName("returnUrl")]
public string? ReturnUrl { get; set; }
public string? ReturnUrl { get; init; }

[JsonPropertyName("failureReturnUrl")]
public string? FailureReturnUrl { get; set; }
public string? FailureReturnUrl { get; init; }

[JsonPropertyName("successReturnUrl")]
public string? SuccessReturnUrl { get; set; }
public string? SuccessReturnUrl { get; init; }

[JsonPropertyName("customer")]
public Customer? Customer { get; set; }
public Customer? Customer { get; init; }
}
4 changes: 2 additions & 2 deletions src/Axepta.SDK/Entities/Response/ResponseRoot.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ namespace Axepta.SDK;
public sealed class ResponseRoot
{
[JsonPropertyName("status")]
public required string Status { get; set; }
public required string Status { get; init; }

[JsonPropertyName("data")]
public required Data Data { get; set; }
public required Data Data { get; init; }
}
2 changes: 2 additions & 0 deletions src/Axepta.SDK/Extensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@ IConfiguration cfg
)
);

services.AddScoped<IAxeptaSignatureValidator, AxeptaSignatureValidator>();

return services;
}

Expand Down
10 changes: 10 additions & 0 deletions src/Axepta.SDK/Services/Abstractions/IAxeptaSignatureValidator.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
namespace Axepta.SDK;

internal interface IAxeptaSignatureValidator
{
bool IsValidSignature(
string signature,
string body,
string alg
);
}
28 changes: 28 additions & 0 deletions src/Axepta.SDK/Services/AxeptaSignatureValidator.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
namespace Axepta.SDK;

internal sealed class AxeptaSignatureValidator : IAxeptaSignatureValidator
{
public bool IsValidSignature(
string incomingSignature,
string body,
string alg
)
{
if (alg is "sha256")
{
using var sha256Hash = SHA256.Create();

var bytes = sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(body));
var builder = new StringBuilder();

for (var i = 0; i < bytes.Length; i++)
builder.Append(bytes[i].ToString("x2"));

var signature = builder.ToString();

return signature == incomingSignature;
}

return false;
}
}
1 change: 1 addition & 0 deletions src/Axepta.SDK/Usings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
global using System.Text.Json;
global using System.Text;
global using System.Text.Json.Serialization;
global using System.Security.Cryptography;
global using System.ComponentModel.DataAnnotations;
global using Microsoft.Extensions.DependencyInjection;
global using Microsoft.Extensions.Configuration;
Expand Down
29 changes: 29 additions & 0 deletions tests/Axepta.SDK.Tests/AxeptaSignatureValidatorTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
namespace Axepta.SDK.Tests;

public sealed class AxeptaSignatureValidatorTests
{
private const string BODY = "";
private const string INCOMING_SIGNATURE = "";
private const string SHA256_ALG = "sha256";

[Fact]
public void IsValidSignature_WithCorrectSha256Signature_ReturnsTrue()
{

}

[Fact]
public void IsValidSignature_WithIncorrectSha256Signature_ReturnsFalse()
{
}

[Theory]
[InlineData("sha1")]
[InlineData("md5")]
[InlineData("")]
[InlineData(null)]
public void IsValidSignature_WithUnsupportedAlgorithm_ReturnsFalse(string alg)
{

}
}