上一篇开发完成了图形验证码,这一篇来开发短信验证码功能
短信验证码主要要实现两个功能
一、接收图形验证码的id,用户填写的图形验证码,用户的手机号,然后生成一个六位数的随机数写入redis,然后调用短信发送接口发送短信
二、接收手机号和短信验证码返回是否验证通过
model
sms.go
type Sms struct {
Captcha Captcha
Mobile string
}
发送短信验证码需要校验之前的图形验证码,所以model里将之前的图形验证码包含进来
redis.go
var Redis cache.Cache
func init() {
var err error
Redis, err = cache.NewCache("redis", `{"key":"crm","conn":"127.0.0.1:6379"}`)
if err != nil {
fmt.Println(err.Error())
}
}
使用init()方法直接构造一个单例模式,唯一的问题就是redis无法连接时无法将错误抛出去,等以后理解更深了看看有没有什么办法
连接redis时,若不设置key的花,beego会自动设置一个默认的key,非常蛋疼
controller
// @Title Post
// @Description 发送验证码
// @Param body body models.Sms true "手机号和验证码"
// @Success 200 {string} success
// @Failure 400 {string} 图形验证码错误
// @router / [post]
func (c *SmsController) Post() {
var sms models.Sms
json.Unmarshal(c.Ctx.Input.RequestBody, &sms)
if !models.VerifyCaptcha(sms.Captcha.ID, sms.Captcha.B64s) {
c.Data["json"] = "图形验证码错误"
c.Abort("400")
}
rnd := rand.New(rand.NewSource(time.Now().UnixNano()))
vcode := fmt.Sprintf("%06v", rnd.Int31n(1000000))
vcode = "111111" // 测试代码
models.Redis.Put(sms.Mobile, vcode, 10*time.Minute)
// TODO 短信发送
c.Data["json"] = "success"
c.ServeJSON()
}
调用之前写的captcha的方法校验图形验证码
go语言的随机数有点坑,只能从0开始
使用fmt.Sprintf给不足6位的补足六位
调用写的单例将验证码写入redis中
短信运营商暂时还没有确定,此处代码等以后再写
router
beego.NSNamespace("/sms",
beego.NSInclude(
&controllers.SmsController{},
),
),
验证短信验证码的功能会在下一篇登录和注册里开发
网友评论