Yimaru-BackEnd/internal/services/santimpay/client.go

65 lines
1.5 KiB
Go

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