package channel import ( "fmt" "sync" pkgpay "lone-services/pkg/payment" "lone-services/pkg/payment/alipay" "lone-services/pkg/payment/bank" wxchannel "lone-services/pkg/payment/wechat" "lone-services/pkg/utils" "lone-services/services/payment/internal/config" ) var ( cacheMu sync.Mutex cache = map[string]pkgpay.Channel{} ) func Get(channelCode, clientCode string) (pkgpay.Channel, error) { if channelCode == utils.StringEmpty { return nil, pkgpay.ErrUnsupportedChannel } if clientCode == utils.StringEmpty { clientCode = pkgpay.ClientMiniProgram } cacheKey := channelCode + ":" + clientCode cacheMu.Lock() if ch, ok := cache[cacheKey]; ok { cacheMu.Unlock() return ch, nil } cacheMu.Unlock() ch, err := newChannel(channelCode, clientCode) if err != nil { return nil, err } cacheMu.Lock() cache[cacheKey] = ch cacheMu.Unlock() return ch, nil } func newChannel(channelCode, clientCode string) (pkgpay.Channel, error) { switch channelCode { case pkgpay.ChannelWechat: cfg, err := config.NewWechatPayConfig(clientCode) if err != nil { return nil, err } return wxchannel.NewChannel(cfg) case pkgpay.ChannelAlipay: return alipay.NewChannel(), nil case pkgpay.ChannelBank: return bank.NewChannel(), nil default: return nil, fmt.Errorf("%w: %s", pkgpay.ErrUnsupportedChannel, channelCode) } }