Fix: Default payment method should not return a disabled one

This commit is contained in:
nicolas.dorier
2019-01-31 22:03:28 +09:00
parent 07d0b98a23
commit 585efa3ff5
3 changed files with 42 additions and 29 deletions

View File

@@ -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)

View File

@@ -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();

View File

@@ -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";