63 lines
1.3 KiB
Go
63 lines
1.3 KiB
Go
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)
|
|
}
|
|
}
|