39 lines
1.1 KiB
Go
39 lines
1.1 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 {
|
|||
|
|
return NewMockSMSService(logger), nil
|
|||
|
|
}
|
|||
|
|
p := strings.ToLower(strings.TrimSpace(cfg.Provider))
|
|||
|
|
if p == "" {
|
|||
|
|
p = "tencent"
|
|||
|
|
}
|
|||
|
|
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)
|
|||
|
|
}
|
|||
|
|
}
|