123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- 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
- }
|