2024-08-04 01:16:25 +07:00

86 lines
2.0 KiB
Go

package mdtrns
import (
"fmt"
"furtuna-be/internal/common/logger"
"furtuna-be/internal/entity"
"log"
"strconv"
"github.com/veritrans/go-midtrans"
)
type MidtransConfig interface {
MidtransServerKey() string
MidtransClientKey() string
MidtranEnvType() int
}
type ClientService struct {
client midtrans.Client
midtransConfig MidtransConfig
}
func New(midtransConfig MidtransConfig) *ClientService {
midclient := midtrans.NewClient()
midclient.ServerKey = midtransConfig.MidtransServerKey()
midclient.ClientKey = midtransConfig.MidtransClientKey()
midclient.APIEnvType = midtrans.EnvironmentType(midtransConfig.MidtranEnvType())
return &ClientService{
client: midclient,
midtransConfig: midtransConfig,
}
}
func (c *ClientService) CreatePayment(order entity.MidtransRequest) (*entity.MidtransResponse, error) {
var snapGateway midtrans.SnapGateway
snapGateway = midtrans.SnapGateway{
Client: c.client,
}
paymentMethod := []midtrans.PaymentType{}
if order.PaymentMethod == "GOPAY" {
paymentMethod = append(paymentMethod, midtrans.SourceGopay)
}
snapReq := &midtrans.SnapReq{
EnabledPayments: paymentMethod,
TransactionDetails: midtrans.TransactionDetails{
OrderID: order.PaymentReferenceID,
GrossAmt: order.TotalAmount,
},
}
log.Println("GetToken:")
snapTokenResp, err := snapGateway.GetToken(snapReq)
if err != nil {
logger.GetLogger().Error(fmt.Sprintf("error when create midtrans payment %v", err))
return nil, err
}
return &entity.MidtransResponse{
Token: snapTokenResp.Token,
RedirectURL: snapTokenResp.RedirectURL,
}, nil
}
func (c ClientService) getProductItems(products []entity.OrderItem) []midtrans.ItemDetail {
var items []midtrans.ItemDetail
for _, product := range products {
item := midtrans.ItemDetail{
ID: strconv.FormatInt(product.ID, 10),
Name: product.ItemType,
Qty: int32(product.Quantity),
Price: int64(product.Price),
}
items = append(items, item)
}
return items
}