package payment import ( "context" "encoding/json" "github.com/perfect-panel/ppanel-server/pkg/random" paymentModel "github.com/perfect-panel/ppanel-server/internal/model/payment" "github.com/perfect-panel/ppanel-server/internal/svc" "github.com/perfect-panel/ppanel-server/internal/types" "github.com/perfect-panel/ppanel-server/pkg/logger" "github.com/perfect-panel/ppanel-server/pkg/payment" "github.com/perfect-panel/ppanel-server/pkg/tool" "github.com/perfect-panel/ppanel-server/pkg/xerr" "github.com/pkg/errors" ) type CreatePaymentMethodLogic struct { logger.Logger ctx context.Context svcCtx *svc.ServiceContext } // NewCreatePaymentMethodLogic Create Payment Method func NewCreatePaymentMethodLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CreatePaymentMethodLogic { return &CreatePaymentMethodLogic{ Logger: logger.WithContext(ctx), ctx: ctx, svcCtx: svcCtx, } } func (l *CreatePaymentMethodLogic) CreatePaymentMethod(req *types.CreatePaymentMethodRequest) (resp *types.PaymentConfig, err error) { if payment.ParsePlatform(req.Platform) == payment.UNSUPPORTED { l.Errorw("unsupported payment platform", logger.Field("mark", req.Platform)) return nil, errors.Wrapf(xerr.NewErrCodeMsg(400, "UNSUPPORTED_PAYMENT_PLATFORM"), "unsupported payment platform: %s", req.Platform) } config := parsePaymentPlatformConfig(l.ctx, payment.ParsePlatform(req.Platform), req.Config) var paymentMethod = &paymentModel.Payment{ Name: req.Name, Platform: req.Platform, Icon: req.Icon, Domain: req.Domain, Description: req.Description, Config: config, FeeMode: req.FeeMode, FeePercent: req.FeePercent, FeeAmount: req.FeeAmount, Enable: req.Enable, Token: random.KeyNew(8, 1), } if err := l.svcCtx.PaymentModel.Insert(l.ctx, paymentMethod); err != nil { return nil, errors.Wrapf(xerr.NewErrCode(xerr.DatabaseInsertError), "insert payment method error: %s", err.Error()) } resp = &types.PaymentConfig{} tool.DeepCopy(resp, paymentMethod) var configMap map[string]interface{} _ = json.Unmarshal([]byte(paymentMethod.Config), &configMap) resp.Config = configMap return } func parsePaymentPlatformConfig(ctx context.Context, platform payment.Platform, config interface{}) string { data, err := json.Marshal(config) if err != nil { logger.WithContext(ctx).Errorw("parse payment platform config error", logger.Field("platform", platform), logger.Field("config", config), logger.Field("error", err.Error())) } switch platform { case payment.Stripe: stripe := &paymentModel.StripeConfig{} if err := stripe.Unmarshal(string(data)); err != nil { logger.WithContext(ctx).Errorw("parse stripe config error", logger.Field("config", string(data)), logger.Field("error", err.Error())) } return stripe.Marshal() case payment.AlipayF2F: alipay := &paymentModel.AlipayF2FConfig{} if err := alipay.Unmarshal(string(data)); err != nil { logger.WithContext(ctx).Errorw("parse alipay config error", logger.Field("config", string(data)), logger.Field("error", err.Error())) } return alipay.Marshal() case payment.EPay: epay := &paymentModel.EPayConfig{} if err := epay.Unmarshal(string(data)); err != nil { logger.WithContext(ctx).Errorw("parse epay config error", logger.Field("config", string(data)), logger.Field("error", err.Error())) } return epay.Marshal() case payment.Payssion: payssion := &paymentModel.PayssionConfig{} if err := payssion.Unmarshal(string(data)); err != nil { logger.WithContext(ctx).Errorw("parse payssion config error", logger.Field("config", string(data)), logger.Field("error", err.Error())) } return payssion.Marshal() default: return "" } }