diff --git a/BTCPayServer/Controllers/StoresController.cs b/BTCPayServer/Controllers/StoresController.cs index 0dee1e638..357264fd7 100644 --- a/BTCPayServer/Controllers/StoresController.cs +++ b/BTCPayServer/Controllers/StoresController.cs @@ -331,7 +331,7 @@ namespace BTCPayServer.Controllers { var storeBlob = StoreData.GetStoreBlob(); var vm = new CheckoutExperienceViewModel(); - vm.SetCryptoCurrencies(_NetworkProvider, StoreData, StoreData.GetDefaultPaymentId(_NetworkProvider)); + SetCryptoCurrencies(vm, StoreData); vm.SetLanguages(_LangService, storeBlob.DefaultLang); vm.LightningMaxValue = storeBlob.LightningMaxValue?.ToString() ?? ""; vm.OnChainMinValue = storeBlob.OnChainMinValue?.ToString() ?? ""; @@ -341,6 +341,23 @@ namespace BTCPayServer.Controllers vm.HtmlTitle = storeBlob.HtmlTitle; return View(vm); } + void SetCryptoCurrencies(CheckoutExperienceViewModel vm, Data.StoreData storeData) + { + var choices = storeData.GetEnabledPaymentIds(_NetworkProvider) + .Select(o => new CheckoutExperienceViewModel.Format() { Name = GetDisplayName(o), Value = o.ToString(), PaymentId = o }).ToArray(); + + var defaultPaymentId = storeData.GetDefaultPaymentId(_NetworkProvider); + var chosen = choices.FirstOrDefault(c => c.PaymentId == defaultPaymentId); + vm.CryptoCurrencies = new SelectList(choices, nameof(chosen.Value), nameof(chosen.Name), chosen?.Value); + vm.DefaultPaymentMethod = chosen?.Value; + } + + private string GetDisplayName(PaymentMethodId paymentMethodId) + { + var display = _NetworkProvider.GetNetwork(paymentMethodId.CryptoCode)?.DisplayName ?? paymentMethodId.CryptoCode; + return paymentMethodId.PaymentType == PaymentTypes.BTCLike ? + display : $"{display} (Lightning)"; + } [HttpPost] [Route("{storeId}/checkout")] @@ -371,7 +388,7 @@ namespace BTCPayServer.Controllers needUpdate = true; StoreData.SetDefaultPaymentId(defaultPaymentMethodId); } - model.SetCryptoCurrencies(_NetworkProvider, StoreData, defaultPaymentMethodId); + SetCryptoCurrencies(model, StoreData); model.SetLanguages(_LangService, model.DefaultLang); if (!ModelState.IsValid) diff --git a/BTCPayServer/Data/StoreData.cs b/BTCPayServer/Data/StoreData.cs index 76160f58c..0232eafa0 100644 --- a/BTCPayServer/Data/StoreData.cs +++ b/BTCPayServer/Data/StoreData.cs @@ -56,7 +56,6 @@ namespace BTCPayServer.Data get; set; } - public IEnumerable GetSupportedPaymentMethods(BTCPayNetworkProvider networks) { #pragma warning disable CS0618 @@ -204,11 +203,29 @@ namespace BTCPayServer.Data public List AdditionalClaims { get; set; } = new List(); #pragma warning disable CS0618 - public PaymentMethodId GetDefaultPaymentId(BTCPayNetworkProvider networkProvider = null) + public PaymentMethodId GetDefaultPaymentId(BTCPayNetworkProvider networks) { - var str = DefaultCrypto ?? (networkProvider == null ? "BTC" : GetSupportedPaymentMethods(networkProvider).Select(p => p.PaymentId.ToString()).FirstOrDefault() ?? "BTC"); - return PaymentMethodId.Parse(str); + PaymentMethodId[] paymentMethodIds = GetEnabledPaymentIds(networks); + + var defaultPaymentId = string.IsNullOrEmpty(DefaultCrypto) ? null : PaymentMethodId.Parse(DefaultCrypto); + var chosen = paymentMethodIds.FirstOrDefault(f => f == defaultPaymentId) ?? + paymentMethodIds.FirstOrDefault(f => f.CryptoCode == defaultPaymentId?.CryptoCode) ?? + paymentMethodIds.FirstOrDefault(); + return chosen; } + + public PaymentMethodId[] GetEnabledPaymentIds(BTCPayNetworkProvider networks) + { + var excludeFilter = GetStoreBlob().GetExcludedPaymentMethods(); + var paymentMethodIds = GetSupportedPaymentMethods(networks).Select(p => p.PaymentId) + .Where(a => !excludeFilter.Match(a)) + .OrderByDescending(a => a.CryptoCode == "BTC") + .ThenBy(a => a.CryptoCode) + .ThenBy(a => a.PaymentType == PaymentTypes.LightningLike ? 1 : 0) + .ToArray(); + return paymentMethodIds; + } + public void SetDefaultPaymentId(PaymentMethodId defaultPaymentId) { DefaultCrypto = defaultPaymentId.ToString(); diff --git a/BTCPayServer/Models/StoreViewModels/CheckoutExperienceViewModel.cs b/BTCPayServer/Models/StoreViewModels/CheckoutExperienceViewModel.cs index 91052a983..64680423b 100644 --- a/BTCPayServer/Models/StoreViewModels/CheckoutExperienceViewModel.cs +++ b/BTCPayServer/Models/StoreViewModels/CheckoutExperienceViewModel.cs @@ -12,10 +12,11 @@ namespace BTCPayServer.Models.StoreViewModels { public class CheckoutExperienceViewModel { - class Format + public class Format { public string Name { get; set; } public string Value { get; set; } + public PaymentMethodId PaymentId { get; set; } } public SelectList CryptoCurrencies { get; set; } public SelectList Languages { get; set; } @@ -48,28 +49,6 @@ namespace BTCPayServer.Models.StoreViewModels [Display(Name = "Custom HTML title to display on Checkout page")] public string HtmlTitle { get; set; } - - public void SetCryptoCurrencies(BTCPayNetworkProvider networks, Data.StoreData storeData, PaymentMethodId paymentMethodId) - { - var paymentIds = storeData.GetSupportedPaymentMethods(networks).Select(o => o.PaymentId) - .OrderByDescending(a => a.CryptoCode == "BTC") - .ThenBy(a => a.CryptoCode) - .ThenBy(a => a.PaymentType == PaymentTypes.LightningLike ? 1 : 0); - - - var choices = paymentIds.Select(o => new Format() { Name = GetDisplayName(networks, o), Value = o.ToString() }).ToArray(); - var chosen = choices.FirstOrDefault(f => f.Value == paymentMethodId?.ToString()) ?? choices.FirstOrDefault(); - CryptoCurrencies = new SelectList(choices, nameof(chosen.Value), nameof(chosen.Name), chosen); - DefaultPaymentMethod = chosen.Value; - } - - private string GetDisplayName(BTCPayNetworkProvider networks, PaymentMethodId paymentMethodId) - { - var display = networks.GetNetwork(paymentMethodId.CryptoCode)?.DisplayName ?? paymentMethodId.CryptoCode; - return paymentMethodId.PaymentType == PaymentTypes.BTCLike ? - display : $"{display} (Lightning)"; - } - public void SetLanguages(LanguageService langService, string defaultLang) { defaultLang = langService.GetLanguages().Any(language => language.Code == defaultLang)? defaultLang : "en";