mirror of
https://github.com/aljazceru/btcpayserver.git
synced 2025-12-18 22:44:29 +01:00
Fix: Default payment method should not return a disabled one
This commit is contained in:
@@ -331,7 +331,7 @@ namespace BTCPayServer.Controllers
|
|||||||
{
|
{
|
||||||
var storeBlob = StoreData.GetStoreBlob();
|
var storeBlob = StoreData.GetStoreBlob();
|
||||||
var vm = new CheckoutExperienceViewModel();
|
var vm = new CheckoutExperienceViewModel();
|
||||||
vm.SetCryptoCurrencies(_NetworkProvider, StoreData, StoreData.GetDefaultPaymentId(_NetworkProvider));
|
SetCryptoCurrencies(vm, StoreData);
|
||||||
vm.SetLanguages(_LangService, storeBlob.DefaultLang);
|
vm.SetLanguages(_LangService, storeBlob.DefaultLang);
|
||||||
vm.LightningMaxValue = storeBlob.LightningMaxValue?.ToString() ?? "";
|
vm.LightningMaxValue = storeBlob.LightningMaxValue?.ToString() ?? "";
|
||||||
vm.OnChainMinValue = storeBlob.OnChainMinValue?.ToString() ?? "";
|
vm.OnChainMinValue = storeBlob.OnChainMinValue?.ToString() ?? "";
|
||||||
@@ -341,6 +341,23 @@ namespace BTCPayServer.Controllers
|
|||||||
vm.HtmlTitle = storeBlob.HtmlTitle;
|
vm.HtmlTitle = storeBlob.HtmlTitle;
|
||||||
return View(vm);
|
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]
|
[HttpPost]
|
||||||
[Route("{storeId}/checkout")]
|
[Route("{storeId}/checkout")]
|
||||||
@@ -371,7 +388,7 @@ namespace BTCPayServer.Controllers
|
|||||||
needUpdate = true;
|
needUpdate = true;
|
||||||
StoreData.SetDefaultPaymentId(defaultPaymentMethodId);
|
StoreData.SetDefaultPaymentId(defaultPaymentMethodId);
|
||||||
}
|
}
|
||||||
model.SetCryptoCurrencies(_NetworkProvider, StoreData, defaultPaymentMethodId);
|
SetCryptoCurrencies(model, StoreData);
|
||||||
model.SetLanguages(_LangService, model.DefaultLang);
|
model.SetLanguages(_LangService, model.DefaultLang);
|
||||||
|
|
||||||
if (!ModelState.IsValid)
|
if (!ModelState.IsValid)
|
||||||
|
|||||||
@@ -56,7 +56,6 @@ namespace BTCPayServer.Data
|
|||||||
get;
|
get;
|
||||||
set;
|
set;
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<ISupportedPaymentMethod> GetSupportedPaymentMethods(BTCPayNetworkProvider networks)
|
public IEnumerable<ISupportedPaymentMethod> GetSupportedPaymentMethods(BTCPayNetworkProvider networks)
|
||||||
{
|
{
|
||||||
#pragma warning disable CS0618
|
#pragma warning disable CS0618
|
||||||
@@ -204,11 +203,29 @@ namespace BTCPayServer.Data
|
|||||||
public List<Claim> AdditionalClaims { get; set; } = new List<Claim>();
|
public List<Claim> AdditionalClaims { get; set; } = new List<Claim>();
|
||||||
|
|
||||||
#pragma warning disable CS0618
|
#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");
|
PaymentMethodId[] paymentMethodIds = GetEnabledPaymentIds(networks);
|
||||||
return PaymentMethodId.Parse(str);
|
|
||||||
|
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)
|
public void SetDefaultPaymentId(PaymentMethodId defaultPaymentId)
|
||||||
{
|
{
|
||||||
DefaultCrypto = defaultPaymentId.ToString();
|
DefaultCrypto = defaultPaymentId.ToString();
|
||||||
|
|||||||
@@ -12,10 +12,11 @@ namespace BTCPayServer.Models.StoreViewModels
|
|||||||
{
|
{
|
||||||
public class CheckoutExperienceViewModel
|
public class CheckoutExperienceViewModel
|
||||||
{
|
{
|
||||||
class Format
|
public class Format
|
||||||
{
|
{
|
||||||
public string Name { get; set; }
|
public string Name { get; set; }
|
||||||
public string Value { get; set; }
|
public string Value { get; set; }
|
||||||
|
public PaymentMethodId PaymentId { get; set; }
|
||||||
}
|
}
|
||||||
public SelectList CryptoCurrencies { get; set; }
|
public SelectList CryptoCurrencies { get; set; }
|
||||||
public SelectList Languages { 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")]
|
[Display(Name = "Custom HTML title to display on Checkout page")]
|
||||||
public string HtmlTitle { get; set; }
|
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)
|
public void SetLanguages(LanguageService langService, string defaultLang)
|
||||||
{
|
{
|
||||||
defaultLang = langService.GetLanguages().Any(language => language.Code == defaultLang)? defaultLang : "en";
|
defaultLang = langService.GetLanguages().Any(language => language.Code == defaultLang)? defaultLang : "en";
|
||||||
|
|||||||
Reference in New Issue
Block a user