mirror of
https://github.com/yangjian102621/geekai.git
synced 2025-11-05 00:33:47 +08:00
feat: 添加支持多个短信服务商支持 添加短信宝服务商支持,同时添加配置示例
This commit is contained in:
53
api/service/sms/aliyun_sms_service.go
Normal file
53
api/service/sms/aliyun_sms_service.go
Normal file
@@ -0,0 +1,53 @@
|
||||
package sms
|
||||
|
||||
import (
|
||||
"chatplus/core/types"
|
||||
"fmt"
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/services/dysmsapi"
|
||||
)
|
||||
|
||||
type AliYunSmsService struct {
|
||||
config *types.AliYunSmsConfig
|
||||
client *dysmsapi.Client
|
||||
}
|
||||
|
||||
func NewAliYunSmsService(appConfig *types.AppConfig) (*AliYunSmsService, error) {
|
||||
config := &appConfig.SMS.ALI
|
||||
// 创建阿里云短信客户端
|
||||
client, err := dysmsapi.NewClientWithAccessKey(
|
||||
"cn-hangzhou",
|
||||
config.AccessKey,
|
||||
config.AccessSecret)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to create client: %v", err)
|
||||
}
|
||||
|
||||
return &AliYunSmsService{
|
||||
config: config,
|
||||
client: client,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (s *AliYunSmsService) SendVerifyCode(mobile string, code int) error {
|
||||
// 创建短信请求并设置参数
|
||||
request := dysmsapi.CreateSendSmsRequest()
|
||||
request.Scheme = "https"
|
||||
request.Domain = s.config.Domain
|
||||
request.PhoneNumbers = mobile
|
||||
request.SignName = s.config.Sign
|
||||
request.TemplateCode = s.config.CodeTempId
|
||||
request.TemplateParam = fmt.Sprintf("{\"code\":\"%d\"}", code) // 短信模板中的参数
|
||||
|
||||
// 发送短信
|
||||
response, err := s.client.SendSms(request)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to send SMS:%v", err)
|
||||
}
|
||||
|
||||
if response.Code != "OK" {
|
||||
return fmt.Errorf("failed to send SMS:%v", response.Message)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
var _ SmsService = &AliYunSmsService{}
|
||||
5
api/service/sms/sms_service.go
Normal file
5
api/service/sms/sms_service.go
Normal file
@@ -0,0 +1,5 @@
|
||||
package sms
|
||||
|
||||
type SmsService interface {
|
||||
SendVerifyCode(mobile string, code int) error
|
||||
}
|
||||
39
api/service/sms/sms_service_manager.go
Normal file
39
api/service/sms/sms_service_manager.go
Normal file
@@ -0,0 +1,39 @@
|
||||
package sms
|
||||
|
||||
import (
|
||||
"chatplus/core/types"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type SmsServiceManager struct {
|
||||
handler SmsService
|
||||
}
|
||||
|
||||
const Ali = "Ali"
|
||||
const SmsBao = "SmsBao"
|
||||
|
||||
func NewSendServiceManager(config *types.AppConfig) (*SmsServiceManager, error) {
|
||||
active := SmsBao
|
||||
if config.OSS.Active != "" {
|
||||
active = strings.ToUpper(config.SMS.Active)
|
||||
}
|
||||
var handler SmsService
|
||||
switch active {
|
||||
case Ali:
|
||||
client, err := NewAliYunSmsService(config)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
handler = client
|
||||
break
|
||||
case SmsBao:
|
||||
handler = NewSmsBaoSmsService(config)
|
||||
break
|
||||
}
|
||||
|
||||
return &SmsServiceManager{handler: handler}, nil
|
||||
}
|
||||
|
||||
func (m *SmsServiceManager) GetUploadHandler() SmsService {
|
||||
return m.handler
|
||||
}
|
||||
86
api/service/sms/smsbao_sms_service.go
Normal file
86
api/service/sms/smsbao_sms_service.go
Normal file
@@ -0,0 +1,86 @@
|
||||
package sms
|
||||
|
||||
import (
|
||||
"chatplus/core/types"
|
||||
logger2 "chatplus/logger"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var logger = logger2.GetLogger()
|
||||
|
||||
type SmsBaoSmsService struct {
|
||||
config *types.SmsBaoSmsConfig
|
||||
}
|
||||
|
||||
func NewSmsBaoSmsService(appConfig *types.AppConfig) *SmsBaoSmsService {
|
||||
return &SmsBaoSmsService{
|
||||
config: &appConfig.SMS.SMSBAO,
|
||||
}
|
||||
}
|
||||
|
||||
var statusStr = map[string]string{
|
||||
"0": "短信发送成功",
|
||||
"-1": "参数不全",
|
||||
"-2": "服务器空间不支持,请确认支持curl或者fsocket,联系您的空间商解决或者更换空间",
|
||||
"30": "密码错误",
|
||||
"40": "账号不存在",
|
||||
"41": "余额不足",
|
||||
"42": "账户已过期",
|
||||
"43": "IP地址限制",
|
||||
"50": "内容含有敏感词",
|
||||
}
|
||||
|
||||
func (s *SmsBaoSmsService) SendVerifyCode(mobile string, code int) error {
|
||||
|
||||
content := fmt.Sprintf("%s%s", s.config.Sign, s.config.CodeTemplate)
|
||||
template := replaceTemplate(content, s.config.Num, code)
|
||||
|
||||
md5Hash := s.config.ApiKey
|
||||
params := url.Values{}
|
||||
params.Set("u", s.config.Account)
|
||||
params.Set("p", md5Hash)
|
||||
params.Set("m", mobile)
|
||||
params.Set("c", template)
|
||||
|
||||
// 判断 s.config.Domain 是否为空
|
||||
if s.config.Domain == "" {
|
||||
// 设置默认值
|
||||
s.config.Domain = "api.smsbao.com"
|
||||
// 记录日志,提醒用户默认值被使用
|
||||
logger.Infof("SmsBao.config.Domain is empty. Using default value: %s", s.config.Domain)
|
||||
}
|
||||
real_url := fmt.Sprintf("https://%s/sms?", s.config.Domain)
|
||||
sendURL := real_url + params.Encode()
|
||||
logger.Infof("send SmsBao content: %v", template)
|
||||
|
||||
response, err := http.Get(sendURL)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer response.Body.Close()
|
||||
|
||||
body, err := ioutil.ReadAll(response.Body)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
result := string(body)
|
||||
logger.Infof("send SmsBao result: %v", statusStr[result])
|
||||
|
||||
if result != "0" {
|
||||
return fmt.Errorf("failed to send SMS:%v", statusStr[result])
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func replaceTemplate(template, num string, code int) string {
|
||||
result := strings.ReplaceAll(template, "{code}", strconv.Itoa(code))
|
||||
result = strings.ReplaceAll(result, "{num}", num)
|
||||
return result
|
||||
}
|
||||
|
||||
var _ SmsService = &SmsBaoSmsService{}
|
||||
Reference in New Issue
Block a user