mirror of
https://github.com/bitwarden/server.git
synced 2025-04-16 10:38:17 -05:00
Address merge conflict due to moving code ownership and remove unused code block
This commit is contained in:
parent
270a83cbfa
commit
bb0eb50603
@ -54,7 +54,15 @@ public class AccountsController(
|
|||||||
|
|
||||||
var result = await userService.SignUpPremiumAsync(user, model.PaymentToken,
|
var result = await userService.SignUpPremiumAsync(user, model.PaymentToken,
|
||||||
model.PaymentMethodType!.Value, model.AdditionalStorageGb.GetValueOrDefault(0), license,
|
model.PaymentMethodType!.Value, model.AdditionalStorageGb.GetValueOrDefault(0), license,
|
||||||
new TaxInfo { BillingAddressCountry = model.Country, BillingAddressPostalCode = model.PostalCode });
|
new TaxInfo
|
||||||
|
{
|
||||||
|
BillingAddressCountry = model.Country,
|
||||||
|
BillingAddressPostalCode = model.PostalCode,
|
||||||
|
BillingAddressCity = model.City,
|
||||||
|
BillingAddressLine1 = model.Line1,
|
||||||
|
BillingAddressLine2 = model.Line2,
|
||||||
|
BillingAddressState = model.State
|
||||||
|
});
|
||||||
|
|
||||||
var userTwoFactorEnabled = await userService.TwoFactorIsEnabledAsync(user);
|
var userTwoFactorEnabled = await userService.TwoFactorIsEnabledAsync(user);
|
||||||
var userHasPremiumFromOrganization = await userService.HasPremiumFromOrganization(user);
|
var userHasPremiumFromOrganization = await userService.HasPremiumFromOrganization(user);
|
||||||
@ -116,8 +124,7 @@ public class AccountsController(
|
|||||||
BillingAddressCity = model.City,
|
BillingAddressCity = model.City,
|
||||||
BillingAddressState = model.State,
|
BillingAddressState = model.State,
|
||||||
BillingAddressCountry = model.Country,
|
BillingAddressCountry = model.Country,
|
||||||
BillingAddressPostalCode = model.PostalCode,
|
BillingAddressPostalCode = model.PostalCode
|
||||||
TaxIdNumber = model.TaxId
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -569,309 +569,6 @@ public class StripePaymentService : IPaymentService
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<bool> UpdatePaymentMethodAsync(ISubscriber subscriber, PaymentMethodType paymentMethodType,
|
|
||||||
string paymentToken, TaxInfo taxInfo = null)
|
|
||||||
{
|
|
||||||
if (subscriber == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(subscriber));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (subscriber.Gateway.HasValue && subscriber.Gateway.Value != GatewayType.Stripe)
|
|
||||||
{
|
|
||||||
throw new GatewayException("Switching from one payment type to another is not supported. " +
|
|
||||||
"Contact us for assistance.");
|
|
||||||
}
|
|
||||||
|
|
||||||
var createdCustomer = false;
|
|
||||||
Braintree.Customer braintreeCustomer = null;
|
|
||||||
string stipeCustomerSourceToken = null;
|
|
||||||
string stipeCustomerPaymentMethodId = null;
|
|
||||||
var stripeCustomerMetadata = new Dictionary<string, string>
|
|
||||||
{
|
|
||||||
{ "region", _globalSettings.BaseServiceUri.CloudRegion }
|
|
||||||
};
|
|
||||||
var stripePaymentMethod = paymentMethodType is PaymentMethodType.Card or PaymentMethodType.BankAccount;
|
|
||||||
|
|
||||||
Customer customer = null;
|
|
||||||
|
|
||||||
if (!string.IsNullOrWhiteSpace(subscriber.GatewayCustomerId))
|
|
||||||
{
|
|
||||||
var options = new CustomerGetOptions { Expand = ["sources", "tax", "subscriptions"] };
|
|
||||||
customer = await _stripeAdapter.CustomerGetAsync(subscriber.GatewayCustomerId, options);
|
|
||||||
if (customer.Metadata?.Any() ?? false)
|
|
||||||
{
|
|
||||||
stripeCustomerMetadata = customer.Metadata;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var hadBtCustomer = stripeCustomerMetadata.ContainsKey("btCustomerId");
|
|
||||||
if (stripePaymentMethod)
|
|
||||||
{
|
|
||||||
if (paymentToken.StartsWith("pm_"))
|
|
||||||
{
|
|
||||||
stipeCustomerPaymentMethodId = paymentToken;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
stipeCustomerSourceToken = paymentToken;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (paymentMethodType == PaymentMethodType.PayPal)
|
|
||||||
{
|
|
||||||
if (hadBtCustomer)
|
|
||||||
{
|
|
||||||
var pmResult = await _btGateway.PaymentMethod.CreateAsync(new Braintree.PaymentMethodRequest
|
|
||||||
{
|
|
||||||
CustomerId = stripeCustomerMetadata["btCustomerId"],
|
|
||||||
PaymentMethodNonce = paymentToken
|
|
||||||
});
|
|
||||||
|
|
||||||
if (pmResult.IsSuccess())
|
|
||||||
{
|
|
||||||
var customerResult = await _btGateway.Customer.UpdateAsync(
|
|
||||||
stripeCustomerMetadata["btCustomerId"], new Braintree.CustomerRequest
|
|
||||||
{
|
|
||||||
DefaultPaymentMethodToken = pmResult.Target.Token
|
|
||||||
});
|
|
||||||
|
|
||||||
if (customerResult.IsSuccess() && customerResult.Target.PaymentMethods.Length > 0)
|
|
||||||
{
|
|
||||||
braintreeCustomer = customerResult.Target;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
await _btGateway.PaymentMethod.DeleteAsync(pmResult.Target.Token);
|
|
||||||
hadBtCustomer = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
hadBtCustomer = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!hadBtCustomer)
|
|
||||||
{
|
|
||||||
var customerResult = await _btGateway.Customer.CreateAsync(new Braintree.CustomerRequest
|
|
||||||
{
|
|
||||||
PaymentMethodNonce = paymentToken,
|
|
||||||
Email = subscriber.BillingEmailAddress(),
|
|
||||||
Id = subscriber.BraintreeCustomerIdPrefix() + subscriber.Id.ToString("N").ToLower() +
|
|
||||||
Utilities.CoreHelpers.RandomString(3, upper: false, numeric: false),
|
|
||||||
CustomFields = new Dictionary<string, string>
|
|
||||||
{
|
|
||||||
[subscriber.BraintreeIdField()] = subscriber.Id.ToString(),
|
|
||||||
[subscriber.BraintreeCloudRegionField()] = _globalSettings.BaseServiceUri.CloudRegion
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!customerResult.IsSuccess() || customerResult.Target.PaymentMethods.Length == 0)
|
|
||||||
{
|
|
||||||
throw new GatewayException("Failed to create PayPal customer record.");
|
|
||||||
}
|
|
||||||
|
|
||||||
braintreeCustomer = customerResult.Target;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
throw new GatewayException("Payment method is not supported at this time.");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (stripeCustomerMetadata.ContainsKey("btCustomerId"))
|
|
||||||
{
|
|
||||||
if (braintreeCustomer?.Id != stripeCustomerMetadata["btCustomerId"])
|
|
||||||
{
|
|
||||||
stripeCustomerMetadata["btCustomerId_old"] = stripeCustomerMetadata["btCustomerId"];
|
|
||||||
}
|
|
||||||
|
|
||||||
stripeCustomerMetadata["btCustomerId"] = braintreeCustomer?.Id;
|
|
||||||
}
|
|
||||||
else if (!string.IsNullOrWhiteSpace(braintreeCustomer?.Id))
|
|
||||||
{
|
|
||||||
stripeCustomerMetadata.Add("btCustomerId", braintreeCustomer.Id);
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (!string.IsNullOrWhiteSpace(taxInfo.TaxIdNumber))
|
|
||||||
{
|
|
||||||
taxInfo.TaxIdType = taxInfo.TaxIdType ??
|
|
||||||
_taxService.GetStripeTaxCode(taxInfo.BillingAddressCountry, taxInfo.TaxIdNumber);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (customer == null)
|
|
||||||
{
|
|
||||||
customer = await _stripeAdapter.CustomerCreateAsync(new CustomerCreateOptions
|
|
||||||
{
|
|
||||||
Description = subscriber.BillingName(),
|
|
||||||
Email = subscriber.BillingEmailAddress(),
|
|
||||||
Metadata = stripeCustomerMetadata,
|
|
||||||
Source = stipeCustomerSourceToken,
|
|
||||||
PaymentMethod = stipeCustomerPaymentMethodId,
|
|
||||||
InvoiceSettings = new CustomerInvoiceSettingsOptions
|
|
||||||
{
|
|
||||||
DefaultPaymentMethod = stipeCustomerPaymentMethodId,
|
|
||||||
CustomFields =
|
|
||||||
[
|
|
||||||
new CustomerInvoiceSettingsCustomFieldOptions()
|
|
||||||
{
|
|
||||||
Name = subscriber.SubscriberType(),
|
|
||||||
Value = subscriber.GetFormattedInvoiceName()
|
|
||||||
}
|
|
||||||
|
|
||||||
]
|
|
||||||
},
|
|
||||||
Address = taxInfo == null ? null : new AddressOptions
|
|
||||||
{
|
|
||||||
Country = taxInfo.BillingAddressCountry,
|
|
||||||
PostalCode = taxInfo.BillingAddressPostalCode,
|
|
||||||
Line1 = taxInfo.BillingAddressLine1 ?? string.Empty,
|
|
||||||
Line2 = taxInfo.BillingAddressLine2,
|
|
||||||
City = taxInfo.BillingAddressCity,
|
|
||||||
State = taxInfo.BillingAddressState
|
|
||||||
},
|
|
||||||
TaxIdData = string.IsNullOrWhiteSpace(taxInfo.TaxIdNumber)
|
|
||||||
? []
|
|
||||||
: [
|
|
||||||
new CustomerTaxIdDataOptions
|
|
||||||
{
|
|
||||||
Type = taxInfo.TaxIdType,
|
|
||||||
Value = taxInfo.TaxIdNumber
|
|
||||||
}
|
|
||||||
],
|
|
||||||
Expand = ["sources", "tax", "subscriptions"],
|
|
||||||
});
|
|
||||||
|
|
||||||
subscriber.Gateway = GatewayType.Stripe;
|
|
||||||
subscriber.GatewayCustomerId = customer.Id;
|
|
||||||
createdCustomer = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!createdCustomer)
|
|
||||||
{
|
|
||||||
string defaultSourceId = null;
|
|
||||||
string defaultPaymentMethodId = null;
|
|
||||||
if (stripePaymentMethod)
|
|
||||||
{
|
|
||||||
if (!string.IsNullOrWhiteSpace(stipeCustomerSourceToken) && paymentToken.StartsWith("btok_"))
|
|
||||||
{
|
|
||||||
var bankAccount = await _stripeAdapter.BankAccountCreateAsync(customer.Id, new BankAccountCreateOptions
|
|
||||||
{
|
|
||||||
Source = paymentToken
|
|
||||||
});
|
|
||||||
defaultSourceId = bankAccount.Id;
|
|
||||||
}
|
|
||||||
else if (!string.IsNullOrWhiteSpace(stipeCustomerPaymentMethodId))
|
|
||||||
{
|
|
||||||
await _stripeAdapter.PaymentMethodAttachAsync(stipeCustomerPaymentMethodId,
|
|
||||||
new PaymentMethodAttachOptions { Customer = customer.Id });
|
|
||||||
defaultPaymentMethodId = stipeCustomerPaymentMethodId;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (customer.Sources != null)
|
|
||||||
{
|
|
||||||
foreach (var source in customer.Sources.Where(s => s.Id != defaultSourceId))
|
|
||||||
{
|
|
||||||
if (source is BankAccount)
|
|
||||||
{
|
|
||||||
await _stripeAdapter.BankAccountDeleteAsync(customer.Id, source.Id);
|
|
||||||
}
|
|
||||||
else if (source is Card)
|
|
||||||
{
|
|
||||||
await _stripeAdapter.CardDeleteAsync(customer.Id, source.Id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var cardPaymentMethods = _stripeAdapter.PaymentMethodListAutoPaging(new PaymentMethodListOptions
|
|
||||||
{
|
|
||||||
Customer = customer.Id,
|
|
||||||
Type = "card"
|
|
||||||
});
|
|
||||||
foreach (var cardMethod in cardPaymentMethods.Where(m => m.Id != defaultPaymentMethodId))
|
|
||||||
{
|
|
||||||
await _stripeAdapter.PaymentMethodDetachAsync(cardMethod.Id, new PaymentMethodDetachOptions());
|
|
||||||
}
|
|
||||||
|
|
||||||
await _subscriberService.UpdateTaxInformation(subscriber, TaxInformation.From(taxInfo));
|
|
||||||
|
|
||||||
customer = await _stripeAdapter.CustomerUpdateAsync(customer.Id, new CustomerUpdateOptions
|
|
||||||
{
|
|
||||||
Metadata = stripeCustomerMetadata,
|
|
||||||
DefaultSource = defaultSourceId,
|
|
||||||
InvoiceSettings = new CustomerInvoiceSettingsOptions
|
|
||||||
{
|
|
||||||
DefaultPaymentMethod = defaultPaymentMethodId,
|
|
||||||
CustomFields =
|
|
||||||
[
|
|
||||||
new CustomerInvoiceSettingsCustomFieldOptions()
|
|
||||||
{
|
|
||||||
Name = subscriber.SubscriberType(),
|
|
||||||
Value = subscriber.GetFormattedInvoiceName()
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
Expand = ["tax", "subscriptions"]
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_featureService.IsEnabled(FeatureFlagKeys.PM19147_AutomaticTaxImprovements))
|
|
||||||
{
|
|
||||||
if (!string.IsNullOrEmpty(subscriber.GatewaySubscriptionId))
|
|
||||||
{
|
|
||||||
var subscriptionGetOptions = new SubscriptionGetOptions
|
|
||||||
{
|
|
||||||
Expand = ["customer.tax", "customer.tax_ids"]
|
|
||||||
};
|
|
||||||
var subscription = await _stripeAdapter.SubscriptionGetAsync(subscriber.GatewaySubscriptionId, subscriptionGetOptions);
|
|
||||||
|
|
||||||
var automaticTaxParameters = new AutomaticTaxFactoryParameters(subscriber, subscription.Items.Select(x => x.Price.Id));
|
|
||||||
var automaticTaxStrategy = await _automaticTaxFactory.CreateAsync(automaticTaxParameters);
|
|
||||||
var subscriptionUpdateOptions = automaticTaxStrategy.GetUpdateOptions(subscription);
|
|
||||||
|
|
||||||
if (subscriptionUpdateOptions != null)
|
|
||||||
{
|
|
||||||
_ = await _stripeAdapter.SubscriptionUpdateAsync(
|
|
||||||
subscriber.GatewaySubscriptionId,
|
|
||||||
subscriptionUpdateOptions);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (!string.IsNullOrEmpty(subscriber.GatewaySubscriptionId) &&
|
|
||||||
customer.Subscriptions.Any(sub =>
|
|
||||||
sub.Id == subscriber.GatewaySubscriptionId &&
|
|
||||||
!sub.AutomaticTax.Enabled) &&
|
|
||||||
customer.HasTaxLocationVerified())
|
|
||||||
{
|
|
||||||
var subscriptionUpdateOptions = new SubscriptionUpdateOptions
|
|
||||||
{
|
|
||||||
AutomaticTax = new SubscriptionAutomaticTaxOptions { Enabled = true },
|
|
||||||
DefaultTaxRates = []
|
|
||||||
};
|
|
||||||
|
|
||||||
_ = await _stripeAdapter.SubscriptionUpdateAsync(
|
|
||||||
subscriber.GatewaySubscriptionId,
|
|
||||||
subscriptionUpdateOptions);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
if (braintreeCustomer != null && !hadBtCustomer)
|
|
||||||
{
|
|
||||||
await _btGateway.Customer.DeleteAsync(braintreeCustomer.Id);
|
|
||||||
}
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
|
|
||||||
return createdCustomer;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<bool> CreditAccountAsync(ISubscriber subscriber, decimal creditAmount)
|
public async Task<bool> CreditAccountAsync(ISubscriber subscriber, decimal creditAmount)
|
||||||
{
|
{
|
||||||
Customer customer = null;
|
Customer customer = null;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user