91 lines
3.1 KiB
Go
91 lines
3.1 KiB
Go
package router
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"hfb_sys/backend/internal/config"
|
|
smsintegration "hfb_sys/backend/internal/integrations/sms"
|
|
"hfb_sys/backend/internal/modules/realname"
|
|
"hfb_sys/backend/pkg/crypto"
|
|
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
// NewSMSProvider 构造主站短信通道,供路由装配与后台任务(节点短信派发)共用。
|
|
func NewSMSProvider(cfg config.Config, logger *zap.Logger) smsintegration.Provider {
|
|
switch strings.ToLower(strings.TrimSpace(cfg.SMS.Provider)) {
|
|
case "aliyun":
|
|
provider, err := smsintegration.NewAliyunProvider(smsintegration.AliyunConfig{
|
|
AccessKeyID: cfg.SMS.AliyunAccessKeyID,
|
|
AccessKeySecret: cfg.SMS.AliyunAccessKeySecret,
|
|
Endpoint: cfg.SMS.AliyunEndpoint,
|
|
SignName: cfg.SMS.AliyunSignName,
|
|
LoginTemplateCode: cfg.SMS.AliyunLoginTemplateCode,
|
|
}, logger)
|
|
if err != nil {
|
|
logger.Warn("阿里云短信服务初始化失败", zap.Error(err))
|
|
return smsintegration.NewUnavailableProvider(err)
|
|
}
|
|
return provider
|
|
default:
|
|
return smsintegration.NewMockProvider(logger)
|
|
}
|
|
}
|
|
|
|
// NewFieldEncryptor 构造业务字段加密器(实名、收款账号、分站短信密钥共用)。
|
|
// 主密钥与 legacy 回退并存,保证密钥轮换期间仍能解出旧密文。
|
|
func NewFieldEncryptor(cfg config.Config, logger *zap.Logger) crypto.Encryptor {
|
|
var fieldEncryptor crypto.Encryptor
|
|
primary := cfg.FieldEncryptionKey
|
|
legacy := cfg.FieldEncryptionLegacyKey
|
|
switch {
|
|
case primary != "":
|
|
encryptor, err := crypto.NewFieldEncryptor(primary, legacy)
|
|
if err != nil {
|
|
if config.IsProductionEnv(cfg.AppEnv) {
|
|
logger.Fatal("业务字段加密密钥无效", zap.Error(err))
|
|
}
|
|
logger.Warn("业务字段加密密钥无效,已回退旧密钥", zap.Error(err))
|
|
// primary 非法时退回 legacy 单密钥(若有),否则 MockEncryptor
|
|
if legacy != "" {
|
|
if e, eErr := crypto.NewFieldEncryptor(legacy); eErr == nil {
|
|
fieldEncryptor = e
|
|
}
|
|
}
|
|
} else {
|
|
fieldEncryptor = encryptor
|
|
}
|
|
case legacy != "":
|
|
// 开发态零配置:用 legacy 单密钥,能解历史存量密文。
|
|
encryptor, err := crypto.NewFieldEncryptor(legacy)
|
|
if err == nil {
|
|
fieldEncryptor = encryptor
|
|
logger.Debug("开发环境使用旧业务字段加密密钥")
|
|
}
|
|
}
|
|
if fieldEncryptor == nil {
|
|
if config.IsProductionEnv(cfg.AppEnv) {
|
|
logger.Fatal("业务字段加密密钥未设置")
|
|
}
|
|
fieldEncryptor = &crypto.MockEncryptor{}
|
|
logger.Debug("开发环境使用模拟业务字段加密器")
|
|
}
|
|
return fieldEncryptor
|
|
}
|
|
|
|
func newRealnameProvider(cfg config.Config, encryptor crypto.Encryptor, logger *zap.Logger) realname.Provider {
|
|
switch strings.ToLower(strings.TrimSpace(cfg.Realname.Provider)) {
|
|
case "cloudmarket", "aliyun_cloudmarket":
|
|
provider, err := realname.NewCloudMarketProvider(realname.CloudMarketConfig{
|
|
URL: cfg.Realname.CloudMarketURL, AppCode: cfg.Realname.CloudMarketAppCode, Encryptor: encryptor,
|
|
})
|
|
if err != nil {
|
|
logger.Warn("实名认证服务初始化失败", zap.Error(err))
|
|
return realname.NewUnavailableProvider(err)
|
|
}
|
|
return provider
|
|
default:
|
|
return realname.NewMockProvider(encryptor)
|
|
}
|
|
}
|