43 lines
1.2 KiB
Go
43 lines
1.2 KiB
Go
package sms
|
||
|
||
import (
|
||
"context"
|
||
"fmt"
|
||
"strings"
|
||
|
||
"go.uber.org/zap"
|
||
|
||
"hyapi-server/internal/config"
|
||
)
|
||
|
||
// SMSSender 短信发送抽象(验证码 + 余额预警),支持阿里云与腾讯云等实现。
|
||
type SMSSender interface {
|
||
SendVerificationCode(ctx context.Context, phone, code string) error
|
||
SendBalanceAlert(ctx context.Context, phone string, balance, threshold float64, alertType string, enterpriseName ...string) error
|
||
GenerateCode(length int) string
|
||
}
|
||
|
||
// NewSMSSender 根据 sms.provider 创建实现;mock_enabled 时返回模拟发送器。
|
||
// provider 为空时默认 tencent。
|
||
func NewSMSSender(cfg config.SMSConfig, logger *zap.Logger) (SMSSender, error) {
|
||
if cfg.MockEnabled {
|
||
logger.Info("短信服务使用 Mock 模式,已跳过云厂商发送")
|
||
return NewMockSMSService(logger), nil
|
||
}
|
||
p := strings.ToLower(strings.TrimSpace(cfg.Provider))
|
||
if p == "" {
|
||
p = "tencent"
|
||
}
|
||
|
||
logger.Info("初始化短信服务商", zap.String("provider", p))
|
||
|
||
switch p {
|
||
case "tencent":
|
||
return NewTencentSMSService(cfg, logger)
|
||
case "aliyun", "alicloud", "ali":
|
||
return NewAliSMSService(cfg, logger)
|
||
default:
|
||
return nil, fmt.Errorf("不支持的短信服务商: %s(支持 aliyun、tencent)", cfg.Provider)
|
||
}
|
||
}
|