package santimpay import ( "fmt" "time" "github.com/SamuelTariku/FortuneBet-Backend/internal/config" "github.com/SamuelTariku/FortuneBet-Backend/internal/domain" "github.com/golang-jwt/jwt/v5" ) type SantimPayClient interface { GenerateSignedToken(payload domain.SantimTokenPayload) (string, error) CheckTransactionStatus(id string) } type santimClient struct { cfg *config.Config } func NewSantimPayClient(cfg *config.Config) SantimPayClient { return &santimClient{ cfg: cfg, } } func (c *santimClient) GenerateSignedToken(payload domain.SantimTokenPayload) (string, error) { now := time.Now().Unix() claims := jwt.MapClaims{ "amount": payload.Amount, "paymentReason": payload.Reason, "merchantId": c.cfg.SANTIMPAY.MerchantID, "generated": now, } // Optional fields if payload.PaymentMethod != "" { claims["paymentMethod"] = payload.PaymentMethod } if payload.PhoneNumber != "" { claims["phoneNumber"] = payload.PhoneNumber } token := jwt.NewWithClaims(jwt.SigningMethodES256, claims) privateKey, err := jwt.ParseECPrivateKeyFromPEM([]byte(c.cfg.SANTIMPAY.SecretKey)) if err != nil { return "", fmt.Errorf("invalid private key: %w", err) } signedToken, err := token.SignedString(privateKey) if err != nil { return "", fmt.Errorf("signing failed: %w", err) } return signedToken, nil } func (c *santimClient) CheckTransactionStatus(id string) { // optional async checker — can log or poll transaction status fmt.Println("Checking transaction status for:", id) }