package agentrecharge import ( "context" "github.com/break/junhong_cmp_fiber/pkg/constants" apperrors "github.com/break/junhong_cmp_fiber/pkg/errors" ) // OnlinePaymentMethodConfigReader 提供代理在线自充允许范围的严格读取能力。 type OnlinePaymentMethodConfigReader interface { GetStrict(ctx context.Context, key string) (string, error) } // OnlinePaymentMethodPolicy 将受控配置值映射为对外可见的线上支付方式集合。 type OnlinePaymentMethodPolicy struct { reader OnlinePaymentMethodConfigReader } // NewOnlinePaymentMethodPolicy 创建代理在线自充允许范围策略。 func NewOnlinePaymentMethodPolicy(reader OnlinePaymentMethodConfigReader) *OnlinePaymentMethodPolicy { return &OnlinePaymentMethodPolicy{reader: reader} } // AllowedMethods 严格读取允许范围;配置缺失使用注册默认值,非法值失败关闭。 func (p *OnlinePaymentMethodPolicy) AllowedMethods(ctx context.Context) ([]string, error) { if p == nil || p.reader == nil { return nil, apperrors.New(apperrors.CodeServiceUnavailable, "代理在线充值允许范围未配置") } value, err := p.reader.GetStrict(ctx, constants.SystemConfigAgentSelfRechargeAllowedMethods) if err != nil { return nil, apperrors.Wrap(apperrors.CodeNoPaymentConfig, err, "读取代理在线充值允许范围失败") } switch value { case constants.AgentSelfRechargeAllowedWechatOnly: return []string{constants.RechargeMethodWechat}, nil case constants.AgentSelfRechargeAllowedAlipayOnly: return []string{constants.RechargeMethodAlipay}, nil case constants.AgentSelfRechargeAllowedBoth: return []string{constants.RechargeMethodWechat, constants.RechargeMethodAlipay}, nil default: return nil, apperrors.New(apperrors.CodeNoPaymentConfig, "代理在线充值允许范围值非法") } } // IsAllowed 判断业务支付方式是否在当前受控允许范围内。 func (p *OnlinePaymentMethodPolicy) IsAllowed(ctx context.Context, method string) error { methods, err := p.AllowedMethods(ctx) if err != nil { return err } for _, allowed := range methods { if allowed == method { return nil } } return apperrors.New(apperrors.CodeNoPaymentConfig, "当前支付方式不在代理在线充值允许范围内") }