diff --git a/BTCPayServer/Controllers/UILNURLController.cs b/BTCPayServer/Controllers/UILNURLController.cs
index 4269fb988..8739ccecc 100644
--- a/BTCPayServer/Controllers/UILNURLController.cs
+++ b/BTCPayServer/Controllers/UILNURLController.cs
@@ -265,8 +265,11 @@ namespace BTCPayServer
break;
}
+ var escapedItemId = Extensions.UnescapeBackSlashUriString(itemCode);
var item = items.FirstOrDefault(item1 =>
- item1.Id.Equals(itemCode, StringComparison.InvariantCultureIgnoreCase));
+ item1.Id.Equals(itemCode, StringComparison.InvariantCultureIgnoreCase) ||
+ item1.Id.Equals(escapedItemId, StringComparison.InvariantCultureIgnoreCase));
+
if (item is null ||
item.Inventory <= 0 ||
(item.PaymentMethods?.Any() is true &&
diff --git a/BTCPayServer/Extensions.cs b/BTCPayServer/Extensions.cs
index d451979b6..8789ca0be 100644
--- a/BTCPayServer/Extensions.cs
+++ b/BTCPayServer/Extensions.cs
@@ -36,6 +36,20 @@ namespace BTCPayServer
{
public static class Extensions
{
+ ///
+ /// Unescape Uri string for %2F
+ /// See details at: https://github.com/dotnet/aspnetcore/issues/14170#issuecomment-533342396
+ ///
+ /// The Uri string.
+ /// Unescaped back slash Uri string.
+ public static string UnescapeBackSlashUriString(string uriString)
+ {
+ if (uriString == null)
+ {
+ return null;
+ }
+ return uriString.Replace("%2f", "%2F").Replace("%2F", "/");
+ }
public static bool IsValidEmail(this string email)
{
if (string.IsNullOrEmpty(email))