feat(sms): 新增节点短信提醒(审核未通过/被租用需辅助/上架未成交)

This commit is contained in:
yml2213
2026-10-14 14:57:52 +08:00
parent efa0aa4ffd
commit 93e102b7c0
38 changed files with 3228 additions and 70 deletions
+43 -1
View File
@@ -11,7 +11,8 @@ import (
"go.uber.org/zap"
)
func newSMSProvider(cfg config.Config, logger *zap.Logger) smsintegration.Provider {
// 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{
@@ -31,6 +32,47 @@ func newSMSProvider(cfg config.Config, logger *zap.Logger) smsintegration.Provid
}
}
// 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":
+3 -40
View File
@@ -42,7 +42,6 @@ import (
"hfb_sys/backend/internal/modules/withdrawal"
_ "hfb_sys/backend/docs" // Swagger 文档
"hfb_sys/backend/pkg/crypto"
"github.com/gin-gonic/gin"
swaggerFiles "github.com/swaggo/files"
@@ -76,51 +75,15 @@ func New(cfg config.Config, deps Dependencies, logger *zap.Logger) *gin.Engine {
engine.Use(middleware.AdminAwareRateLimitPerMinute(cfg.RateLimit.RequestsPerMinute, deps.Redis, jwtManager))
}
// 业务字段加密器(实名/收款账号):主密钥 + legacy 回退,用于密钥轮换期间透明解出旧密文。
// 业务字段加密器(实名/收款账号/分站短信密钥):主密钥 + legacy 回退,用于密钥轮换期间透明解出旧密文。
// 生产环境必须配置 FIELD_ENCRYPTION_KEY(ValidateProductionSecurity 已校验)。
// 开发/测试缺 FIELD_ENCRYPTION_KEY 时用 legacy 密钥构造单密钥加密器,
// 保证零配置兼容历史硬编码密钥加密的存量密文(非生产 legacy 默认填历史硬编码值)。
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("开发环境使用模拟业务字段加密器")
}
fieldEncryptor := NewFieldEncryptor(cfg, logger)
var userRepo *auth.UserRepository
if deps.DB != nil {
userRepo = auth.NewUserRepository(deps.DB)
}
smsProvider := newSMSProvider(cfg, logger)
smsProvider := NewSMSProvider(cfg, logger)
authService := auth.NewService(userRepo, deps.Redis, jwtManager, smsProvider, logger)
authHandler := auth.NewHandler(authService)
var adminAuthRepo *adminauth.Repository