package billing import ( "encoding/json" "fmt" "log" "git.linuxforward.com/byom/byom-onboard/internal/common/models" "github.com/stripe/stripe-go/v81" "github.com/stripe/stripe-go/v81/paymentintent" "github.com/stripe/stripe-go/v81/webhook" ) type StripeClient struct { secretKey string webhookSecret string } func NewStripeClient(secretKey, webhookSecret string) *StripeClient { stripe.Key = secretKey return &StripeClient{ secretKey: secretKey, webhookSecret: webhookSecret, } } func (s *StripeClient) CreatePaymentIntent(amount int64, currency string, paymentMethodID string) (*models.PaymentIntent, error) { params := &stripe.PaymentIntentParams{ Amount: stripe.Int64(amount), Currency: stripe.String(currency), AutomaticPaymentMethods: &stripe.PaymentIntentAutomaticPaymentMethodsParams{ AllowRedirects: stripe.String("never"), Enabled: stripe.Bool(true), }, } if paymentMethodID != "" { params.PaymentMethod = stripe.String(paymentMethodID) params.Confirm = stripe.Bool(true) } pi, err := paymentintent.New(params) if err != nil { return nil, fmt.Errorf("error creating payment intent: %w", err) } return &models.PaymentIntent{ ID: pi.ID, ClientSecret: pi.ClientSecret, Amount: pi.Amount, Currency: string(pi.Currency), Status: string(pi.Status), }, nil } func (s *StripeClient) HandleWebhook(payload []byte, signature string) error { event, err := webhook.ConstructEvent(payload, signature, s.webhookSecret) if err != nil { return fmt.Errorf("error verifying webhook signature: %w", err) } return s.processStripeEvent(event) } func (s *StripeClient) processStripeEvent(event stripe.Event) error { switch event.Type { case stripe.EventTypePaymentIntentSucceeded: return s.handlePaymentIntentSucceeded(event) case stripe.EventTypePaymentIntentPaymentFailed: return s.handlePaymentIntentFailed(event) // ... other event types default: log.Printf("Unhandled event type: %s", event.Type) return nil } } // Event handlers moved to separate methods func (s *StripeClient) handlePaymentIntentSucceeded(event stripe.Event) error { var pi stripe.PaymentIntent if err := json.Unmarshal(event.Data.Raw, &pi); err != nil { return fmt.Errorf("error parsing PaymentIntent: %w", err) } log.Printf("PaymentIntent %s succeeded!", pi.ID) return nil } func (s *StripeClient) handlePaymentIntentFailed(event stripe.Event) error { var pi stripe.PaymentIntent if err := json.Unmarshal(event.Data.Raw, &pi); err != nil { return fmt.Errorf("error parsing PaymentIntent: %w", err) } log.Printf("PaymentIntent %s failed!", pi.ID) return nil }