85 lines
2.8 KiB
C#
85 lines
2.8 KiB
C#
using LiteCharms.Features.Hasher;
|
|
using LiteCharms.Features.Hasher.Configuration;
|
|
using LiteCharms.Features.Models;
|
|
|
|
namespace LiteCharms.Features.Extensions;
|
|
|
|
public static class Hash
|
|
{
|
|
public const string HasherConfigSectionName = "HasherSettings";
|
|
|
|
public static IServiceCollection AddHashServices(this IServiceCollection services, IConfiguration configuration)
|
|
{
|
|
services.Configure<HasherSettings>(configuration.GetSection(HasherConfigSectionName));
|
|
|
|
var settings = configuration.GetSection(HasherConfigSectionName).Get<HasherSettings>();
|
|
|
|
services.AddSingleton<IHashids>(_ =>
|
|
new Hashids(settings!.Salt, minHashLength: settings.MinHashLength));
|
|
|
|
services.AddSingleton<HashService>();
|
|
|
|
return services;
|
|
}
|
|
|
|
public static string ToRawPayfastPayload(this PayfastWebhookPayload input, string passphrase)
|
|
{
|
|
var parameters = new List<string>();
|
|
|
|
if (!string.IsNullOrWhiteSpace(input.Amount))
|
|
parameters.Add($"amount={WebUtility.UrlEncode(input.Amount)}");
|
|
|
|
if (!string.IsNullOrWhiteSpace(input.ItemName))
|
|
parameters.Add($"item_name={WebUtility.UrlEncode(input.ItemName)}");
|
|
|
|
if (!string.IsNullOrWhiteSpace(input.MPaymentId))
|
|
parameters.Add($"m_payment_id={WebUtility.UrlEncode(input.MPaymentId)}");
|
|
|
|
string payload = string.Join("&", parameters);
|
|
|
|
if (!string.IsNullOrWhiteSpace(passphrase))
|
|
payload += $"&passphrase={WebUtility.UrlEncode(passphrase)}";
|
|
|
|
return payload;
|
|
}
|
|
|
|
public static (PayfastWebhookPayload Payload, string Passphrase) FromRawPayfastPayload(this string rawPayload)
|
|
{
|
|
string passphrase = string.Empty;
|
|
var payload = new PayfastWebhookPayload();
|
|
|
|
if (string.IsNullOrWhiteSpace(rawPayload)) return (payload, passphrase);
|
|
|
|
var segments = rawPayload.Split('&', StringSplitOptions.RemoveEmptyEntries);
|
|
|
|
foreach (var segment in segments)
|
|
{
|
|
int delimiterIndex = segment.IndexOf('=');
|
|
if (delimiterIndex == -1)
|
|
continue;
|
|
|
|
string key = segment[..delimiterIndex].Trim();
|
|
string rawValue = segment[(delimiterIndex + 1)..];
|
|
|
|
string decodedValue = WebUtility.UrlDecode(rawValue);
|
|
|
|
switch (key.ToLowerInvariant())
|
|
{
|
|
case "amount":
|
|
payload.Amount = decodedValue;
|
|
break;
|
|
case "item_name":
|
|
payload.ItemName = decodedValue;
|
|
break;
|
|
case "m_payment_id":
|
|
payload.MPaymentId = decodedValue;
|
|
break;
|
|
case "passphrase":
|
|
passphrase = decodedValue;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return (payload, passphrase);
|
|
}
|
|
} |