treasurer/internal/service/payment/yandex.go
2024-12-16 16:47:40 +03:00

135 lines
5.2 KiB
Go

package payment
import (
"context"
"go.uber.org/zap"
"gitea.pena/PenaSide/treasurer/internal/errors"
"gitea.pena/PenaSide/treasurer/internal/models"
"gitea.pena/PenaSide/treasurer/internal/models/yandex"
"gitea.pena/PenaSide/treasurer/internal/utils"
)
type YandexPaymentClient interface {
CreatePayment(ctx context.Context, idempotenceKey string, request *yandex.CreatePaymentRequest[yandex.PaymentMethodType]) (*yandex.Payment, errors.Error)
CreatePaymentBankCard(ctx context.Context, idempotenceKey string, request *yandex.CreatePaymentRequest[yandex.PaymentMethodBankCard]) (*yandex.Payment, errors.Error)
CreatePaymentB2B(ctx context.Context, idempotenceKey string, request *yandex.CreatePaymentRequest[yandex.PaymentMethodB2B]) (*yandex.Payment, errors.Error)
}
type YandexPaymentServiceDeps struct {
Logger *zap.Logger
YandexPaymentClient YandexPaymentClient
}
type Yandex struct {
logger *zap.Logger
yandexPaymentClient YandexPaymentClient
}
func NewYandex(deps YandexPaymentServiceDeps) (*Yandex, errors.Error) {
if deps.Logger == nil {
return nil, errors.NewWithMessage("logger is nil on <NewCallbackClient>", errors.ErrInvalidArgs)
}
if deps.YandexPaymentClient == nil {
return nil, errors.NewWithMessage("YandexPaymentClient is nil on <NewCallbackClient>", errors.ErrInvalidArgs)
}
return &Yandex{
logger: deps.Logger,
yandexPaymentClient: deps.YandexPaymentClient,
}, nil
}
func (receiver *Yandex) CreatePaymentBankCard(ctx context.Context, uuid string, request *models.CreatePayment[yandex.Receipt]) (*models.CreatePaymentResult, errors.Error) {
receiver.logger.Info("f<CreatePaymentBankCard> of <YandexPaymentService>", zap.Any("Customer", request.Requisites.Customer), zap.Any("Items",request.Requisites.Items))
yandexPayment, err := receiver.yandexPaymentClient.CreatePaymentBankCard(ctx, uuid, &yandex.CreatePaymentRequest[yandex.PaymentMethodBankCard]{
Amount: yandex.Amount{
Value: utils.ConvertAmountToStringFloat(request.Amount),
Currency: request.Currency,
},
Description: "Пополнение пользовательского баланса платформы Pena Hub",
Receipt: yandex.Receipt{
TaxSystemCode: 2, //https://yookassa.ru/developers/payment-acceptance/receipts/54fz/other-services/parameters-values#tax-systems
Customer: request.Requisites.Customer,
Items: request.Requisites.Items,
},
PaymentMethodData: &yandex.PaymentMethodBankCard{
Type: models.YandexPaymentTypeMap[request.Type],
},
Confirmation: &yandex.CreateConfirmationRedirect{
Type: yandex.ConfirmationTypeRedirect,
Locale: "ru_RU",
ReturnURL: request.ReturnURL,
Enforce: true,
},
Capture: true,
ClientIP: request.ClientIP,
})
if err != nil {
receiver.logger.Error("failed to create payment on <CreatePaymentBankCard> of <YandexPaymentService>", zap.Error(err))
return nil, err
}
return &models.CreatePaymentResult{
Payment: &models.Payment{
UserID: request.UserID,
PaymentID: yandexPayment.ID,
IdempotencePaymentID: uuid,
ClientIP: request.ClientIP,
Currency: request.Currency,
Amount: request.Amount,
Type: request.Type,
Status: models.PaymentStatusMap[string(yandexPayment.Status)],
Completed: false,
RawPaymentBody: yandexPayment,
CallbackHostGRPC: request.CallbackHostGRPC,
},
RedirectURL: yandexPayment.Confirmation.ConfirmationURL,
}, nil
}
func (receiver *Yandex) CreatePayment(ctx context.Context, uuid string, request *models.CreatePayment[yandex.Receipt]) (*models.CreatePaymentResult, errors.Error) {
yandexPayment, err := receiver.yandexPaymentClient.CreatePayment(ctx, uuid, &yandex.CreatePaymentRequest[yandex.PaymentMethodType]{
Amount: yandex.Amount{
Value: utils.ConvertAmountToStringFloat(request.Amount),
Currency: request.Currency,
},
Receipt: yandex.Receipt{
TaxSystemCode: 2, //https://yookassa.ru/developers/payment-acceptance/receipts/54fz/other-services/parameters-values#tax-systems
Customer: request.Requisites.Customer,
Items: request.Requisites.Items,
},
PaymentMethodData: &yandex.PaymentMethodType{Type: models.YandexPaymentTypeMap[request.Type]},
Confirmation: &yandex.CreateConfirmationRedirect{
Type: yandex.ConfirmationTypeRedirect,
Locale: "ru_RU",
ReturnURL: request.ReturnURL,
Enforce: true,
},
Capture: true,
ClientIP: request.ClientIP,
})
if err != nil {
receiver.logger.Error("failed to create payment on <CreatePayment> of <YandexPaymentService>", zap.Error(err))
return nil, err
}
return &models.CreatePaymentResult{
Payment: &models.Payment{
UserID: request.UserID,
PaymentID: yandexPayment.ID,
IdempotencePaymentID: uuid,
ClientIP: request.ClientIP,
Currency: request.Currency,
Amount: request.Amount,
Type: request.Type,
Status: models.PaymentStatusMap[string(yandexPayment.Status)],
Completed: false,
RawPaymentBody: yandexPayment,
CallbackHostGRPC: request.CallbackHostGRPC,
},
RedirectURL: yandexPayment.Confirmation.ConfirmationURL,
}, nil
}