mirror of
https://github.com/bitwarden/server.git
synced 2025-07-01 16:12:49 -05:00
[AC-1938] Update provider payment method (#4140)
* Refactored GET provider subscription Refactoring this endpoint and its associated tests in preparation for the addition of more endpoints that share similar patterns * Replaced StripePaymentService call in AccountsController, OrganizationsController This was made in error during a previous PR. Since this is not related to Consolidated Billing, we want to try not to include it in these changes. * Removing GetPaymentInformation call from ProviderBillingService This method is a good call for the SubscriberService as we'll want to extend the functionality to all subscriber types * Refactored GetTaxInformation to use Billing owned DTO * Add UpdateTaxInformation to SubscriberService * Added GetTaxInformation and UpdateTaxInformation endpoints to ProviderBillingController * Added controller to manage creation of Stripe SetupIntents With the deprecation of the Sources API, we need to move the bank account creation process to using SetupIntents. This controller brings both the creation of "card" and "us_bank_account" SetupIntents under billing management. * Added UpdatePaymentMethod method to SubscriberService This method utilizes the SetupIntents created by the StripeController from the previous commit when a customer adds a card or us_bank_account payment method (Stripe). We need to cache the most recent SetupIntent for the subscriber so that we know which PaymentMethod is their most recent even when it hasn't been confirmed yet. * Refactored GetPaymentMethod to use billing owned DTO and check setup intents * Added GetPaymentMethod and UpdatePaymentMethod endpoints to ProviderBillingController * Re-added GetPaymentInformation endpoint to consolidate API calls on the payment method page * Added VerifyBankAccount endpoint to ProviderBillingController in order to finalize bank account payment methods * Updated BitPayInvoiceRequestModel to support providers * run dotnet format * Conner's feedback * Run dotnet format'
This commit is contained in:
@ -16,6 +16,7 @@ public class StripeAdapter : IStripeAdapter
|
||||
private readonly Stripe.CardService _cardService;
|
||||
private readonly Stripe.BankAccountService _bankAccountService;
|
||||
private readonly Stripe.PriceService _priceService;
|
||||
private readonly Stripe.SetupIntentService _setupIntentService;
|
||||
private readonly Stripe.TestHelpers.TestClockService _testClockService;
|
||||
|
||||
public StripeAdapter()
|
||||
@ -31,6 +32,7 @@ public class StripeAdapter : IStripeAdapter
|
||||
_cardService = new Stripe.CardService();
|
||||
_bankAccountService = new Stripe.BankAccountService();
|
||||
_priceService = new Stripe.PriceService();
|
||||
_setupIntentService = new SetupIntentService();
|
||||
_testClockService = new Stripe.TestHelpers.TestClockService();
|
||||
}
|
||||
|
||||
@ -54,6 +56,13 @@ public class StripeAdapter : IStripeAdapter
|
||||
return _customerService.DeleteAsync(id);
|
||||
}
|
||||
|
||||
public async Task<List<PaymentMethod>> CustomerListPaymentMethods(string id,
|
||||
CustomerListPaymentMethodsOptions options = null)
|
||||
{
|
||||
var paymentMethods = await _customerService.ListPaymentMethodsAsync(id, options);
|
||||
return paymentMethods.Data;
|
||||
}
|
||||
|
||||
public Task<Stripe.Subscription> SubscriptionCreateAsync(Stripe.SubscriptionCreateOptions options)
|
||||
{
|
||||
return _subscriptionService.CreateAsync(options);
|
||||
@ -222,6 +231,25 @@ public class StripeAdapter : IStripeAdapter
|
||||
return await _priceService.ListAsync(options);
|
||||
}
|
||||
|
||||
public Task<SetupIntent> SetupIntentCreate(SetupIntentCreateOptions options)
|
||||
=> _setupIntentService.CreateAsync(options);
|
||||
|
||||
public async Task<List<SetupIntent>> SetupIntentList(SetupIntentListOptions options)
|
||||
{
|
||||
var setupIntents = await _setupIntentService.ListAsync(options);
|
||||
|
||||
return setupIntents.Data;
|
||||
}
|
||||
|
||||
public Task SetupIntentCancel(string id, SetupIntentCancelOptions options = null)
|
||||
=> _setupIntentService.CancelAsync(id, options);
|
||||
|
||||
public Task<SetupIntent> SetupIntentGet(string id, SetupIntentGetOptions options = null)
|
||||
=> _setupIntentService.GetAsync(id, options);
|
||||
|
||||
public Task SetupIntentVerifyMicroDeposit(string id, SetupIntentVerifyMicrodepositsOptions options)
|
||||
=> _setupIntentService.VerifyMicrodepositsAsync(id, options);
|
||||
|
||||
public async Task<List<Stripe.TestHelpers.TestClock>> TestClockListAsync()
|
||||
{
|
||||
var items = new List<Stripe.TestHelpers.TestClock>();
|
||||
|
@ -1651,6 +1651,43 @@ public class StripePaymentService : IPaymentService
|
||||
return subscriptionInfo;
|
||||
}
|
||||
|
||||
public async Task<TaxInfo> GetTaxInfoAsync(ISubscriber subscriber)
|
||||
{
|
||||
if (subscriber == null || string.IsNullOrWhiteSpace(subscriber.GatewayCustomerId))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
var customer = await _stripeAdapter.CustomerGetAsync(subscriber.GatewayCustomerId,
|
||||
new CustomerGetOptions { Expand = ["tax_ids"] });
|
||||
|
||||
if (customer == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
var address = customer.Address;
|
||||
var taxId = customer.TaxIds?.FirstOrDefault();
|
||||
|
||||
// Line1 is required, so if missing we're using the subscriber name
|
||||
// see: https://stripe.com/docs/api/customers/create#create_customer-address-line1
|
||||
if (address != null && string.IsNullOrWhiteSpace(address.Line1))
|
||||
{
|
||||
address.Line1 = null;
|
||||
}
|
||||
|
||||
return new TaxInfo
|
||||
{
|
||||
TaxIdNumber = taxId?.Value,
|
||||
BillingAddressLine1 = address?.Line1,
|
||||
BillingAddressLine2 = address?.Line2,
|
||||
BillingAddressCity = address?.City,
|
||||
BillingAddressState = address?.State,
|
||||
BillingAddressPostalCode = address?.PostalCode,
|
||||
BillingAddressCountry = address?.Country,
|
||||
};
|
||||
}
|
||||
|
||||
public async Task SaveTaxInfoAsync(ISubscriber subscriber, TaxInfo taxInfo)
|
||||
{
|
||||
if (subscriber != null && !string.IsNullOrWhiteSpace(subscriber.GatewayCustomerId))
|
||||
|
Reference in New Issue
Block a user