stripe.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. package billing
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "log"
  6. "git.linuxforward.com/byom/byom-onboard/internal/common/models"
  7. "github.com/stripe/stripe-go/v81"
  8. "github.com/stripe/stripe-go/v81/paymentintent"
  9. "github.com/stripe/stripe-go/v81/webhook"
  10. )
  11. type StripeClient struct {
  12. secretKey string
  13. webhookSecret string
  14. }
  15. func NewStripeClient(secretKey, webhookSecret string) *StripeClient {
  16. stripe.Key = secretKey
  17. return &StripeClient{
  18. secretKey: secretKey,
  19. webhookSecret: webhookSecret,
  20. }
  21. }
  22. func (s *StripeClient) CreatePaymentIntent(amount int64, currency string, paymentMethodID string) (*models.PaymentIntent, error) {
  23. params := &stripe.PaymentIntentParams{
  24. Amount: stripe.Int64(amount),
  25. Currency: stripe.String(currency),
  26. AutomaticPaymentMethods: &stripe.PaymentIntentAutomaticPaymentMethodsParams{
  27. AllowRedirects: stripe.String("never"),
  28. Enabled: stripe.Bool(true),
  29. },
  30. }
  31. if paymentMethodID != "" {
  32. params.PaymentMethod = stripe.String(paymentMethodID)
  33. params.Confirm = stripe.Bool(true)
  34. }
  35. pi, err := paymentintent.New(params)
  36. if err != nil {
  37. return nil, fmt.Errorf("error creating payment intent: %w", err)
  38. }
  39. return &models.PaymentIntent{
  40. ID: pi.ID,
  41. ClientSecret: pi.ClientSecret,
  42. Amount: pi.Amount,
  43. Currency: string(pi.Currency),
  44. Status: string(pi.Status),
  45. }, nil
  46. }
  47. func (s *StripeClient) HandleWebhook(payload []byte, signature string) error {
  48. event, err := webhook.ConstructEvent(payload, signature, s.webhookSecret)
  49. if err != nil {
  50. return fmt.Errorf("error verifying webhook signature: %w", err)
  51. }
  52. return s.processStripeEvent(event)
  53. }
  54. func (s *StripeClient) processStripeEvent(event stripe.Event) error {
  55. switch event.Type {
  56. case stripe.EventTypePaymentIntentSucceeded:
  57. return s.handlePaymentIntentSucceeded(event)
  58. case stripe.EventTypePaymentIntentPaymentFailed:
  59. return s.handlePaymentIntentFailed(event)
  60. // ... other event types
  61. default:
  62. log.Printf("Unhandled event type: %s", event.Type)
  63. return nil
  64. }
  65. }
  66. // Event handlers moved to separate methods
  67. func (s *StripeClient) handlePaymentIntentSucceeded(event stripe.Event) error {
  68. var pi stripe.PaymentIntent
  69. if err := json.Unmarshal(event.Data.Raw, &pi); err != nil {
  70. return fmt.Errorf("error parsing PaymentIntent: %w", err)
  71. }
  72. log.Printf("PaymentIntent %s succeeded!", pi.ID)
  73. return nil
  74. }
  75. func (s *StripeClient) handlePaymentIntentFailed(event stripe.Event) error {
  76. var pi stripe.PaymentIntent
  77. if err := json.Unmarshal(event.Data.Raw, &pi); err != nil {
  78. return fmt.Errorf("error parsing PaymentIntent: %w", err)
  79. }
  80. log.Printf("PaymentIntent %s failed!", pi.ID)
  81. return nil
  82. }