Go微服务扩展(Redis + Elasticsearch)
原创大约 2 分钟
环境和脚本
> go get -u github.com/go-redis/redis/v8
> go get -u github.com/aliyun/alibaba-cloud-sdk-go/services/dysmsapi
在Gin服务接口中增加验证表单
package forms
type SendSmsForm struct {
Mobile string `form:"mobile" json:"mobile" binding:"required,mobile,min=11,max=11"`
Type uint `form:"type" json:"type" binding:"required,oneof=1 2"`
}
在Gin服务接口中配置结构体
package config
type AliSmsConfig struct {
ApiKey string `mapstructure:"key" json:"key"`
ApiSecrect string `mapstructure:"secrect" json:"secrect"`
}
type RedisConfig struct {
Host string `mapstructure:"host" json:"host"`
Port int `mapstructure:"port" json:"port"`
Password string `mapstructure:"password" json:"password"`
}
type ServerConfig struct {
Env string `mapstructure:"env" json:"env"`
Name string `mapstructure:"name" json:"name"`
Host string `mapstructure:"host" json:"host"`
Port int `mapstructure:"port" json:"port"`
AliSmsInfo AliSmsConfig `mapstructure:"sms" json:"sms"`
RedisInfo RedisConfig `mapstructure:"redis" json:"redis"`
......
}
修改Gin服务接口
用户相关接口。
package api
......
// Register 用户注册
func Register(ctx *gin.Context) {
......
// 短信验证码
rdb := redis.NewClient(&redis.Options{
Addr: fmt.Sprintf("%s:%d", global.ServerConfig.RedisInfo.Host, global.ServerConfig.RedisInfo.Port),
})
smsCode, err2 := rdb.Get(ctx.Request.Context(), registerForm.Username).Result()
if errors.Is(err2, redis.Nil) {
zap.S().Infof("验证码已失效")
ctx.JSON(http.StatusNotFound, gin.H{
"code": http.StatusNotFound,
"msg": "验证码已失效",
"data": gin.H{},
})
return
} else {
if err2 != nil || smsCode != registerForm.Code {
zap.S().Infof("验证码错误")
ctx.JSON(http.StatusForbidden, gin.H{
"code": http.StatusForbidden,
"msg": "验证失败",
"data": gin.H{},
})
return
}
}
......
}
......
系统相关接口。
package api
......
// SendSms 发送短信验证码
func SendSms(ctx *gin.Context) {
// 表单验证
sendSmsForm := forms.SendSmsForm{}
if err := ctx.ShouldBind(&sendSmsForm); err != nil {
HandleValidateError(ctx, err)
return
}
// 发送短信
client, err1 := dysmsapi.NewClientWithAccessKey("cn-beijing", global.ServerConfig.AliSmsInfo.ApiKey, global.ServerConfig.AliSmsInfo.ApiSecrect)
if err1 != nil {
zap.S().Errorf("连接短信服务失败:%s", err1.Error())
return
}
smsCode := GenerateSmsCode(6)
request := requests.NewCommonRequest()
request.Method = "POST"
request.Scheme = "https"
request.Domain = "dysmsapi.aliyuncs.com"
request.Version = "2017-05-25"
request.ApiName = "SendSms"
request.QueryParams["RegionId"] = "cn-beijing"
request.QueryParams["PhoneNumbers"] = sendSmsForm.Mobile // 手机号
request.QueryParams["SignName"] = "XXXX" // 阿里云验证过的项目名
request.QueryParams["TemplateCode"] = "SMS_181850725" // 阿里云的短信模板号
request.QueryParams["TemplateParam"] = "{\"code\":" + smsCode + "}" // 短信模板中的验证码内容
response, err2 := client.ProcessCommonRequest(request)
fmt.Print(client.DoAction(request, response))
if err2 != nil {
zap.S().Errorf("发送验证码失败:%s", err2.Error())
return
}
// 将验证码保存起来
rdb := redis.NewClient(&redis.Options{
Addr: fmt.Sprintf("%s:%d", global.ServerConfig.RedisInfo.Host, global.ServerConfig.RedisInfo.Port),
})
rdb.Set(context.Background(), sendSmsForm.Mobile, smsCode, time.Duration(global.ExpiredTime)*time.Second)
ctx.JSON(http.StatusOK, gin.H{
"code": http.StatusOK,
"msg": "验证码发送成功",
"data": gin.H{},
})
}
感谢支持
更多内容,请移步《超级个体》。