|
|
@@ -74,24 +74,45 @@ func (s *StripeBillingManager) CheckPaymentEnabled(proj *models.Project) (paymen
|
|
|
func (s *StripeBillingManager) ListPaymentMethod(proj *models.Project) (paymentMethods []types.PaymentMethod, err error) {
|
|
|
stripe.Key = s.StripeSecretKey
|
|
|
|
|
|
+ // Get configured payment methods
|
|
|
params := &stripe.PaymentMethodListParams{
|
|
|
Customer: stripe.String(proj.BillingID),
|
|
|
Type: stripe.String(string(stripe.PaymentMethodTypeCard)),
|
|
|
}
|
|
|
result := paymentmethod.List(params)
|
|
|
|
|
|
+ defaultPaymentExists, defaultPaymentID, err := s.checkDefaultPaymentMethod(proj.BillingID)
|
|
|
+ if err != nil {
|
|
|
+ return paymentMethods, err
|
|
|
+ }
|
|
|
+
|
|
|
for result.Next() {
|
|
|
stripePaymentMethod := result.PaymentMethod()
|
|
|
|
|
|
+ var isDefaultPaymentMethod bool
|
|
|
+ if stripePaymentMethod.ID == defaultPaymentID {
|
|
|
+ isDefaultPaymentMethod = true
|
|
|
+ }
|
|
|
+
|
|
|
paymentMethods = append(paymentMethods, types.PaymentMethod{
|
|
|
ID: stripePaymentMethod.ID,
|
|
|
DisplayBrand: stripePaymentMethod.Card.DisplayBrand,
|
|
|
Last4: stripePaymentMethod.Card.Last4,
|
|
|
ExpMonth: stripePaymentMethod.Card.ExpMonth,
|
|
|
ExpYear: stripePaymentMethod.Card.ExpYear,
|
|
|
+ Default: isDefaultPaymentMethod,
|
|
|
})
|
|
|
}
|
|
|
|
|
|
+ // Set default payment method when project has payment methods enabled but
|
|
|
+ // no default setup
|
|
|
+ if len(paymentMethods) > 0 && !defaultPaymentExists {
|
|
|
+ err = s.SetDefaultPaymentMethod(paymentMethods[len(paymentMethods)-1].ID, proj)
|
|
|
+ if err != nil {
|
|
|
+ return paymentMethods, err
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
return paymentMethods, nil
|
|
|
}
|
|
|
|
|
|
@@ -115,6 +136,24 @@ func (s *StripeBillingManager) CreatePaymentMethod(proj *models.Project) (client
|
|
|
return intent.ClientSecret, nil
|
|
|
}
|
|
|
|
|
|
+// SetDefaultPaymentMethod will add a new payment method to the project in Stripe
|
|
|
+func (s *StripeBillingManager) SetDefaultPaymentMethod(paymentMethodID string, proj *models.Project) (err error) {
|
|
|
+ stripe.Key = s.StripeSecretKey
|
|
|
+
|
|
|
+ params := &stripe.CustomerParams{
|
|
|
+ InvoiceSettings: &stripe.CustomerInvoiceSettingsParams{
|
|
|
+ DefaultPaymentMethod: stripe.String(paymentMethodID),
|
|
|
+ },
|
|
|
+ }
|
|
|
+
|
|
|
+ _, err = customer.Update(proj.BillingID, params)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
// DeletePaymentMethod will remove a payment method for the project in Stripe
|
|
|
func (s *StripeBillingManager) DeletePaymentMethod(paymentMethodID string) (err error) {
|
|
|
stripe.Key = s.StripeSecretKey
|
|
|
@@ -131,3 +170,18 @@ func (s *StripeBillingManager) DeletePaymentMethod(paymentMethodID string) (err
|
|
|
func (s *StripeBillingManager) GetPublishableKey() (key string) {
|
|
|
return s.StripePublishableKey
|
|
|
}
|
|
|
+
|
|
|
+func (s *StripeBillingManager) checkDefaultPaymentMethod(customerID string) (defaultPaymentExists bool, defaultPaymentID string, err error) {
|
|
|
+ // Get customer to check default payment method
|
|
|
+ customer, err := customer.Get(customerID, nil)
|
|
|
+ if err != nil {
|
|
|
+ return defaultPaymentExists, defaultPaymentID, err
|
|
|
+ }
|
|
|
+
|
|
|
+ if customer.InvoiceSettings != nil && customer.InvoiceSettings.DefaultPaymentMethod != nil {
|
|
|
+ defaultPaymentExists = true
|
|
|
+ defaultPaymentID = customer.InvoiceSettings.DefaultPaymentMethod.ID
|
|
|
+ }
|
|
|
+
|
|
|
+ return defaultPaymentExists, defaultPaymentID, err
|
|
|
+}
|